【发布时间】:2018-09-11 07:24:38
【问题描述】:
...我正在将图表从 v3 移植到 v4,但我在 path 和 line 方面遇到了障碍。
这是我认为的突出部分:
<script src="https://d3js.org/d3.v4.min.js"></script>
pdata = [
{
"date": "2018-01-01",
"marketPrice": 3131
},
{
"date": "2018-01-02",
"marketPrice": 3151
}
];
// loop that transforms "date" to new Date(), marketPrice to numeric
// *** added during edit ***
// format the data
pdata.forEach(function(d) {
d.date = new Date (d.date); // difference between this and Ref(3) is...
// ref(3) calls a time parser rather than instantiate new Date()
d.marketPrice = +d.marketPrice;
//console.log("parsing date into: -- Date: " + d.date + " -- Market Price: " + d.marketPrice);
});
// linear scaling functions - xscale() and yscale()
// *** added during edit ***
// Create scales (added in edit)
var xscale = d3.scaleTime()
.domain([
d3.min(pdata, function (d){return d.date}),
d3.max(pdata, function (d){return d.date})
])
.range([GRAPHLEFT, GRAPHRIGHT]);
var yscale = d3.scaleLinear()
.domain([
d3.min(pdata, function (d){return d.marketPrice}),
d3.max(pdata, function (d){return d.marketPrice})
])
.range([GRAPHBOTTOM,GRAPHTOP]);
// axis functions omitted ...these work predictably
svg.append("path")
.data([pdata])
.attr("stroke", "steelblue")
.attr("stroke-width", 3)
.attr("fill", "none")
.attr("d", lineFunc);
var lineFunc = d3.line()
.x(function (d) {
console.log("Graphing x as: " + xscale(d.date)); // updated during edit
return (xscale(d.date)); // updated during edit ... reveals as NaN
})
.y(function (d) {
console.log("Graphing y as: " + yscale(d.marketPrice)); // updated during edit ... reveals as NaN
return (yscale(d.marketPrice));
});
我无法确认来自lineFunc() 的回调实际上被调用了。 (现在按照下面的答案解决)
在我的页面中,出现了坐标轴,但没有出现绘图线。
我正在使用这些参考资料和模型:
(1) - https://github.com/d3/d3-shape/blob/master/README.md#line
(2) - https://bl.ocks.org/pstuffa/26363646c478b2028d36e7274cedefa6
(3) - https://bl.ocks.org/d3noob/402dd382a51a4f6eea487f9a35566de0
【问题讨论】:
-
首先,与 console.log 问题无关,您缺少行生成器中的刻度。例如,对于 x 位置,您不能使用像
"2018-01-02"这样的字符串!另外,请使用datum(pdata)而不是data([pdata])。 -
在这种情况下,缩放出现在后台。有一个 forEach 循环(隐含在 cmets 中)通过对每个日期元素进行“new Date()”替换来转换日期字符串。 (我已将其添加为对 OP 的编辑)——我找不到关于
datum([pdata])和data(pdata)之间区别的文档——我在 API 文档中查找错误的位置,示例似乎有点矛盾的。 -
...另外,我有一个后台函数 xscale() -- 你是否断言在
lineFunc()我的代码应该.x(d => {return xscale(d.date)})而不是.x(d => {return d.date})-- 因为我也有试过了。 -
我确实找到了对 datum(pdata) 和 data(pdata) 之间差异的清晰考虑......stackoverflow node here 和 article here
标签: javascript d3.js data-visualization