eth*_*ane 3 javascript svg d3.js
我正在尝试创建数百个数据点的散点图,每个数据点有大约5个不同的属性.数据从.csv加载为对象数组,每个对象如下所示:
{hour: "02",yval: "63",foo: "33", goo:"0", bar:"1"},
我想显示具有以下属性的散点图:
形状bar
:
-circle表示所有点,其中bar=0
三角形表示那些bar=1
(这是一个虚拟变量).
颜色foo
和goo
:
goo
分类为值[0,1,2],而foo
定量范围为0-50.foo和goo是互斥的,因此只有其中一个具有值.换句话说,对于每个数据点foo=0
或者goo=0
.goo=1
应为橙色; 点goo=2
应该是红色的.foo
应该映射到从浅蓝色到深蓝色的线性色标,即 d3.scale.linear().domain([0, 50]).range(["#87CEFF", "#0000FF"]);
我可以单独完成这些,但是将所有内容组合在一起就会给我带来麻烦.
我的代码具有可重现的数据在这里:http://jsfiddle.net/qy5ohw0x/3/
问题
.append("svg:path")
.attr("d", d3.svg.symbol())
这没用.我尝试了一种不同的方法,但这没有正确映射值:
var series = svg.selectAll("g.series")
.data(dataSet, function(d, i) { return d.bar; })
.enter()
.append("svg:g")
series.selectAll("g.point")
.data(dataSet)
.enter()
.append("svg:path")
.attr("transform", function(d, i) { return "translate(" + d.hour + "," + d.yval + ")"; })
.attr("d", function(d,i, j) { return d3.svg.symbol().type(symbolType[j])(); })
.attr("r", 2);
Run Code Online (Sandbox Code Playgroud)
goo
颜色(灰色/橙色/红色),我手动将值映射到3种颜色:首先定义 var colors = ["grey", "orange", "red"];
然后在绘制数据点链的同时
.style("fill", function (d) { return colors[d.type]; })
这单独工作,但不是用不同的符号.
foo
吗?d3.scale.linear().domain([0, 50]).range(["#87CEFF", "#0000FF"]);
如果可能的话可能会有用.再次,jsfiddle在这里:http://jsfiddle.net/qy5ohw0x/3/
谢谢!!
只需function(d)
为每个属性执行所有逻辑和比较.
首先设置一些助手:
// symbol generators
var symbolTypes = {
"triangleDown": d3.svg.symbol().type("triangle-down"),
"circle": d3.svg.symbol().type("circle")
};
// colors for foo
var fooColors = d3.scale
.linear()
.domain([0, 50])
.range(["#87CEFF", "#0000FF"]);
Run Code Online (Sandbox Code Playgroud)
然后为每个符号附加一个路径:
svg.selectAll("path")
.data(dataSet)
.enter().append("path")
.attr("class", "dot")
// position it, can't use x/y on path, so translate it
.attr("transform", function(d) {
return "translate(" + (x(d.hour) + (Math.random() * 12 - 6)) + "," + y(d.yval) + ")";
})
// assign d from our symbols
.attr("d", function(d,i){
if (d.bar === "0") // circle if bar === 0
return symbolTypes.circle();
else
return symbolTypes.triangleDown();
})
// fill based on goo and foo
.style("fill", function(d,i){
if (d.goo !== "0"){
if (d.goo === "1")
return "red";
else
return "orange";
}else{
return fooColors(d.foo);
}
});
Run Code Online (Sandbox Code Playgroud)
更新了小提琴.
另一方面,我认为直接d3
比nvd3
这种情况更直观.