You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React+D3开发中为柱状图的每个柱子设置独立颜色

问题解决方案

错误原因

你将fill属性配置在了未绑定数据集的<g>容器元素上,<g>元素本身没有对应每个柱子的数据,回调中的索引i固定为0,所有子元素<rect>会继承同一个填充色,因此所有柱子颜色统一。

修改方案

将填充色配置从<g>元素转移到已绑定数据的<rect>元素上,即可通过每个柱子对应的索引取颜色数组中的独立值。

修改前的错误代码段:

svg.append('g')
    .attr('fill', function (d, i, j) {
        console.log(d, j, i);
        return colors[i];
    })
    .selectAll('rect')
    .data(data)
    .join('rect')
    .attr('x', (d, i) => x(i))
    .attr('y', (d) => y(d.quantity))
    .attr('height', (d) => y(0) - y(d.quantity))
    .attr('width', x.bandwidth());

修改后的正确代码段:

svg.append('g')
    .selectAll('rect')
    .data(data)
    .join('rect')
    .attr('x', (d, i) => x(i))
    .attr('y', (d) => y(d.quantity))
    .attr('height', (d) => y(0) - y(d.quantity))
    .attr('width', x.bandwidth())
    // 为每个独立的rect元素设置填充色,i为当前柱子的索引
    .attr('fill', (d, i) => colors[i])

可选优化(推荐)

如果需要固定分类对应的颜色(不受数据排序变化影响),可以使用d3序数比例尺映射分类和颜色:

// 在colors定义后添加比例尺
const colorScale = d3.scaleOrdinal()
  .domain(data.map(item => item.category))
  .range(colors);

// 填充色改为按分类取值
.attr('fill', d => colorScale(d.category))

内容的提问来源于stack exchange,提问作者klaurtar1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 12:45:02