【问题标题】:D3 Bar Chart Bars Color ScalingD3 条形图 条形颜色缩放
【发布时间】:2021-02-08 19:29:02
【问题描述】:

我有一个具有动态条形着色的条形图。我想确保每次初始化条形图时每个值都保持相同的颜色。

对于我正在使用的颜色缩放:

const color = d3.scaleOrdinal()
                .domain(arr.map(d => d.key))
                .range(d3.schemeSet2);

        let bars = plot.selectAll("rect")
                      .data(arr)

        bars.enter() 
            .append('rect')
            .merge(bars)
                .attr("x", d => xScale(d.key))
                .attr('y', d => yScale(d.value))
                .attr("width", xScale.bandwidth())
                .attr('height',  d => height - (margin.top + margin.bottom) - yScale(d.value))
                .style("fill", d => color(d.key))

我的数据如下:

let arr = [{key: "Software Engineering", value: 68,
{key: "Biomedical Engineering", value: 63},
{key: "Mechanical Engineering", value: 52},
{key: "Other Engineering", value: 46}]

数据被动态地附加到这个数组中。如果数据以相同的顺序附加,则条形的颜色在此项目的不同组件中保持相同。但是,如果附加的数据不同,条形的颜色会发生变化。例如:

let arr = [{key: "Software Engineering", value: 68,
{key: "Mechanical Engineering", value: 52},
{key: "Biomedical Engineering", value: 63},
{key: "Other Engineering", value: 46}]

我无法将颜色硬编码为“软件工程”等,因为值可能会改变。但是,我希望“软件工程”具有相同的颜色,与它何时添加到数组无关。

另一个颜色变化的例子是如果从数组中删除一个值,一个例子是:

let arr = [{key: "Software Engineering", value: 68,
{key: "Mechanical Engineering", value: 52},
{key: "Other Engineering", value: 46}]

有什么建议吗?

【问题讨论】:

  • 会根据键属性对数组进行排序有帮助吗?当然,您仍然可以通过当前元素之间的键来获取新元素,但至少您随时可以更确定顺序。例如,“Biomedical Engineering”将始终出现在“Mechanical Engineering”之前(如果您要按字母顺序排序)。
  • @Erik 这样做有问题,一个出现在另一个之前。如果列表更短,在一种情况下,最后一个元素将与之前的初始化不同。

标签: javascript d3.js


【解决方案1】:

当您定义图表时,创建一个颜色域,其中的键只能添加,不能删除。例如,您可以使用 Set。

例子:

I - 固定部分

colorDomain = new Set();
...

II - 动态部分

每次数组改变时,执行这个

...
let arr = [{key: "Software Engineering", value: 68,
           {key: "Mechanical Engineering", value: 52},
           {key: "Biomedical Engineering", value: 63},
           {key: "Other Engineering", value: 46}];

arr.map(item => colorDomain.add(item.key));

colors.domain(Array.from(colorDomain));

【讨论】:

  • 我喜欢这个解决方案,并且我发现在没有额外映射的情况下非常相似。感谢您的帮助!
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2011-08-03
  • 2012-01-19
相关资源
最近更新 更多