d3.js - 在 d3 v4 中包含多色标签
问题描述
我正在尝试根据条件为 d3 图表的同一轴中的刻度标签文本分配不同的颜色,
var input = ["Vegetable", "Grains", "Fruits", "Ham"]
var ch = yaxis.selectAll("text");
ch.style( "fill", function() {
for(var i=0; i<input.length; i++) {
if(input[i].indexOf('Fruit') != -1) {
return "black";
}
else {
return "blue";
}
}
})
我的 y 轴将有来自输入数组的 4 个刻度。但我可以看到,它只适用一次,不考虑其他条件。
有什么办法,我可以在同一轴上有不同的颜色标签文本?
更新:我能够通过选择所有轴刻度然后更改其样式来实现这一点,
.style( "fill", function(d) {
for(var i=0; i<obj.length; i++) {
if(d.indexOf('*') == -1) {
return "black";
else {
return "red";
}
}
}```
解决方案
不确定我是否正确理解了您的想法,但是如果您希望包含“水果”的刻度用黑色填充,而其他刻度用蓝色填充,那么您的函数逻辑是错误的。
您不必迭代输入数组,只需将每个文本中绑定的数据传递给函数,并检查它是否包含“水果”字符串。
如果这不是你的意思,请更清楚地提供你的意图。
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="//d3js.org/d3.v4.min.js"></script>
<script>
let input = ["Vegetable", "Grains", "Fruits", "Ham"]
// set the dimensions and margins of the graph
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
// set the ranges
var y = d3.scaleBand()
.range([height, 0])
.padding(0.1);
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
y.domain(input.map(function(d) { return d; }));
// add the y Axis
let yaxis = svg.append("g")
.attr("class", "yaxis")
.call(d3.axisLeft(y));
let ch = yaxis.selectAll("text");
ch.style( "fill", function(d) {
// console.log(d);
if(d.indexOf("Fruit") !== -1) return "black";
else return "blue"
})
</script>
</body>
推荐阅读
- r - 如何使用 ggplot2 在多行中仅填充一行?
- python - 包装器类仅公开它所包装的类的属性的子集
- jsf - 自定义 jsf 资源包处理程序时出错
- javascript - 错误的反应顺序 DiscordBot
- android - 内部服务器错误 500;尝试使用 okhttp3 发布到 django rest 框架
- powerbi - Power BI 中的多个条形图
- rabbitmq - 何时在 RabbitMq 集群中使用持久队列?
- node.js - Lightsail AWS Node.js 永远开始
- c# - ASP.NET - 尝试使用登录用户保存数据库,而不是“创建”脚手架中所有用户的下拉列表
- nginx - 香草论坛 Nginx X_Rewrite 不起作用