x轴喜欢在日期有限的情况下重复日期。请看这个小提琴:
http://jsfiddle.net/skilesare/bFfJ2/1/
nv.addGraph(function() {
var data = fakeActivityByDate();
var chart = nv.models.lineChart();
chart.xAxis
.axisLabel('Date')
.rotateLabels(-45)
.tickFormat(function(d) { return d3.time.format('%b %d')(new Date(d)); });
chart.yAxis
.axisLabel('Activity')
.tickFormat(d3.format('d'));
d3.select('#chart svg')
.datum(data)
.transition().duration(500)
.call(chart);
nv.utils.windowResize(function() { d3.select('#chart svg').call(chart) });
return chart;
});
function days(num) {
return num*60*60*1000*24
}
/**************************************
* Simple test data generator
*/
function fakeActivityByDate() {
var lineData = [];
var y=0;
var start_date = new Date() - days(365); // one year ago
for (var i = 0; i < 4; i++) {
lineData.push({x: new Date(start_date + days(i)), y: y});
y=y+Math.floor((Math.random()*10)-3);
}
return [
{
values: lineData,
key: 'Activity',
color: '#ff7f0e'
}
];
}`
如果您的屏幕足够宽,您会看到重复的日期。如果你对窗口进行平铺,问题就会消失。
答案 0 :(得分:5)
这个问题与屏幕尺寸无关,因为它也可能出现在这样的情况下:你只有3天的时间来显示,而不是3个刻度,你会得到6或10或其他(事实上,这正是你的情况)如果我看你的jsfiddle)。确实,nvd3使用这样的东西来设置刻度的尺寸(看看axis.js):
if (ticks !== null)
axis.ticks(ticks);
else if (axis.orient() == 'top' || axis.orient() == 'bottom')
axis.ticks(Math.abs(scale.range()[1] - scale.range()[0]) / 100);
这个问题有几种解决方案:
您要么实现自己的轴组件并替换nvd3 轴
您可以直接修改nvd3的轴组件并添加一些 然后将专门用于此场景的设置 正在描述(你会注意到,因为它是高度的nvd3 可定制)。
Hack:你使用 d3的拥有 tickValues()并传递一个数组,其中包含你的日期 想拥有屏幕(例如:第一个日期,最后一个日期和 由算法计算的几个日期之间)。请参阅d3的文档:https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-tickValues。根据情况(您想要修改的轴和哪个图表),您不仅需要注释我粘贴的代码并添加用于将tickValues设置为图表组件的算法(例如lineChart),而且还需要添加tickValues的setter,用你的值覆盖值。
答案 1 :(得分:2)
迟到的回复,但可能对其他人有用。我使用一种解决方法来消除重复的刻度,通过维护一组已经应用的刻度和&amp; d3的多格式说明符。
uniqueTicks = [];
xTickFormat = d3.time.format.multi([
["%Y", function (d) {
// If tick not applied yet
if (uniqueTicks.indexOf(d.getFullYear()) === -1) {
uniqueTicks.push(d.getFullYear());
return true;
} else {
return false;
}
}],
["", function () {
return true;
}]
]);
d3.svg.axis().tickFormat(xTickFormat );
这个技巧可以针对任何其他类型的刻度格式进行调整。