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

React使用Recharts绘制多色柱状图全部显示为黑色如何解决

问题原因

你遇到的多柱全黑、单柱颜色正常的问题,核心是fill字段取值逻辑错误:

  • 代码中data.map((m) => m.title)执行后返回的是完整标题数组,单柱时返回['A']、多柱时返回['A','B','C']
  • JS中用数组作为对象键取值时,会自动把数组转成字符串:单柱时['A']转成字符串'A',刚好能匹配COLORS里的键取到正确颜色;多柱时数组转成'A,B,C',在COLORS中找不到对应键,拿到的fill值是undefined
  • Recharts接收到无效fill值时,多柱场景会直接fallback为纯黑色,和你观察到的现象完全一致。
修复方案

Recharts中给同一数据序列的不同柱体设置独立颜色,不能给Bar组件传全局静态fill值,需要通过Cell子组件逐柱指定对应颜色,修正后的原生Recharts实现代码如下:

import { BarChart, Bar, XAxis, YAxis, Tooltip, Legend, Cell } from 'recharts';

export default function Overview() {
    const { ratingBar } = graphs ?? {}

    const COLORS = {
        'A': 'red',
        'B': 'green',
        'C': 'orange',
    }

    return (
        <div>
            <BarChart width={600} height={300} data={ratingBar}>
                <XAxis dataKey="title" tick={{ style: { fontSize: '.9rem' } }} />
                <YAxis dataKey="count" domain={[0, 100]} />
                <Tooltip />
                <Legend />
                <Bar dataKey="count">
                    {ratingBar?.map((entry, index) => (
                        <Cell key={`cell-${index}`} fill={COLORS[entry.title]} />
                    ))}
                </Bar>
            </BarChart>
        </div>
    )
}

如果你使用的是基于Recharts二次封装的配置式图表组件,只需要在bars配置中补充单元格配置项,按照上述逐柱传色的逻辑实现即可,核心是不要给整个柱组传无效的全局fill值,要为每个独立柱体单独指定fill属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:45:18