【发布时间】:2019-03-22 17:39:18
【问题描述】:
是否有办法从我在 D3.js 中的数据集中输入整个数组?还是我必须在进入之前清理它?
我的数据集 .jason 的示例在这里:
[
{
"promoter": "Vigun01",
"upstream": "[2, 57, 150, 376]"
},
{
"promoter": "Vigun01",
"upstream": "[500, 732, 765]"
},
{
"promoter": "Vigun01",
"upstream": "[675]"
},
{
"promoter": "Vigun02",
"upstream": "[623]"
},
{
"promoter": "Vigun03",
"upstream": "[133, 601]"
},
{
"promoter": "Vigun04",
"upstream": "[599, 650]"
},
{
"promoter": "Vigun05",
"upstream": "[50, 789]"
}
]
我在 D3.js 中的脚本在这里:
var svg = d3.select("#chart-area")
.append("svg")
.attr("width", "400")
.attr("height", "400");
d3.json("data/dataset.json").then(function(data){
data.forEach(d => {
d.upstream = +d.upstream;
});
console.log(data);
var y = d3.scaleBand()
.domain(data.map(function(d){
return d.promoter;
}))
.range([0, 400])
.paddingInner(0.2)
.paddingOuter(0.2);
var x = d3.scaleLinear()
.domain([0,1000])
.range([0,400]);
var line = svg.selectAll("line")
.data(data);
line.enter()
.append('line')
.attr('x1', 0)
.attr('y1', (d,i)=>y(d.promoter))
.attr('x2', 400)
.attr('y2', (d,i)=>y(d.promoter))
.attr('stroke-width', 1)
.attr('stroke', 'black');
var circle = svg.selectAll("circle")
.data(data)
.enter()
.append("circle")
.attr("cy", function(d){
return y(d.promoter)
})
.attr("cx", function(d){
return x(d.upstream)
})
.attr("r", 5)
.attr("fill", function(d) {
return "black";
});
}).catch(function(error){
console.log(error)
});
我可以绘制单个输入,例如 ("Vigun01", "10"),但如果我有整个数组,我就不能。
如果将 ("Vigun01", "[1,2,3,4]") 转换为 ("Vigun01", "1"), ("Vigun01", "2"), ("Vigun01", "3"), ("Vigun01", "4") 但我如何在我的数据集中执行此操作?
【问题讨论】:
-
如果你想画多条线,你的数据应该是一个数组数组,其中每个内部数组都是一条线。
[[...line 1], [...line 2]] -
我画线没有任何问题。我的问题是圆圈,cx 属性更具体。当我遍历数据集时,我得到了一个 cy 类别和一个数组,但是如何绘制多个重复所有参数的“cx”?
标签: javascript arrays d3.js graphics data-science