【问题标题】:Adding labels to a legend with dynamic colours使用动态颜色向图例添加标签
【发布时间】:2016-05-05 14:26:09
【问题描述】:

我目前正在使用 d3.js 制作多线图。我目前正在寻找一个简单的图例,通过将字体设置为图表中相应颜色的样式来描述每行客户端名称及其线条颜色。

我的测试数据如下所示:

var data = [{
                    "Client": "ABC",
                    "sale": "202",
                    "time": "09:00"
                }, {
                    "Client": "ABC",
                    "sale": "215",
                    "time": "11:00"
                }, {
                    "Client": "ABC",
                    "sale": "179",
                    "time": "12:00"
                }, {
                    "Client": "ABC",
                    "sale": "199",
                    "time": "13:00"
                }, {
                    "Client": "ABC",
                    "sale": "134",
                    "time": "15:00"
                }, {
                    "Client": "ABC",
                    "sale": "176",
                    "time": "16:00"
                }, {
                    "Client": "ABC",
                    "sale": "197",
                    "time": "17:00"
                }, {
                    "Client": "XYZ",
                    "sale": "100",
                    "time": "09:00"

                ...etc

                }];

通过使用 d3.nest(),我按其客户端名称对 json 进行了排序,现在生成如下所示的数据:

[{
"key": "ABC",
"values": [{
    "Client": "ABC",
    "sale": "202",
    "year": "2000"
}, {
    "Client": "ABC",
    "sale": "215",
    "year": "2002"
}, {
    "Client": "ABC",
    "sale": "179",
    "year": "2004"
}, {
    "Client": "ABC",
    "sale": "199",
    "year": "2006"
}, {
    "Client": "ABC",
    "sale": "134",
    "year": "2008"
}, {
    "Client": "ABC",
    "sale": "176",
    "year": "2010"
}]
}, {
    "key": "XYZ",
    "values": [{
        "Client": "XYZ",
        "sale": "100",
        "year": "2000"
    }, { ...etc

我在上面生成的新 json 称为“dataGroup”。我正在尝试使用迭代在我的 DOM 上填充一个 div,其中客户端名称采用各自的颜色,我使用 d3.scale.category10();

这是我当前的 div 代码:

dataGroup.forEach(function(d, i){

        d3.select("#value")
            .append("text")
            .data(dataGroup)
            .style("color", function(d, i){
                return colours(i);
            })
            .text(function(d){
                return d.key;
            });
    });

到目前为止,所有这一切都是返回第一个客户端 (ABC),然后停止。据我了解,我认为 d3 会遍历 dataGroup 中的所有键,但事实并非如此。我尝试在文本函数中放置一个 for 循环,但这也无济于事。

有什么建议吗?

【问题讨论】:

    标签: javascript jquery css json d3.js


    【解决方案1】:

    这里有问题。如果您正确绑定数据,D3 将进行迭代。你可以这样做:

    首先,选择你想要的 div 或 span:

    var clientText = d3.select("#value");
    

    然后,为文本创建一个变量,并按以下顺序绑定来自dataGroup 的数据:

    var texts = clientText.selectAll(".clients")
      .data(dataGroup)
      .enter()
      .append("text");
    

    我们称之为“选择-数据-输入-追加”序列。

    然后,您可以执行其余的代码:

    texts.style("color", function(d, i){
                return colors(i);
            })
            .text(function(d){
                return d.key;
            });
    

    这将按顺序打印所有名称,而不是最漂亮的结果。

    这里是小提琴:https://jsfiddle.net/uwLcrzxk/

    【讨论】:

    • 好的,我尝试了这个方法,用我的 div 类的名称替换了“#svganchor”(在本例中为“#value”),但现在图例中没有出现任何内容。我错过了什么吗?
    • 对不起那个ID,我的错,我同时写了3个代码。所有的钥匙都印给了我。请注意我在你有“颜色”的地方写了“颜色”。你能分享一个工作的 plunker 或 jsfiddle 吗?
    • 恐怕它不工作。期望的输出应该是来自数据的 3 个不同的客户端,即 ABC、XYZ 和 PQR。到目前为止,它只显示 ABC 3 次。
    • @MarkO'Hare,非常抱歉,我同时在做几件事。我的错。我更新了我的答案,它现在可以工作了。
    【解决方案2】:

    尝试将.data(dataGroup) 移动到.append("text") 之前,然后添加.enter(),如下所示:

    d3.select("#value")
                .data(dataGroup)
                .enter()
                .append("text")
                .style("color", function(d, i){
                    return colours(i);
                })
                .text(function(d){
                    return d.key;
                });
    

    【讨论】:

    • 这似乎没有什么不同。它仍然只拿起第一把钥匙
    • 您是否尝试过使用enter(),就像提到的@Gerardo 一样?我也用那行更新了我的答案。
    • 现在您有了更好的选择数据输入附加模式。
    • 添加 .enter() 会导致 div 中根本没有出现任何内容。
    猜你喜欢
    • 2018-05-18
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多