更改 dc.js 散点图 Y 轴标签上文本的数值
Changing number values for text on Y Axis label for dc.js ScatterPlot
我有一个散点图,它在我的 X 轴上绘制每个日期的唯一事件,并在 Y 轴上绘制它们在每一天的第二个发生时间。
为了实现这一点,我获取了用于 X 轴的日期数据,并通过一个函数 运行 输出事件发生当天的确切秒数(0 到 86400) .从这个意义上讲,我的 Y 轴从 0 秒变为 86400 秒。
这让我可以在图表上将每个点甚至唯一地表示为一个点,精确到秒。
我对图表的结果非常满意:
唯一的问题是我的 Y 标签从 0 到 86400。我想将文本更改为熟悉的 HH AM/PM 格式,也许类似于“0 到 23”,即:如果(y 值 = 3600)return“凌晨 1 点”。
我的散点图是这样的:
scatterPlot
.width(window.innerWidth-100)
.height(window.innerHeight/2)
.x(d3.time.scale().domain([minDate, maxDate]))
.brushOn(false)
.mouseZoomable(true)
// .title(function (d) {
// return "Event: " + d['text'];
// })
.clipPadding(5)
.yAxisLabel("Hour of the day")
.elasticY(true)
.dimension(eventsByDateAndHourDim)
.group(eventsByDateAndHourGroup);
我试过这样做:
scatterPlot.yAxis().tickFormat(function (d) {
if (domain = 43200)
return "12 PM";
})
但这只会将所有标签更改为“12 PM”。我不确定如何引用我的 Y 域的实际值。
我尝试使用组 "if (eventsByDateAndHourGroup = 43200)...",但也没有用。
传递给tickFormat()
method函数的参数是需要格式化的Y坐标
所以你应该可以做类似
的事情
scatterPlot.yAxis().tickFormat(function (d) {
var hour = Math.floor(d/3600),
pm = hour > 11;
if(pm) hour -= 12;
if(hour === 0) hour = 12;
return String(hour) + (pm ? ' PM' : ' AM');
});
或者您可以使用 d3.time.format.utc
以获得更强大、更优雅的解决方案:
var hourFormat = d3.time.format.utc('%I %p');
scatterPlot.yAxis().tickFormat(function (d) {
var date = new Date(d*1000);
return hourFormat(date);
});
这有点低效,因为 Date
对象很慢,但处理十几个报价可能无关紧要。
我有一个散点图,它在我的 X 轴上绘制每个日期的唯一事件,并在 Y 轴上绘制它们在每一天的第二个发生时间。
为了实现这一点,我获取了用于 X 轴的日期数据,并通过一个函数 运行 输出事件发生当天的确切秒数(0 到 86400) .从这个意义上讲,我的 Y 轴从 0 秒变为 86400 秒。
这让我可以在图表上将每个点甚至唯一地表示为一个点,精确到秒。
我对图表的结果非常满意:
唯一的问题是我的 Y 标签从 0 到 86400。我想将文本更改为熟悉的 HH AM/PM 格式,也许类似于“0 到 23”,即:如果(y 值 = 3600)return“凌晨 1 点”。
我的散点图是这样的:
scatterPlot
.width(window.innerWidth-100)
.height(window.innerHeight/2)
.x(d3.time.scale().domain([minDate, maxDate]))
.brushOn(false)
.mouseZoomable(true)
// .title(function (d) {
// return "Event: " + d['text'];
// })
.clipPadding(5)
.yAxisLabel("Hour of the day")
.elasticY(true)
.dimension(eventsByDateAndHourDim)
.group(eventsByDateAndHourGroup);
我试过这样做:
scatterPlot.yAxis().tickFormat(function (d) {
if (domain = 43200)
return "12 PM";
})
但这只会将所有标签更改为“12 PM”。我不确定如何引用我的 Y 域的实际值。
我尝试使用组 "if (eventsByDateAndHourGroup = 43200)...",但也没有用。
传递给tickFormat()
method函数的参数是需要格式化的Y坐标
所以你应该可以做类似
的事情scatterPlot.yAxis().tickFormat(function (d) {
var hour = Math.floor(d/3600),
pm = hour > 11;
if(pm) hour -= 12;
if(hour === 0) hour = 12;
return String(hour) + (pm ? ' PM' : ' AM');
});
或者您可以使用 d3.time.format.utc
以获得更强大、更优雅的解决方案:
var hourFormat = d3.time.format.utc('%I %p');
scatterPlot.yAxis().tickFormat(function (d) {
var date = new Date(d*1000);
return hourFormat(date);
});
这有点低效,因为 Date
对象很慢,但处理十几个报价可能无关紧要。