【问题标题】:include multi color labels in d3 v4在 d3 v4 中包含多色标签
【发布时间】:2021-01-09 14:14:55
【问题描述】:

我正在尝试根据条件为 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 个刻度。 但我可以看到,它只适用一次,不考虑 else 条件。

有什么方法可以在同一轴上使用不同颜色的标签文本?

更新: 我可以通过选择所有轴刻度然后更改其样式来实现这一点,

.style( "fill", function(d) {
            for(var i=0; i<obj.length; i++) {
                if(d.indexOf('*') == -1)    {
                                            return "black";
                                        else    {
                                            return "red";
                                        }
                                    }
                                }```

【问题讨论】:

    标签: d3.js


    【解决方案1】:

    不确定我是否正确理解了您的想法,但如果您希望包含“水果”的刻度用黑色填充,而其他刻度用蓝色填充,那么您的函数逻辑是错误的。

    您不必迭代输入数组,只需将每个文本中绑定的数据传递给函数,并检查它是否包含'Fruit'字符串。

    如果这不是你的意思,请更清楚地说明你的意图。

    <!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>

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 1970-01-01
      • 2012-10-25
      • 2018-11-21
      • 1970-01-01
      • 2016-11-08
      • 2018-12-04
      相关资源
      最近更新 更多