【问题标题】:D3 Issues with time scale, calculating the position of itemsD3 时间尺度问题,计算项目的位置
【发布时间】:2023-03-10 14:15:01
【问题描述】:

我正在制作一个在 x 轴上使用时间刻度的条形图。

每个条形代表一个月,因此所有日期都设置为 YYYY-MM,当我加载数据时,我会使用:

var parseDate = d3.time.format("%Y-%m").parse;

问题在于每个月的天数不同,一些条形图比其他条形图更接近,而不是具有相同的边距,如您在此屏幕截图中所见:

你可以在这里找到代码,http://tributary.io/inlet/8700564

谢谢

【问题讨论】:

  • y轴上的数据是什么?根据它是什么,我们可以标准化每个元素的宽度。例如某个月 X 发生了多少次。
  • 这个月的销售额。每个月只有一个酒吧。
  • 由于月份中的天数无关紧要,因此只需将每个条形的宽度设置为某个静态值。例如,它们都可以是 40 像素。更改第 124 行:var barWidth = 40; 并且它们的宽度都相同。 tributary.io/inlet/8716416
  • 但问题不在于条形宽度。它是动态的,因为它有 3 个显示 7 12 或 30 条的过滤器,所以我根据图表宽度/条数计算宽度。问题是由于月份之间的天数不同,它们之间的空间宽度不同。此外,在您的代码中,您可以看到所有条形都非常接近,但最后一个有一个空格。

标签: javascript d3.js data-visualization graph-visualization


【解决方案1】:

您有两个选择:或者使用序数(类别)刻度作为 x 轴,这将使所有条形具有相同的宽度,或者根据月份的长度单独设置每个条形的宽度。

要计算月份的长度,您可以使用d3 time intervals 来获取下个月的开始日期。那么宽度就是 xScale 上两个日期位置之间的差异,可能通过填充进行调整,以在条形之间留出一些空间。

rect.attr("x", function(d){return xScale(d.date) + padding;})
    .attr("width", function(d){
              return xScale( d3.time.month.offset(d.date, 1) )
                   - xScale(d.date)
                   - 2*padding;
        });

【讨论】:

  • 问题不是条的宽度,而是条之间的空间。如果您在第二个(二月)和第三个(三月)之间看到没有空间(因为 2 月有 28 天),但在其他之间有一个空间,但它不同(大约 1 px 和大约 2 px),因为有些有 30 或 31 天。
  • 我给出的方法将根据您添加的“填充”通过改变条形宽度以适应月份的宽度来提供相等的间距。如果您想要等间距等条宽,请使用序数比例,如在大多数条形图示例中,like this one
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多