如何在 Recharts X 轴刻度标签中显示多行?

How to display multiple lines in Recharts X-Axis tick label?

我被要求将长字符串值作为我的 X 轴刻度标签。

我尝试了其他图表库,但总的来说,这个库最适合我的情况。我只是不知道如何处理 x 轴标签。

我试图通过图表下方的值创建一个单独的 divmap,但是当超过 7 个或8 个 x 轴值。

我有一个 tickFormatter 函数,可以在一定数量的 characters/hid 溢出处剪切字符串,并在 x 轴上设置一个角度,但他们仍然对此不满意.

这是我目前的代码,我觉得它非常接近可行,我只是希望我能让文本换行到更多行。

使用 SVG 对我来说非常混乱,我尝试编写将 return SVG 文本元素作为自定义刻度的函数,但我无法让它工作。或者当我传递一些东西时,它 returns [object Object] 作为标签。

 const data = React.useMemo(() => {
 return orderOfItems?.map((claim, i) => ({
  Item: i + 1,
  Claim: claim.split(" ").join("\n"),
  Reach: (
    incrementalReachSummary[claim]?.Summary_Metrics.Reach * 100
  ).toFixed(1),
}));
}, [orderOfItems, incrementalReachSummary]);

const tickFormatter = (value: string) => {
const limit = 10; // put your maximum character

if (value.length < limit) return value;
return `${value.split(" ").join("\n")}...`;
};

return (
 <>
  <ResponsiveContainer
    align={"end"}
    w={"60%"}
    height={200}
    aspect={2}
    minWidth={"undefined"}
    maxHeight={"undefined"}
  >
    <LineChart
      data={data}
      margin={{
        top: 50,
        right: 250,
        left: 250,
        bottom: 500,
      }}
    >
      <CartesianGrid
        strokeDasharray="3"
        opacity={colorMode === "dark" ? 0.3 : 0.9}
      />
      <XAxis
        // hide={true}
        dataKey={"Claim"}
        interval="preserveStartEnd"
        angle={-35}
        tickFormatter={tickFormatter}
        textAnchor={"end"}
        axisLine={false}
        offset={5}
        tickMargin={10}
        style={{
          fill: colorMode === "dark" ? "#FFFFFF" : "#1A202C",
          textAlign: "center",
        }}
      >
        {/*<Label value="Claim" offset={100} position="bottom" />*/}
      </XAxis>
      <YAxis
        type={"number"}
        domain={[0, 100]}
        axisLine={false}
        tickLine={false}
        tickCount={7}
        tickMargin={10}
        tickFormatter={(Reach) => `${Reach}%`}
        style={{ fill: colorMode === "dark" ? "#FFFFFF" : "#1A202C" }}
      />
      <Tooltip content={<CustomToolTip />} />
      <Line
        type="monotone"
        strokeWidth={3}
        dataKey="Reach"
        stroke="#3182CE"
        activeDot={{ r: 9 }}
      >
        <LabelList
          dataKey="Reach"
          offset={14}
          position="insideTopLeft"
          formatter={(Reach) => `${Reach}%`}
          fill={colorMode === "dark" ? "#FFFFFF" : "#1A202C"}
        />
      </Line>
    </LineChart>
  </ResponsiveContainer>

您需要创建自定义 tick React 组件。换行符将不起作用。您将需要使用具有正确 dy 或垂直位置的多个 <tspan> 组件。同时增加图表 bottom 以便不隐藏线条。

使用 payload.value 访问原始值并创建所需数量的 tspans

<XAxis tick={<CustomizedTick />} />

例子

function CustomizedTick(props) {
    const { x, y, stroke, payload } = props;
    return (
        <g transform={`translate(${x},${y})`}>
        <text x={0} y={0} dy={16} fill="#666">
          <tspan textAnchor="middle" x="0">
            Line 1
          </tspan>
          <tspan textAnchor="middle" x="0" dy="20">
            Line 2
          </tspan>
          <tspan textAnchor="middle" x="0" dy="40">
            Line 3
          </tspan>
        </text>
      </g>
    );
  }

工作codesandbox