跳到正文

用 pgfplots 绘制柱状图

在 pgfplots 的 axis 上加 ybar(竖直柱)或 xbar(水平条),用 symbolic x coords 命名类别,再用带坐标的 \addplot 给出每个系列。

带命名类别的竖直柱

坐标轴上的 ybar 会把每个系列都变成柱子。symbolic x coords 按顺序列出类别名称,xtick=data 在每根柱子下方放一个刻度。

一个系列的柱子

LaTeX导言区: \usepackage{pgfplots}在编辑器中打开 (在新标签页中打开)
\begin{tikzpicture}
  \begin{axis}[
      ybar, ymin=0,
      symbolic x coords={Mon, Tue, Wed, Thu, Fri},
      xtick=data,
      ylabel={Visitors},
      enlarge x limits=0.15,
    ]
    \addplot coordinates {(Mon,44) (Tue,31) (Wed,38) (Thu,27) (Fri,40)};
  \end{axis}
\end{tikzpicture}

柱子从零开始。不设置 ymin=0 时,坐标轴会在零以下留出一点空间,所以设置它可以让柱子立在边框上。enlarge x limits 在两侧留出空间,这样最外侧的柱子就不会被边框截断。

分组柱和数值标签

有多个系列时,每个类别的柱子会并排站立。nodes near coords 在每根柱子上方显示其数值,bar width 设置柱宽(默认 10pt)。

两个系列,柱子上标出数值

LaTeX导言区: \usepackage{pgfplots}在编辑器中打开 (在新标签页中打开)
\begin{tikzpicture}
  \begin{axis}[
      ybar, ymin=0, ymax=55, bar width=12pt,
      symbolic x coords={Erika, Hans, John},
      xtick=data, enlarge x limits=0.25,
      nodes near coords,
      ylabel={Points},
      legend style={at={(0.5,-0.12)}, anchor=north, legend columns=2},
    ]
    \addplot coordinates {(Erika,44) (Hans,31) (John,38)};
    \addplot coordinates {(Erika,40) (Hans,36) (John,29)};
    \legend{Round 1, Round 2}
  \end{axis}
\end{tikzpicture}
由 Scissor LaTeX 排版: 两个系列,柱子上标出数值

ybar=4pt 设置同一组内柱子之间的间隙(默认 2pt)。

堆叠柱

ybar stacked 把各系列叠放在一起,而不是并排放置。第二个 \addplot 从第一个结束的地方开始。

按季度堆叠的柱子

LaTeX导言区: \usepackage{pgfplots}在编辑器中打开 (在新标签页中打开)
\begin{tikzpicture}
  \begin{axis}[
      ybar stacked, ymin=0, bar width=16pt,
      symbolic x coords={Q1, Q2, Q3, Q4},
      xtick=data, enlarge x limits=0.2,
      legend pos=north west, ylabel={Sales},
    ]
    \addplot coordinates {(Q1,12) (Q2,18) (Q3,15) (Q4,22)};
    \addplot coordinates {(Q1,6) (Q2,9) (Q3,12) (Q4,10)};
    \legend{Online, In store}
  \end{axis}
\end{tikzpicture}

水平条

xbar 从左到右绘制条形。坐标轴的角色互换:类别写在 symbolic y coords 和 ytick=data 中,每个坐标写成(数值, 类别)。

水平条形图

LaTeX导言区: \usepackage{pgfplots}在编辑器中打开 (在新标签页中打开)
\begin{tikzpicture}
  \begin{axis}[
      xbar, xmin=0, xmax=50,
      symbolic y coords={Rust, Python, C},
      ytick=data, enlarge y limits=0.3,
      nodes near coords, xlabel={Projects},
      width=8cm, height=5cm,
    ]
    \addplot coordinates {(44,Rust) (31,Python) (12,C)};
  \end{axis}
\end{tikzpicture}

xbar stacked 也可以使用。

以数字作为类别

年份和其他数字不需要 symbolic x coords:把它们当作数字绘制,并使用 xtick=data。pgfplots 默认把 2024 写成“2,024”;请在刻度标签样式中关闭千位分隔符。

x 轴上的年份

LaTeX导言区: \usepackage{pgfplots}在编辑器中打开 (在新标签页中打开)
\begin{tikzpicture}
  \begin{axis}[
      ybar, ymin=0, xtick=data, enlarge x limits=0.25,
      x tick label style={/pgf/number format/1000 sep=},
    ]
    \addplot coordinates {(2023,18) (2024,31) (2025,44)};
  \end{axis}
\end{tikzpicture}

选项一览

选项作用在 Scissor LaTeX 中
ybar、xbar并排的竖直柱或水平条支持
ybar=4pt同一组内柱子之间的间隙支持
ybar stacked、xbar stacked叠放的柱子在线性坐标轴上支持
bar width=12pt每根柱子的宽度支持
bar shift=..把一个系列向侧面移动支持
nodes near coords每根柱子上方(或旁边)的数值支持
symbolic x coords、symbolic y coords命名类别支持,看起来像数字的名称除外(没有刻度标签)
xticklabel style={rotate=45, anchor=east}倾斜的类别名称支持
ybar interval填满相邻 x 值之间空间的柱子部分支持:在 x 值处画成普通柱子
hist(statistics 库)把数值分到各个区间并计数不支持:会被忽略并给出提示,原始数值画成一条线

与 TeX 发行版的不同之处

本页所有示例在装有 pgfplots 的 TeX 发行版中也能编译。手册:ctan.org/pkg/pgfplots。

另请参阅 pgfplots 基础、误差棒、来自 CSV 的数据和 pgfplots。

常见问题

如何在 LaTeX 中绘制柱状图?

加载 pgfplots,写 \begin{axis}[ybar, symbolic x coords={A,B,C}, xtick=data],每个系列一个 \addplot coordinates {(A,3) (B,5) (C,2)};。

如何在柱子顶端显示数值?

在坐标轴选项中加 nodes near coords。每根柱子都会以其数值作为标签。

如何让柱子从零开始?

它们本来就从零开始。在坐标轴上设置 ymin=0(对 xbar 则是 xmin=0),可以去掉柱子下方的空白。

本页的每个示例都在构建网站时由 Scissor LaTeX 排版。 最后更新:2026-11-07