【问题标题】:Getting the scale right for a line chart for a simple CSV in D3 v4为 D3 v4 中的简单 CSV 获得折线图的正确比例
【发布时间】:2016-10-19 13:36:51
【问题描述】:

我有以下CSV file,很简单。

我想用该数据绘制折线图。我发现使用新版本的 D3 很难做到这一点。

我已经尝试了各种方法,但这是我目前拥有的。

var x = d3.scaleBand().range([0, width]);

然后在 d3.csv() 通话中我有

x.domain(data, function(d) { return d.date; });

不行,我也试过了:

var x = d3.scaleOrdinal().range([0, width]);

但这也没有用。我发现使用线性定量尺度更容易。

更新

根据 Gerardo 的更正(顺便说一句,这是个好地方),我现在明白了:

【问题讨论】:

  • 是的,但我的体重秤不是Time,因此我使用scaleOrdinal
  • 我知道我给他们打电话 Q1 2015 ..etc,但想象一下是Apples, Oranges ..etc

标签: javascript csv d3.js


【解决方案1】:

在比例中,domain 必须是一个数组。所以,这个:

x.domain(data, function(d) { return d.date; });

应该是:

x.domain(data.map(function(d) { return d.date; }));

您可以在这些演示中看到不同之处。首先,您的代码:

var data = [{date: "Q1 2014", close: 58},
           {date: "Q2 2014", close: 48},
           {date: "Q3 2014", close: 67},
           {date: "Q4 2014", close: 33},
           {date: "Q1 2014", close: 27},
           {date: "Q2 2014", close: 87},
           {date: "Q3 2014", close: 23},
           {date: "Q4 2014", close: 56}];

var scale = d3.scaleOrdinal().domain(data, function(d){
  return d.date;
});
                                     
console.log(scale.domain());
<script src="https://d3js.org/d3.v4.min.js"></script>

现在,使用map

var data = [{date: "Q1 2014", close: 58},
           {date: "Q2 2014", close: 48},
           {date: "Q3 2014", close: 67},
           {date: "Q4 2014", close: 33},
           {date: "Q1 2014", close: 27},
           {date: "Q2 2014", close: 87},
           {date: "Q3 2014", close: 23},
           {date: "Q4 2014", close: 56}];

var scale = d3.scaleOrdinal().domain(data.map(function(d){
  return d.date;
}));
                                     
console.log(scale.domain());
<script src="https://d3js.org/d3.v4.min.js"></script>

编辑:由于您正在制作折线图,因此您应该使用时间刻度或其他刻度,而不是序数刻度。原因是序数比例期望range 中的值数量与domain 中的值数量相同。话虽如此,您可以使用scalePoint

var x = d3.scalePoint().range([0, width])
    .domain(data.map(function(d) { return d.date; }));

【讨论】:

  • 非常好的地方@GerardoFurtado,但看起来仍然一团糟,请参阅更新后的问题。
  • full code here。喜欢用例子来解释,你是王牌,非常感谢!
  • 感谢@GerardoFurtado,这很有效。但是我仍然不清楚为什么我不能使用scaleOrdinal?我认为 D3 足够聪明,可以说我们在 Domain 数组中有 X 个项目,我将水平和平均分割范围距离,不是吗?
  • 不,这不是序数比例的工作方式。检查我刚刚制作的这个小提琴,看看控制台:jsfiddle.net/n2sdgb35
  • 我很惊讶!再次感谢@GerardoFurtado,这种行为对我来说非常奇怪,但我确信这是有充分理由的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
相关资源
最近更新 更多