d3.js - 当我在 nvd3 图表上有少量日期时,如何防止刻度线重复

标签 d3.js nvd3.js

当日期数量有限时,x 轴喜欢重复日期。请看这个 fiddle :

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'
     }
   ];
 }`

如果您的屏幕足够宽,您会看到重复的日期。如果你挤压 window ,问题就会消失。

最佳答案

问题与屏幕大小无关,因为它也可能出现在这样的情况下:您只有 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
    可定制)。
  • 黑客:您使用 d3 自己的 tickValues() 并将您的日期传递给它
    想要在屏幕上显示(例如:第一次约会、最后一次约会和
    由您的算法计算出的几个日期)。请参阅 d3 的文档:https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-tickValues .根据情况(您要修改哪个轴和哪个图表),您不仅需要注释我粘贴给您的代码并添加用于将 tickValues 设置为图表组件(例如 lineChart)的算法,而且您还需要添加tickValues 的 setter 并用您的值覆盖这些值。
  • 关于d3.js - 当我在 nvd3 图表上有少量日期时,如何防止刻度线重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14799511/

    相关文章:

    javascript - 使用 d3.js 的 svg View 框 : space above graph is still too large

    javascript - 为 D3 Force Directed 格式化 JSON 的最佳方式

    d3.js - NVD3折线图未捕获的TypeError : Cannot read property 'x' of undefined

    javascript - d3.js nvd3.js — 获取 y 轴最小/最大值

    javascript - 不是 nvd3 或 d3 的默认 json 格式

    javascript - 饼图不适用于使用 AngularJS 和 nvd3 的 Json 数据

    d3.js - 工具提示显示在两个单独的行中,在 Firefox 中不起作用

    javascript - d3 text-wrap 插件更改坐标

    javascript - d3js 箭头不显示

    javascript - nvd3 在 x 轴上重复月份