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

如何为React中Recharts柱状图设置柱宽?代码无效求可行方案

解决Recharts柱状图自定义柱条宽度的问题

方法一:修正width属性的参数获取(控制柱子垂直厚度/水平柱状图高度)

原代码的问题在于width函数的参数使用错误,Recharts传递给该函数的是包含data字段的对象,而非直接的数据源项。修改后代码如下:

import React from "react";
import { Bar, BarChart, ResponsiveContainer, Tooltip } from "recharts";

interface BarData {
  name: string;
  value: number;
  width: number;
}

const data: BarData[] = [
  { name: "Bar 1", value: 10, width: 40 },
  { name: "Bar 2", value: 20, width: 60 },
  { name: "Bar 3", value: 30, width: 80 },
];

const Barchart: React.FC = () => {
  return (
    <ResponsiveContainer height={400}>
      <BarChart data={data} layout="horizontal" barGap={10}>
        <Bar
          dataKey="value"
          // 正确获取数据源中的width字段
          width={(props) => props.data.width}
          fill="#5e5e5e"
          radius={[0, 4, 4, 0]}
        />
        <Tooltip />
      </BarChart>
    </ResponsiveContainer>
  );
};

export default Barchart;

注意:layout="horizontal"模式下,width属性控制柱子的垂直高度;垂直柱状图模式下,width控制柱子的水平宽度。

方法二:使用cellRender完全自定义柱条(灵活控制尺寸)

如果需要更精细的尺寸控制,比如同时调整水平长度和垂直厚度,可通过cellRender自定义每个柱条的渲染逻辑:

import React from "react";
import { Bar, BarChart, ResponsiveContainer, Tooltip, CellProps } from "recharts";

interface BarData {
  name: string;
  value: number;
  barWidth: number; // 垂直厚度
  barLength: number; // 水平长度
}

const data: BarData[] = [
  { name: "Bar 1", value: 10, barWidth: 40, barLength: 150 },
  { name: "Bar 2", value: 20, barWidth: 60, barLength: 250 },
  { name: "Bar 3", value: 30, barWidth: 80, barLength: 350 },
];

const CustomBarCell = ({ x, y, data }: CellProps<BarData>) => {
  return (
    <rect
      x={x}
      y={y - data.barWidth / 2} // 保持柱条垂直居中
      width={data.barLength}
      height={data.barWidth}
      fill="#5e5e5e"
      rx={4}
    />
  );
};

const Barchart: React.FC = () => {
  return (
    <ResponsiveContainer height={400}>
      <BarChart data={data} layout="horizontal">
        <Bar dataKey="value" cellRender={CustomBarCell} />
        <Tooltip />
      </BarChart>
    </ResponsiveContainer>
  );
};

export default Barchart;

方法三:用自定义宽度字段控制水平长度

如果需求是让柱条的水平长度由width字段决定而非value,直接将dataKey替换为width即可:

// 其他代码不变
<Bar
  dataKey="width" // 用width字段作为柱条水平长度的依据
  width={40} // 统一设置柱条的垂直厚度
  fill="#5e5e5e"
  radius={[0, 4, 4, 0]}
/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:49:59