Sawana Huang Avatar

Sawana Huang

Chart Topic

Stacked Bar Chart

Sat Mar 14 2026

同时表达总量与构成的图表类型,适合做市场结构、分层渠道和来源拆解。

为什么值得单独做专题

堆叠柱状图的价值在于它能在一根柱子里同时回答两个问题:总量有多大,以及总量内部是如何组成的。

"use client";import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from "recharts";import {  ChartContainer,  ChartLegend,  ChartLegendContent,  ChartTooltip,  ChartTooltipContent,  type ChartConfig,} from "@/components/ui/chart";const data = [  { segment: "SMB", organic: 42, paid: 22, referral: 16 },  { segment: "Mid", organic: 58, paid: 31, referral: 18 },  { segment: "Enterprise", organic: 64, paid: 45, referral: 21 },  { segment: "APAC", organic: 36, paid: 19, referral: 14 },];const chartConfig = {  organic: {    label: "Organic",    color: "var(--new-home-accent-1)",  },  paid: {    label: "Paid",    color: "var(--new-home-accent-4)",  },  referral: {    label: "Referral",    color: "var(--new-home-accent-3)",  },} satisfies ChartConfig;export function StackedBarChartDemo() {  return (    <ChartContainer config={chartConfig} className="min-h-[320px] w-full">      <BarChart data={data} margin={{ top: 12, right: 12, left: -6 }}>        <CartesianGrid vertical={false} strokeDasharray="3 3" />        <XAxis dataKey="segment" tickLine={false} axisLine={false} />        <YAxis tickLine={false} axisLine={false} width={28} />        <ChartTooltip content={<ChartTooltipContent />} />        <ChartLegend content={<ChartLegendContent />} />        <Bar          dataKey="organic"          stackId="a"          fill="var(--color-organic)"          radius={[0, 0, 6, 6]}        />        <Bar dataKey="paid" stackId="a" fill="var(--color-paid)" />        <Bar          dataKey="referral"          stackId="a"          fill="var(--color-referral)"          radius={[6, 6, 0, 0]}        />      </BarChart>    </ChartContainer>  );}

适合什么场景

  • 拆解某个业务单元内部的渠道构成
  • 比较不同人群、市场、地区的结构差异
  • 展示“总体增长来自哪里”

使用时要小心

  • 第一层以外的区块不容易做精确比较
  • 堆叠层数一多,阅读门槛会明显上升
  • 如果你只关心构成,不关心总量,可以考虑 100% stacked bar

实现要点

  1. 层级顺序要稳定,避免不同图之间的颜色含义漂移。
  2. 把最关键的系列放在最容易比较的位置。
  3. 如果用户需要精读数值,最好在 tooltip 里同时给出单值和总值。

代码说明

这个 demo 适合作为“渠道来源拆解”类专题的起点,后续也可以扩成横向 stacked bar、100% stacked bar 或带注释的 narrative 版本。