作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里是 D3 和 Javascript 新手。我正在制作一张和弦图,其中一条弧线从中心拉开。我已经设法将圆弧移动到我想要的位置,但我想知道如何使和弦组再次接触圆弧而不弄乱其他和弦组的位置?
这是一张图片来解释我想要的结果。
我目前正在使用 if 语句来选择圆弧 C 停留的 Angular 并平移其位置。
.attr("transform", function(d) {
if (d.startAngle > Math.PI*1/2 && d.startAngle < Math.PI*5/6) {
return "transform", "translate(" + pullOutSize + "," + pullOutSize + ")"}
;})
我也可以使用翻译来翻译和弦的位置。
.attr("transform", "translate(" + 50 + "," + 50 + ")")
.attr("d", path);
但是,当我对其应用相同的 if 语句时,翻译停止工作。好像if语句不满足条件。我想知道将什么语句放入 if 语句以帮助我选择要移动的和弦部分是正确的。
.attr("transform", function(d) {
if (d.startAngle > Math.PI*1/2 && d.startAngle < Math.PI*5/6) {
return "transform", "translate(" + pullOutSize + "," + pullOutSize + ")"}
;})
谢谢!
最佳答案
根据文档,您可以在创建和弦/色带时将半径作为参数传递。
ribbon 的文档
// from documentation
var ribbon = d3.ribbon();
ribbon({
source: {startAngle: 0.7524114, endAngle: 1.1212972, radius: 240},
target: {startAngle: 1.8617078, endAngle: 1.9842927, radius: 240}
});
<!DOCTYPE html>
<meta charset="utf-8">
<style>
body {
font: 20px sans-serif;
}
.group-tick line {
stroke: #000;
}
.ribbons {
fill-opacity: 0.67;
}
</style>
<svg width="800" height="800">
<defs>
<linearGradient id="Gradient1">
<stop class="stop1" offset="0%"/>
<stop class="stop2" offset="50%"/>
<stop class="stop3" offset="100%"/>
</linearGradient>
<linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1">
<stop offset="0%" stop-color="red"/>
<stop offset="50%" stop-color="black" stop-opacity="0"/>
<stop offset="100%" stop-color="blue"/>
</linearGradient>
</defs>
</svg>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
var matrixData={
"Occupants":
[0, 10,10,10,10,0,0,0,10,10,10,10,10],
"Flooring":
[70,0,0,0,0,0,30,0,0,0,0,0,0],
"Millwork":
[40, 0,0,0,0,0,60,0,0,0,0,0],
"Ceilings":
[60, 0,0,0,0,0,40,0,0,0,0,0,0],
"Wet Applied Products":
[60, 0,0,0,0,0,40,0,0,0,0,0,0],
"Curtain Wall":
[0, 0,0,0,0,0,100,0,0,0,0,0,0],
"Environment":
[0, 10,10,10,10,0,10,0,10,10,10,0,10],
"Roofing":
[0, 0,0,0,0,0,80,0,0,0,0,0],
"Insulation":
[50, 0,0,0,0,0,50,0,0,0,0,0,0],
"MEPFP":
[40, 0,0,0,0,0,60,0,0,0,0,0,0],
"Structure":
[50, 0,0,0,0,0,50,0,0,0,0,0,0],
"Furniture":
[90, 0,0,0,0,0,10,0,0,0,0,0,0]
}
matrix= Object.values(matrixData);
matrixKeys = Object.keys(matrixData);
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height"),
outerRadius = Math.min(width, height) * 0.5 - 150,
innerRadius = outerRadius - 30;
var formatValue = d3.formatPrefix(",.0", 1e3);
var chord = d3.chord()
.padAngle(0.024)
.sortSubgroups(d3.descending);
var arc = d3.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius);
var ribbon = d3.ribbon();
var color = d3.scaleOrdinal()
.domain(d3.range(4))
.range(["#6FCDE3",
"#D7DAE5",
"#D7DAE5",
"#D7DAE5",
"#D7DAE5",
"#D7DAE5",
"#E5E52B",
"#D7DAE5",
"#D7DAE5",
"#D7DAE5",
"#D7DAE5",
"#D7DAE5"
]);
var g = svg.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ") rotate(75)")
.datum(chord(matrix));
var group = g.append("g")
.attr("class", "groups")
.selectAll("g")
.data(function(chords) { return chords.groups; })
.enter().append("g");
group.append("path")
.style("fill", function(d) { return color(d.index); })
.style("stroke", function(d) { return d3.rgb(color(d.index)).darker(); })
.attr("d", function(d,i) {
var radius = 0;
if(d.index%2 != 0) radius = 50;
return arc.innerRadius(innerRadius + radius)
.outerRadius(outerRadius + radius)(d);}).on("mouseover", function(d,i) {
fade(.1,d);
})
.on("mouseout", function(d,i) {
fade(1,d);
});
var groupTick = group.selectAll(".group-tick")
.data(function(d) { return groupTicks(d, 1e3); })
.enter().append("g")
.attr("class", "group-tick")
.attr("transform", function(d) {
var radius = 0;
if(d.index%2 != 0) radius = 50;
return "rotate(" + (d.angle * 180 / Math.PI - 75) +
") translate(" + (outerRadius + radius) + ",2)";
});
groupTick.append("line")
.attr("x2", 6);
groupTick
.filter(function(d) { return d.value % 5e3 === 0; })
.append("text")
.attr("x", 8)
.attr("dy", ".35em")
.attr("transform", function(d) { return d.angle > Math.PI/2 && d.angle < Math.PI*3/2 ? "rotate(180) translate(-16)" : null; })
.style("text-anchor", function(d) { return d.angle > Math.PI/2 && d.angle < Math.PI*3/2? "end" : null; })
.text(function(d) {
return matrixKeys[d.index];
});
g.append("g")
.attr("class", "ribbons")
.selectAll("path")
.data(function(chords) {
return chords; })
.enter().append("path")
.attr("d", function(d) {
if(d.source.index%2 == 0) d.source.radius = innerRadius;
else d.source.radius = innerRadius + 50;
if(d.target.index%2 == 0) d.target.radius = innerRadius;
else d.target.radius = innerRadius + 50;
return ribbon(d);
})
.attr("class", function(d,i) { return matrixKeys[d.index]})
.style("fill", function(d) { return color(d.target.index); })
.style("stroke", function(d) { return d3.rgb(color(d.target.index)).darker(); });
// Returns an array of tick angles and values for a given group and step.
function groupTicks(d, step) {
var k = (d.endAngle - d.startAngle) / d.value;
return d3.range(0, d.value, step).map(function(value) {
return {
index:d.index,
value: value,
angle: value * k + d.startAngle
};
});
}
function fade(opacity, d2) {
var hightLight = g.selectAll(".ribbons path").filter(function(d) {
return d.source.index != d2.index && d.target.index != d2.index;
});
hightLight.transition()
.style("opacity", opacity);
}
</script>
关于javascript - D3.js Chord Diagram - 使和弦接触拉开的弧线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53247071/
我使用Andrew的d3和弦图示例并希望将弯曲切片内的所有文本标签居中。我尝试了很多东西,但始终无法将文本居中。你知道需要什么巫师技巧吗? var width = 720, height = 720,
我正在尝试实现一个系统,在该系统中我可以同时播放一组频率,目前可以单独播放每个频率。下面我有一个代码,它播放给定的频率,一次播放一个。 import java.applet.*; im
是否可以一次重新映射使用 ctrl+k 作为第一个按键操作的所有和弦? 我使用 ctrl+k 删除该行的其余部分。由于它与 vscode 中使用的最常见和弦冲突,因此通过快捷方式重新映射快捷方式会很不
我是一名优秀的程序员,十分优秀!