【问题标题】:d3js line chart -- how to extend last step to end of range?d3js 折线图——如何将最后一步扩展到范围的末尾?
【发布时间】:2014-01-17 11:46:29
【问题描述】:

这很简单,但我无法摆脱这个问题。

线是两个点(值)之间的链接,从值 A 绘制到值 B。假设 A 的值为 10,B 的值为 20,而 C 缺失。这条线现在从 0 到 10 到 20 绘制并完成。我想画从 0 到 10 到 20 到 25 的线。值是 x 轴的刻度(0、10、20、30、40)。在不改变我的行首的情况下这是否可能,所以它仍然从 x 轴的零点开始?

当然不用在 20 到 25 之间再画一条线 :)

我的线路代码:

 var line = d3.svg.line()
        .defined(function (d) { return d.value != null; })
        .x(function (d, i) {                
            return x(d.xValue);
        })
        .y(function (d) {
            return y(d.value);
        }).interpolate("step-after");

提前谢谢

这里有两张图片。第一个,它现在的样子,第二个,它应该是什么样子。


(来源:www.axi.at


(来源:www.axi.at

©a-x-i(d3js 快把我逼疯了,但它很酷....)

【问题讨论】:

  • 为什么你的 svg.line 只有一个 x 和一个 y?它应该是 x1、y1、x2 和 y2。如果您想重新绘制线条以使其更长,只需选择它并给它一些新的开始值和结束值。
  • 不确定我是否明白你想要什么。如果 25 不在您的域中,您如何将线路设置为 25?
  • 你能张贴一张你想要的图表是什么样子的图片吗?你的数据点是什么?
  • @EightBitBoy:就像这里的代码:link
  • @AmeliaBR:在原始问题中添加了图片。谢谢....

标签: d3.js linechart


【解决方案1】:

d3 永远不会将一条线延伸到最终数据点之外。但是,线条的外观以及数据点的连接方式取决于d3.svg.lineinterpolator 设置。

举个简单的例子,假设您只有两个点 (10,20) 和 (15,30)。

普通(“线性”)插值器会在它们之间画一条直线。

“step-after” 插值器从第一个点 (10,20) 开始,并在第二个点的 x 值(即 (15 ,20) ),然后绘制一条直到 (15,30) 的垂直线。结果:第一个值显示为一条水平线,在应用第二个值之前一直保持不变。

相比之下,"step-before" 插值器从第一个点 (10,20) 开始,并在 y 值处绘制 垂直 线第二点(即到 (10,30) ),然后将水平线绘制到 (15,30)。结果:第一个值仅显示为垂直步长的起点,第二个值显示为在其间的时间内保持不变。

最后,"step" 插值器在两个 x 值之间更改 y 值中途。结果是开始值和结束值都显示为水平线,它们之间的距离持续了一半。

以下是不同行插值器选项的比较:
http://fiddle.jshell.net/c2mru/1/

我认为最适合你的是:

  • 使用“step”插值函数
  • 将线条的 x 值设置为水平条的中间

你可以通过改变来做到这一点

 var line = d3.svg.line()
        .defined(function (d) { return d.value != null; })
        .x(function (d, i) {                
            return x(d.xValue);
        })
        .y(function (d) {
            return y(d.value);
        }).interpolate("step-after");

 var line = d3.svg.line()
        .defined(function (d) { return d.value != null; })
        .x(function (d, i) {                
            return x(d.xValue) + x.rangeBand()/2;
        })
        .y(function (d) {
            return y(d.value);
        }).interpolate("step");

这将导致一条线从第一个条的中点开始,到最后一个条的中点结束,但用一条水平线清楚地显示每个条的值。

如果你真的必须在你的范围的最后一行开始和结束,那么你有两个选择:

【讨论】:

  • P.S.对于将来在寻找有关 d3 插值函数的信息时偶然发现此问题的任何人,this version of the fiddle 对于比较不同的曲线插值器可能更有用。
  • 您是否有机会提供一个自定义插值,在范围结束后执行一步?
  • @Cameron 您可以,尽管默认情况下线插值器不会接收有关总范围的信息,因此您需要使用生成器模式:创建一个接受此信息并返回的函数行生成器将使用的函数。用那个额外的端点填充数据数组可能更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
相关资源
最近更新 更多