D3.js 多折线图
D3.js Multiple Line Chart
我尝试使用 D3.js、
显示我的两个折线图
我可以显示第一个图表"blob",
但它不适用于 "blub"!!
如何修复它以及如何简化 for 循环?
var canvas=d3.select("body")
.append("svg")
.attr("width",500).attr("height",300);
var donnees= {
blob:[
{x:10,y:20},{x:20,y:60}, {x:30,y:70},
{x:40,y:202},{x:50,y:260}, {x:60,y:70},
{x:70,y:75},{x:80,y:70}, {x:90,y:0}
],
blub:[
{x:100,y:20},{x:110,y:20},{x:120,y:60}, {x:130,y:70},
{x:140,y:32},{x:150,y:60}, {x:160,y:90},
{x:170,y:75},{x:180,y:100}, {x:190,y:20}
]
};
var groupe= canvas.append("g")
.attr("transform", "translate(20,20)");
var line= d3.svg.line()
.x (function(d){return d.x})
.y (function(d){return d.y});
var colors = d3.scale.category20();
var index = 0;
for (var i in donnees) {
groupe.selectAll("path")
.data([donnees[i]])
.enter()
.append("path")
.attr("d",line)
.attr("fill", "none")
.attr("stroke", colors(index))
.attr("stroke-width","1");
index++
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
我没有使用 data() 和 enter(),而是直接将路径标签附加到对我有用的 g 标签。
var canvas=d3.select("body")
.append("svg")
.attr("width",500).attr("height",300);
var donnees= {
blob:[
{x:10,y:20},{x:20,y:60}, {x:30,y:70},
{x:40,y:202},{x:50,y:260}, {x:60,y:70},
{x:70,y:75},{x:80,y:70}, {x:90,y:0}
],
blub:[
{x:100,y:20},{x:110,y:20},{x:120,y:60}, {x:130,y:70},
{x:140,y:32},{x:150,y:60}, {x:160,y:90},
{x:170,y:75},{x:180,y:100}, {x:190,y:20}
]
};
var groupe= canvas.append("g")
.attr("transform", "translate(20,20)");
var line= d3.svg.line()
.x (function(d){ return d.x})
.y (function(d){return d.y});
var colors = d3.scale.category20();
var index = 0;
for (var i in donnees) {
groupe
.append("path")
.attr("d", line(donnees[i]))
.attr("fill", "none")
.attr("stroke", colors(index))
.attr("stroke-width", 1);
index++
}
首先,这里不需要循环(在 D3 中几乎不需要),但可以使用 nested selections:
groupe.selectAll("g")
.data(d3.values(donnees))
.enter()
.append("g")
.selectAll("path")
.data(function(d) { return [d]; })
.enter()
.append("path")
...
您具体看到的问题是因为您正在选择 path
个元素,在循环的第一次迭代之后,这些元素已经存在。也就是说,您在 .data()
中提供的数据与现有的 path
元素匹配,因此 .enter()
选择为空,未添加任何内容。你可以解决这个问题,例如通过为每个 path
分配一个 class 来区分它们,但更好的解决方案是使用我上面概述的嵌套选择。
完成演示 here。
有关选择工作原理的更多详细信息,请参阅 this tutorial。
我尝试使用 D3.js、
显示我的两个折线图我可以显示第一个图表"blob",
但它不适用于 "blub"!!
如何修复它以及如何简化 for 循环?
var canvas=d3.select("body")
.append("svg")
.attr("width",500).attr("height",300);
var donnees= {
blob:[
{x:10,y:20},{x:20,y:60}, {x:30,y:70},
{x:40,y:202},{x:50,y:260}, {x:60,y:70},
{x:70,y:75},{x:80,y:70}, {x:90,y:0}
],
blub:[
{x:100,y:20},{x:110,y:20},{x:120,y:60}, {x:130,y:70},
{x:140,y:32},{x:150,y:60}, {x:160,y:90},
{x:170,y:75},{x:180,y:100}, {x:190,y:20}
]
};
var groupe= canvas.append("g")
.attr("transform", "translate(20,20)");
var line= d3.svg.line()
.x (function(d){return d.x})
.y (function(d){return d.y});
var colors = d3.scale.category20();
var index = 0;
for (var i in donnees) {
groupe.selectAll("path")
.data([donnees[i]])
.enter()
.append("path")
.attr("d",line)
.attr("fill", "none")
.attr("stroke", colors(index))
.attr("stroke-width","1");
index++
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
我没有使用 data() 和 enter(),而是直接将路径标签附加到对我有用的 g 标签。
var canvas=d3.select("body")
.append("svg")
.attr("width",500).attr("height",300);
var donnees= {
blob:[
{x:10,y:20},{x:20,y:60}, {x:30,y:70},
{x:40,y:202},{x:50,y:260}, {x:60,y:70},
{x:70,y:75},{x:80,y:70}, {x:90,y:0}
],
blub:[
{x:100,y:20},{x:110,y:20},{x:120,y:60}, {x:130,y:70},
{x:140,y:32},{x:150,y:60}, {x:160,y:90},
{x:170,y:75},{x:180,y:100}, {x:190,y:20}
]
};
var groupe= canvas.append("g")
.attr("transform", "translate(20,20)");
var line= d3.svg.line()
.x (function(d){ return d.x})
.y (function(d){return d.y});
var colors = d3.scale.category20();
var index = 0;
for (var i in donnees) {
groupe
.append("path")
.attr("d", line(donnees[i]))
.attr("fill", "none")
.attr("stroke", colors(index))
.attr("stroke-width", 1);
index++
}
首先,这里不需要循环(在 D3 中几乎不需要),但可以使用 nested selections:
groupe.selectAll("g")
.data(d3.values(donnees))
.enter()
.append("g")
.selectAll("path")
.data(function(d) { return [d]; })
.enter()
.append("path")
...
您具体看到的问题是因为您正在选择 path
个元素,在循环的第一次迭代之后,这些元素已经存在。也就是说,您在 .data()
中提供的数据与现有的 path
元素匹配,因此 .enter()
选择为空,未添加任何内容。你可以解决这个问题,例如通过为每个 path
分配一个 class 来区分它们,但更好的解决方案是使用我上面概述的嵌套选择。
完成演示 here。
有关选择工作原理的更多详细信息,请参阅 this tutorial。