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

堆叠条形图Y轴经办人名称标签重叠,如何增加间距优化可读性?

解决Y轴经办人名称标签重叠问题

我正在开发一款以经办人名称为Y轴的堆叠条形图,当经办人数量过多时,Y轴的名称标签会出现重叠(示例图如下),希望通过增加标签间距让文字清晰可读。

经办人过多时的图表截图

图表组件代码

import React, { useRef } from "react";
import {
  Chart as ChartJS,
  CategoryScale,
  LinearScale,
  BarElement,
  Title,
  Tooltip,
  Legend,
} from "chart.js";
import { Bar, getElementsAtEvent } from "react-chartjs-2";
import { type StackedChartProps } from "next/types";
import Loading from "../loading";

ChartJS.register(
  CategoryScale,
  LinearScale,
  BarElement,
  Title,
  Tooltip,
  Legend
);

export const options = {
  indexAxis: "y" as const,
  plugins: {},
  resposive: true,
  scales: {
    x: {
      stacked: true,
      beginAtZero: true,
      ticks: {
        autoSkip: false,
      },
    },
    y: {
      stacked: true,
      ticks: {
        autoSkip: false,
      },
    },
  },
};

type StackedBarProps = StackedChartProps;

export default function StackedBarChart({
  onClick,
  width,
  height,
  isLoading,
  level,
  data,
}: StackedBarProps) {
  const ref = useRef<ChartJS<"bar", any, any> | null>(null);

  const handleClick = (e: any) => {
    const field =
      data.labels[getElementsAtEvent(ref.current as any, e)[0]?.index ?? 0];
    if (ref.current && onClick) onClick(field, level);
  };

  return (
    <div className="flex justify-center bg-white">
      {isLoading ? (
        <Loading className={`w-[${width}] h-[${height}]`} />
      ) : (
        <Bar options={options} ref={ref} data={data} onClick={handleClick} />
      )}
    </div>
  );
}

图表数据计算代码

const dataset: StackedChartData = {
      labels: assignees,
      datasets: stages.map((stage) => ({
        label: stage,
        data: [],
        backgroundColor: getStatusColor(stage),
      })),
    };

    dataset.datasets.forEach((data, datasetIndex) => {
      dataset.labels.forEach((label) => {
        let count = 0;
        issues.forEach((issue) => {
          if (issue.fields.assignee?.displayName !== label) return;
          if (
            normalizeString(data.label) !==
            normalizeString(issue.fields.status.name)
          )
            return;
          count++;
        });
        dataset.datasets[datasetIndex]?.data.push(count);
      });
    });

解决方案

1. 调整Y轴间距与图表高度

先修正options里的拼写错误:resposive改为responsive,然后通过以下配置增加标签间距:

export const options = {
  indexAxis: "y" as const,
  plugins: {},
  responsive: true,
  maintainAspectRatio: false, // 取消宽高比限制,让图表高度自适应内容
  scales: {
    x: {
      stacked: true,
      beginAtZero: true,
      ticks: {
        autoSkip: false,
      },
    },
    y: {
      stacked: true,
      barThickness: 20, // 固定条形厚度,避免过度拥挤
      minBarLength: 5, // 确保短条形也有可见长度
      ticks: {
        autoSkip: false,
        padding: 10, // 增加标签与条形的间距
      },
    },
  },
};

同时给图表容器设置最小高度,保证标签有足够空间:

<div className="flex justify-center bg-white min-h-[600px]">
  {/* 图表内容 */}
</div>

2. 标签自动换行或缩小字体

如果间距调整后仍拥挤,可通过自动换行或缩小字体优化:

y: {
  ticks: {
    autoSkip: false,
    padding: 10,
    font: {
      size: 12, // 缩小标签字体
    },
    maxRotation: 0, // 禁止标签旋转,保持水平
    minRotation: 0,
    callback: (value) => {
      const label = value as string;
      // 每6个字符自动换行,可根据需求调整长度
      return label.length > 6 ? label.replace(/(.{6})/g, "$1\n") : label;
    },
  },
}

3. 添加垂直滚动容器

若经办人数量极多,给图表容器添加垂直滚动,避免页面过长:

<div className="flex justify-center bg-white overflow-y-auto max-h-[800px]">
  <Bar options={options} ref={ref} data={data} onClick={handleClick} />
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:12:03