NVD3 折线图在 x 轴上使用日期时间时错误地与网格对齐
NVD3 Line chart tics wrongly aligned to grid when using datetype on xAxis
我目前正在使用 Angular 指令 (angular-nvd3) 使用 NVD3。我有一个非常简单的折线图和非常简单的数据。
我现在遇到的问题是我的数据错误地与轴对齐。 此处提供示例 plunker:http://plnkr.co/edit/jWEYt6?p=preview ,
我在我的 xAxis 上使用日期,它是使用 d3 库解析的:
tickFormat: function(d) {return d3.time.format('%d/%m')(new Date(d))}
描述:
我希望 xAxis 标签与网格相对应。
在示例中,您可以清楚地注意到 xAxis 不是平均分配的(值:06/11、08/11、11/11、13/11)。所以通常是 2 天,有时是 3 天:)
更糟糕的是 - 峰与网格不匹配。示例:06/11 刻度实际上什至不接近网格线,我猜它应该是。
我也在回购的 master's
代码上尝试过这个,它也发生在那里。 HTML 头部部分有一个 link。
我的数据、正确的日期格式或其他问题是否有问题?谢谢!
这困扰了我一段时间,我在这里找不到答案。我什至在 GitHub 上打开了一个错误:https://github.com/novus/nvd3/issues/1382#issuecomment-160694559 我得到了答案。
问题:
由于d3.time.format('%d/%m')
,实际问题被隐藏了。我的示例数据以每天一次的方式给出,并相应地设置了格式。但是 d3
不明白这一点。绘制网格时,它会划分 max-min/someValue
并且网格刻度不必在全天(午夜)发生,而是在任何时间发生。由于格式原因我看不到。
显示这种误解的版本在这里:http://plnkr.co/edit/2iMHOp?p=preview
解法:
所以现在,当我知道我能做什么时,我设法通过使用 nvd3 / angular 包装器中的 tickValues
参数来替换刻度。
带有解决方案的版本在这里:
http://plnkr.co/edit/23n3ll?p=preview
又一个错误:)
有趣的是,由于标签太长无法显示,我不得不旋转它们以适合它们。另一个错误发生在这里(我认为)。如您所见,2nd 和 last 但缺少一个 刻度标签。首先,我尝试使用此处提到的解决方案:NVD3 Line Chart X Axis Ticks Are Missing 使用 showMaxMin
参数,但它无法正常工作。但是,如果将标签旋转到 ~ -70
度,则标签显示正常。
我想我的 NVD3 之旅还没有结束 ;)
既然问题是,据Atais说:
The actual issue is hidden because of d3.time.format('%d/%m'). My example data is given in one tick per day manner, and the format was set accordingly. But d3 does not understand that. When drawing the grid it divides the max-min/someValue and the grid ticks does not have to occur on full day (midnight), but on any hour. And because of the formatting I could not see that.
我设法将 x 的值作为 整数值 (例如:20160211)而不是格式化日期(例如:2016-02-11 或类似日期)传递给 nvd3,然后on tickFormat
格式化它们以正确显示。
我写了另一个 plunker 来解决问题和评论的解决方案(使用 momentjs):
具有模拟错误的 Plunker:http://plnkr.co/edit/fXDQ0f?p=preview
数据以 x: milliseconds, y: int
格式提供,如 {x: 1446418800000, y: 20},
并且格式为 tickFormat
:
xAxis: {
tickFormat: function(d) {
return moment(d).format('YYYY-MM-DD');
}
}
Plunker 的解决方案:http://plnkr.co/edit/KpALzo?p=preview
数据以 x: int, y: int
格式提供,如 {x: 20160211, y: 20},
并且格式为 tickFormat
:
xAxis: {
tickFormat: function(d) {
moment(d, 'YYYYMMDD').format('YYYY-MM-DD');
}
}
请注意,您也可以随时间执行此操作,只需附加到 'numeric date'。
如@ajaybc 所述,不适用于不同月份的日期,因为 d3 将使用无效的填充日期(第 32、33、34 天等)插入 X 轴
我目前正在使用 Angular 指令 (angular-nvd3) 使用 NVD3。我有一个非常简单的折线图和非常简单的数据。
我现在遇到的问题是我的数据错误地与轴对齐。 此处提供示例 plunker:http://plnkr.co/edit/jWEYt6?p=preview ,
我在我的 xAxis 上使用日期,它是使用 d3 库解析的:
tickFormat: function(d) {return d3.time.format('%d/%m')(new Date(d))}
描述:
我希望 xAxis 标签与网格相对应。
在示例中,您可以清楚地注意到 xAxis 不是平均分配的(值:06/11、08/11、11/11、13/11)。所以通常是 2 天,有时是 3 天:)
更糟糕的是 - 峰与网格不匹配。示例:06/11 刻度实际上什至不接近网格线,我猜它应该是。
我也在回购的 master's
代码上尝试过这个,它也发生在那里。 HTML 头部部分有一个 link。
我的数据、正确的日期格式或其他问题是否有问题?谢谢!
这困扰了我一段时间,我在这里找不到答案。我什至在 GitHub 上打开了一个错误:https://github.com/novus/nvd3/issues/1382#issuecomment-160694559 我得到了答案。
问题:
由于d3.time.format('%d/%m')
,实际问题被隐藏了。我的示例数据以每天一次的方式给出,并相应地设置了格式。但是 d3
不明白这一点。绘制网格时,它会划分 max-min/someValue
并且网格刻度不必在全天(午夜)发生,而是在任何时间发生。由于格式原因我看不到。
显示这种误解的版本在这里:http://plnkr.co/edit/2iMHOp?p=preview
解法:
所以现在,当我知道我能做什么时,我设法通过使用 nvd3 / angular 包装器中的 tickValues
参数来替换刻度。
带有解决方案的版本在这里:
http://plnkr.co/edit/23n3ll?p=preview
又一个错误:)
有趣的是,由于标签太长无法显示,我不得不旋转它们以适合它们。另一个错误发生在这里(我认为)。如您所见,2nd 和 last 但缺少一个 刻度标签。首先,我尝试使用此处提到的解决方案:NVD3 Line Chart X Axis Ticks Are Missing 使用 showMaxMin
参数,但它无法正常工作。但是,如果将标签旋转到 ~ -70
度,则标签显示正常。
我想我的 NVD3 之旅还没有结束 ;)
既然问题是,据Atais说:
The actual issue is hidden because of d3.time.format('%d/%m'). My example data is given in one tick per day manner, and the format was set accordingly. But d3 does not understand that. When drawing the grid it divides the max-min/someValue and the grid ticks does not have to occur on full day (midnight), but on any hour. And because of the formatting I could not see that.
我设法将 x 的值作为 整数值 (例如:20160211)而不是格式化日期(例如:2016-02-11 或类似日期)传递给 nvd3,然后on tickFormat
格式化它们以正确显示。
我写了另一个 plunker 来解决问题和评论的解决方案(使用 momentjs):
具有模拟错误的 Plunker:http://plnkr.co/edit/fXDQ0f?p=preview
数据以 x: milliseconds, y: int
格式提供,如 {x: 1446418800000, y: 20},
并且格式为 tickFormat
:
xAxis: {
tickFormat: function(d) {
return moment(d).format('YYYY-MM-DD');
}
}
Plunker 的解决方案:http://plnkr.co/edit/KpALzo?p=preview
数据以 x: int, y: int
格式提供,如 {x: 20160211, y: 20},
并且格式为 tickFormat
:
xAxis: {
tickFormat: function(d) {
moment(d, 'YYYYMMDD').format('YYYY-MM-DD');
}
}
请注意,您也可以随时间执行此操作,只需附加到 'numeric date'。
如@ajaybc 所述,不适用于不同月份的日期,因为 d3 将使用无效的填充日期(第 32、33、34 天等)插入 X 轴