折线图没有连接连续的点
line chart isn't connecting consecutive points
我正在尝试根据 csv 格式的数据绘制一个简单的折线图。折线图错误地连接了点。例如,在下面给出的折线图中,绘图从第 3 个点开始,一直走到最后,到达第 1 个和第 2 个点。
这是我的代码:
d3.csv("./sample.csv", function(data){
var ndx = crossfilter(data);
var interval = ndx.dimension(function(d) {return d["Freq(MHz)"];});
var field = "value1";
var minF = d3.min(data.map(d => d["Freq(MHz)"]).map(Number));
var miny = d3.min(data.map(d => d[field]).map(Number)) -10;
var maxy = d3.max(data.map(d => d[field]).map(Number)) + 10;
var maxF = d3.max(data.map(d => d["Freq(MHz)"]).map(Number));
var hitslineChart = dc.lineChart("#time-chart");
thput = interval.group().reduceSum(function(d) {return d[field];});
hitslineChart[0]
.width(1200).height(350)
.dimension(interval)
.group(thput,field)
.x(d3.scale.linear().domain([minF,maxF]))
.brushOn(false)
.renderHorizontalGridLines(true)
.yAxisLabel(field)
.xAxisLabel("Frequency(MHz)")
.xAxisPadding(100)
.y(d3.scale.linear().domain([miny, maxy]))
.mouseZoomable(true)
hitslineChart.render()
})
我无法弄清楚这个问题。
可能是 crossfilter 按字典顺序而不是数字顺序对 X 坐标进行排序。
与JSON不同,d3.csv()
必然return将所有字段作为字符串。 (我认为他们正在 D3v6 中重新审视这一点。)
我不确定他们是否在任何地方清楚地定义了它,但是 crossfilter "natural ordering" 将字符串作为字符串进行比较,将数字作为数字进行比较。 Some details here.
你可以试试
var interval = ndx.dimension(function(d) {
return +d["Freq(MHz)"];
});
注意这里的+
——或者使用你喜欢的数字强制转换方法,JS 有很多。
在将数据传递给交叉过滤器之前进行任何转换会更快更安全,因此您可以考虑
data.forEach(function(d) {
d['Freq(MHz)'] = +d['Freq(MHz)'];
// any other numbers or dates to convert here?
});
var ndx = crossfilter(data);
我正在尝试根据 csv 格式的数据绘制一个简单的折线图。折线图错误地连接了点。例如,在下面给出的折线图中,绘图从第 3 个点开始,一直走到最后,到达第 1 个和第 2 个点。
这是我的代码:
d3.csv("./sample.csv", function(data){
var ndx = crossfilter(data);
var interval = ndx.dimension(function(d) {return d["Freq(MHz)"];});
var field = "value1";
var minF = d3.min(data.map(d => d["Freq(MHz)"]).map(Number));
var miny = d3.min(data.map(d => d[field]).map(Number)) -10;
var maxy = d3.max(data.map(d => d[field]).map(Number)) + 10;
var maxF = d3.max(data.map(d => d["Freq(MHz)"]).map(Number));
var hitslineChart = dc.lineChart("#time-chart");
thput = interval.group().reduceSum(function(d) {return d[field];});
hitslineChart[0]
.width(1200).height(350)
.dimension(interval)
.group(thput,field)
.x(d3.scale.linear().domain([minF,maxF]))
.brushOn(false)
.renderHorizontalGridLines(true)
.yAxisLabel(field)
.xAxisLabel("Frequency(MHz)")
.xAxisPadding(100)
.y(d3.scale.linear().domain([miny, maxy]))
.mouseZoomable(true)
hitslineChart.render()
})
我无法弄清楚这个问题。
可能是 crossfilter 按字典顺序而不是数字顺序对 X 坐标进行排序。
与JSON不同,d3.csv()
必然return将所有字段作为字符串。 (我认为他们正在 D3v6 中重新审视这一点。)
我不确定他们是否在任何地方清楚地定义了它,但是 crossfilter "natural ordering" 将字符串作为字符串进行比较,将数字作为数字进行比较。 Some details here.
你可以试试
var interval = ndx.dimension(function(d) {
return +d["Freq(MHz)"];
});
注意这里的+
——或者使用你喜欢的数字强制转换方法,JS 有很多。
在将数据传递给交叉过滤器之前进行任何转换会更快更安全,因此您可以考虑
data.forEach(function(d) {
d['Freq(MHz)'] = +d['Freq(MHz)'];
// any other numbers or dates to convert here?
});
var ndx = crossfilter(data);