下面快速查看一下我的数据:
var data = [
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':1},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':2},
{'bankid': 2016, 'sub': 0, 'applied':2016, 'id':1},
{'bankid': 2017, 'sub': 0, 'applied':2016, 'id':2},
...
];基本上,我有一个可视化,其中一些圆圈在页面的顶部,有些在底部。我正试图把bezier链接附加到我的一些圈子里。我对所需的链接顶部节点和底部节点进行了data()调用。然后,我将顶部和底部圆的x和y值存储在两个不同的数组中。我的链接函数需要一个统一数组,所以我尝试基于id合并它们。如下所示:
var multiLinkData = topLinks.map(t1 => ({...t1, ...bottomLinks.find(t2 => t2.id === t1.id)}));然而,这创建了一个数组,该数组具有正确的上圆坐标,但不正确的下圆坐标( bezier线都在同一个底部圆中结束)。
结果如下:
var margins = {top:20, bottom:300, left:200, right:100};
var height = 150;
var width = 950;
var totalWidth = width+margins.left+margins.right;
var totalHeight = height+margins.top+margins.bottom;
var svg = d3.select('body')
.append('svg')
.attr('width', totalWidth)
.attr('height', totalHeight);
var graphGroup = svg.append('g')
.attr('transform', "translate("+margins.left+","+margins.top+")");
var xScale = d3.scalePoint()
.range([0, width]);
var data = [
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':1},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':2},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':3},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':4},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':5},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':6},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':7},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':8},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':9},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':10},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':11},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':12},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':13},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':14},
{'bankid': 2016, 'sub': 1, 'showLink':true, 'id':15},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 1},
{'bankid': 2016, 'sub': 0, 'applied':2015},
{'bankid': 2016, 'sub': 0, 'applied':2015},
{'bankid': 2016, 'sub': 0, 'applied':2015},
{'bankid': 2016, 'sub': 0, 'applied':2015},
{'bankid': 2016, 'sub': 0, 'applied':2015},
{'bankid': 2016, 'sub': 0, 'applied':2015},
{'bankid': 2016, 'sub': 0, 'applied':2015},
{'bankid': 2016, 'sub': 0, 'applied':2016, 'id':1},
{'bankid': 2017, 'sub': 1, 'showLink':true, 'id':16},
{'bankid': 2017, 'sub': 1, 'showLink':true, 'id':17},
{'bankid': 2017, 'sub': 1, 'showLink':true, 'id':18},
{'bankid': 2017, 'sub': 1, 'showLink':true, 'id':19},
{'bankid': 2017, 'sub': 1, 'showLink':true, 'id':20},
{'bankid': 2017, 'sub': 1, 'showLink':true, 'id':21},
{'bankid': 2017, 'sub': 1, 'showLink':true, 'id':22},
{'bankid': 2017, 'sub': 1, 'showLink':true, 'id':23},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 1},
{'bankid': 2017, 'sub': 0, 'applied':2015},
{'bankid': 2017, 'sub': 0, 'applied':2015},
{'bankid': 2017, 'sub': 0, 'applied':2015},
{'bankid': 2017, 'sub': 0, 'applied':2016, 'id':2},
{'bankid': 2017, 'sub': 0, 'applied':2016, 'id':3},
{'bankid': 2017, 'sub': 0, 'applied':2016, 'id':4},
{'bankid': 2018, 'sub': 1},
{'bankid': 2018, 'sub': 1},
{'bankid': 2018, 'sub': 1},
{'bankid': 2018, 'sub': 0, 'applied':2015},
{'bankid': 2018, 'sub': 0, 'applied':2015},
{'bankid': 2018, 'sub': 0, 'applied':2016, 'id':5},
{'bankid': 2018, 'sub': 0, 'applied':2016, 'id':6},
{'bankid': 2018, 'sub': 0, 'applied':2016, 'id':7},
{'bankid': 2018, 'sub': 0, 'applied':2016, 'id':8},
{'bankid': 2018, 'sub': 0, 'applied':2016, 'id':9},
{'bankid': 2018, 'sub': 0, 'applied':2016, 'id':10},
{'bankid': 2018, 'sub': 0, 'applied':2016, 'id':11},
{'bankid': 2018, 'sub': 0, 'applied':2017, 'id':16},
{'bankid': 2018, 'sub': 0, 'applied':2017, 'id':17},
{'bankid': 2018, 'sub': 0, 'applied':2017, 'id':18},
{'bankid': 2019, 'sub': 1, 'showLink':true, 'id':24},
{'bankid': 2019, 'sub': 1},
{'bankid': 2019, 'sub': 1},
{'bankid': 2019, 'sub': 0, 'applied':2016, 'id':12},
{'bankid': 2019, 'sub': 0, 'applied':2016, 'id':13},
{'bankid': 2019, 'sub': 0, 'applied':2017, 'id':19},
{'bankid': 2020, 'sub': 1, 'showLink':true, 'id':25},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 1},
{'bankid': 2020, 'sub': 0, 'applied':2016, 'id':14},
{'bankid': 2020, 'sub': 0, 'applied':2016, 'id':15},
{'bankid': 2020, 'sub': 0, 'applied':2017, 'id':20},
{'bankid': 2020, 'sub': 0, 'applied':2017, 'id':21},
{'bankid': 2020, 'sub': 0, 'applied':2017, 'id':22},
{'bankid': 2020, 'sub': 0, 'applied':2017, 'id':23},
{'bankid': 2020, 'sub': 0, 'applied':2020, 'id':25},
{'bankid': 2021, 'sub': 1},
{'bankid': 2021, 'sub': 0, 'applied':2019, 'id':24},
];
var colorScale = d3.scaleOrdinal(["#003366","#366092","#4f81b9","#95b3d7","#b8cce4","#e7eef8"]);
xScale.domain([2015,2016,2017,2018,2019,2020,2021]);
//colorScale.domain(d3.extent(data, function(d) {return d.age; }));
data.forEach(function (d) {
d.x = xScale(d.bankid);
d.y = d.sub ? height - 15 : height + 250;
});
var simulation = d3.forceSimulation(data)
.force("x", d3.forceX(function(d) {
return xScale(d.bankid);
}).strength(0.08))
.force("y", d3.forceY(function(d) {
return d.sub ? height - 15 : height + 250
}).strength(0.05))
.force("collide", d3.forceCollide(6).iterations(1))
.stop();
for (var i = 0; i < 240; ++i) {
simulation.tick();
data.forEach(function (d) {
if (d.sub) {
d.y = Math.min(d.y, height - 15);
} else {
d.y = Math.max(d.y, height + 250);
}
});
}
var colorMap = {
2015:"#003366",
2016:"#4f81b9",
2017:"#95b3d7",
2018:"#e7eef8",
2019:"#d9d9d9",
2020:"#a6a6a6",
2021:"#f6d18b"
};
var circles = graphGroup.selectAll(null)
.data(data)
.enter()
.append("circle")
.attr("r", 5)
.attr("cx", function(d) {
return d.x;
})
.attr("cy", function(d) {
return d.y;
})
.style('fill', function(d) {return d.sub ==1 ? colorMap[d.bankid] : colorMap[d.applied] ;});
var topCircles = d3.selectAll('circle').filter(function(d) {return d.showLink == true}).data();
var bottomCircles = d3.selectAll('circle').filter(function(d) {return d.sub == 0 && d.applied !== 2015}).data();
var topLinks = topCircles.map(function(d) {
return {source: [d.x, d.y]}
});
var bottomLinks = bottomCircles.map(function(d) {
return {target: [d.x, d.y]}
});
var multiLinkData = topLinks.map(t1 => ({...t1, ...bottomLinks.find(t2 => t2.id === t1.id)}));
//console.log(bottomCircles);
//console.log(multiLinkData);
var link = d3.linkHorizontal();
graphGroup.selectAll("path")
.data(multiLinkData)
.join("path")
.attr("d", link)
.attr("fill", "none")
.attr("stroke", "#d9d9d9");<script src="https://d3js.org/d3.v5.min.js"></script>
不知道我的合并是怎么对我不利的。
问题
这种合并的语法修正是什么?
发布于 2021-03-18 09:38:54
您没有使用ID填充topLinks和bottomLinks。它应该是:
var topLinks = topCircles.map(function(d) {
return {source: [d.x, d.y], id: d.id}
});
var bottomLinks = bottomCircles.map(function(d) {
return {target: [d.x, d.y], id: d.id}
});下面是您更改的代码:
var margins = {
top: 20,
bottom: 300,
left: 200,
right: 100
};
var height = 150;
var width = 950;
var totalWidth = width + margins.left + margins.right;
var totalHeight = height + margins.top + margins.bottom;
var svg = d3.select('body')
.append('svg')
.attr('width', totalWidth)
.attr('height', totalHeight);
var graphGroup = svg.append('g')
.attr('transform', "translate(" + margins.left + "," + margins.top + ")");
var xScale = d3.scalePoint()
.range([0, width]);
var data = [{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 1
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 2
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 3
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 4
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 5
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 6
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 7
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 8
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 9
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 10
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 11
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 12
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 13
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 14
},
{
'bankid': 2016,
'sub': 1,
'showLink': true,
'id': 15
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 1
},
{
'bankid': 2016,
'sub': 0,
'applied': 2015
},
{
'bankid': 2016,
'sub': 0,
'applied': 2015
},
{
'bankid': 2016,
'sub': 0,
'applied': 2015
},
{
'bankid': 2016,
'sub': 0,
'applied': 2015
},
{
'bankid': 2016,
'sub': 0,
'applied': 2015
},
{
'bankid': 2016,
'sub': 0,
'applied': 2015
},
{
'bankid': 2016,
'sub': 0,
'applied': 2015
},
{
'bankid': 2016,
'sub': 0,
'applied': 2016,
'id': 1
},
{
'bankid': 2017,
'sub': 1,
'showLink': true,
'id': 16
},
{
'bankid': 2017,
'sub': 1,
'showLink': true,
'id': 17
},
{
'bankid': 2017,
'sub': 1,
'showLink': true,
'id': 18
},
{
'bankid': 2017,
'sub': 1,
'showLink': true,
'id': 19
},
{
'bankid': 2017,
'sub': 1,
'showLink': true,
'id': 20
},
{
'bankid': 2017,
'sub': 1,
'showLink': true,
'id': 21
},
{
'bankid': 2017,
'sub': 1,
'showLink': true,
'id': 22
},
{
'bankid': 2017,
'sub': 1,
'showLink': true,
'id': 23
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 1
},
{
'bankid': 2017,
'sub': 0,
'applied': 2015
},
{
'bankid': 2017,
'sub': 0,
'applied': 2015
},
{
'bankid': 2017,
'sub': 0,
'applied': 2015
},
{
'bankid': 2017,
'sub': 0,
'applied': 2016,
'id': 2
},
{
'bankid': 2017,
'sub': 0,
'applied': 2016,
'id': 3
},
{
'bankid': 2017,
'sub': 0,
'applied': 2016,
'id': 4
},
{
'bankid': 2018,
'sub': 1
},
{
'bankid': 2018,
'sub': 1
},
{
'bankid': 2018,
'sub': 1
},
{
'bankid': 2018,
'sub': 0,
'applied': 2015
},
{
'bankid': 2018,
'sub': 0,
'applied': 2015
},
{
'bankid': 2018,
'sub': 0,
'applied': 2016,
'id': 5
},
{
'bankid': 2018,
'sub': 0,
'applied': 2016,
'id': 6
},
{
'bankid': 2018,
'sub': 0,
'applied': 2016,
'id': 7
},
{
'bankid': 2018,
'sub': 0,
'applied': 2016,
'id': 8
},
{
'bankid': 2018,
'sub': 0,
'applied': 2016,
'id': 9
},
{
'bankid': 2018,
'sub': 0,
'applied': 2016,
'id': 10
},
{
'bankid': 2018,
'sub': 0,
'applied': 2016,
'id': 11
},
{
'bankid': 2018,
'sub': 0,
'applied': 2017,
'id': 16
},
{
'bankid': 2018,
'sub': 0,
'applied': 2017,
'id': 17
},
{
'bankid': 2018,
'sub': 0,
'applied': 2017,
'id': 18
},
{
'bankid': 2019,
'sub': 1,
'showLink': true,
'id': 24
},
{
'bankid': 2019,
'sub': 1
},
{
'bankid': 2019,
'sub': 1
},
{
'bankid': 2019,
'sub': 0,
'applied': 2016,
'id': 12
},
{
'bankid': 2019,
'sub': 0,
'applied': 2016,
'id': 13
},
{
'bankid': 2019,
'sub': 0,
'applied': 2017,
'id': 19
},
{
'bankid': 2020,
'sub': 1,
'showLink': true,
'id': 25
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 1
},
{
'bankid': 2020,
'sub': 0,
'applied': 2016,
'id': 14
},
{
'bankid': 2020,
'sub': 0,
'applied': 2016,
'id': 15
},
{
'bankid': 2020,
'sub': 0,
'applied': 2017,
'id': 20
},
{
'bankid': 2020,
'sub': 0,
'applied': 2017,
'id': 21
},
{
'bankid': 2020,
'sub': 0,
'applied': 2017,
'id': 22
},
{
'bankid': 2020,
'sub': 0,
'applied': 2017,
'id': 23
},
{
'bankid': 2020,
'sub': 0,
'applied': 2020,
'id': 25
},
{
'bankid': 2021,
'sub': 1
},
{
'bankid': 2021,
'sub': 0,
'applied': 2019,
'id': 24
},
];
var colorScale = d3.scaleOrdinal(["#003366", "#366092", "#4f81b9", "#95b3d7", "#b8cce4", "#e7eef8"]);
xScale.domain([2015, 2016, 2017, 2018, 2019, 2020, 2021]);
//colorScale.domain(d3.extent(data, function(d) {return d.age; }));
data.forEach(function(d) {
d.x = xScale(d.bankid);
d.y = d.sub ? height - 15 : height + 250;
});
var simulation = d3.forceSimulation(data)
.force("x", d3.forceX(function(d) {
return xScale(d.bankid);
}).strength(0.08))
.force("y", d3.forceY(function(d) {
return d.sub ? height - 15 : height + 250
}).strength(0.05))
.force("collide", d3.forceCollide(6).iterations(1))
.stop();
for (var i = 0; i < 240; ++i) {
simulation.tick();
data.forEach(function(d) {
if (d.sub) {
d.y = Math.min(d.y, height - 15);
} else {
d.y = Math.max(d.y, height + 250);
}
});
}
var colorMap = {
2015: "#003366",
2016: "#4f81b9",
2017: "#95b3d7",
2018: "#e7eef8",
2019: "#d9d9d9",
2020: "#a6a6a6",
2021: "#f6d18b"
};
var circles = graphGroup.selectAll(null)
.data(data)
.enter()
.append("circle")
.attr("r", 5)
.attr("cx", function(d) {
return d.x;
})
.attr("cy", function(d) {
return d.y;
})
.style('fill', function(d) {
return d.sub == 1 ? colorMap[d.bankid] : colorMap[d.applied];
});
var topCircles = d3.selectAll('circle').filter(function(d) {
return d.showLink == true
}).data();
var bottomCircles = d3.selectAll('circle').filter(function(d) {
return d.sub == 0 && d.applied !== 2015
}).data();
var topLinks = topCircles.map(function(d) {
return {
source: [d.x, d.y],
id: d.id
}
});
var bottomLinks = bottomCircles.map(function(d) {
return {
target: [d.x, d.y],
id: d.id
}
});
var multiLinkData = topLinks.map(t1 => ({ ...t1,
...bottomLinks.find(t2 => t2.id === t1.id)
}));
//console.log(bottomCircles);
//console.log(multiLinkData);
var link = d3.linkHorizontal();
graphGroup.selectAll("path")
.data(multiLinkData)
.join("path")
.attr("d", link)
.attr("fill", "none")
.attr("stroke", "#d9d9d9");<script src="https://d3js.org/d3.v5.min.js"></script>
https://stackoverflow.com/questions/66687565
复制相似问题