用 pgfplots 绘制柱状图
在 pgfplots 的 axis 上加 ybar(竖直柱)或 xbar(水平条),用 symbolic x coords 命名类别,再用带坐标的 \addplot 给出每个系列。
带命名类别的竖直柱
坐标轴上的 ybar 会把每个系列都变成柱子。symbolic x coords 按顺序列出类别名称,xtick=data 在每根柱子下方放一个刻度。
一个系列的柱子
\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)。
两个系列,柱子上标出数值
\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}ybar=4pt 设置同一组内柱子之间的间隙(默认 2pt)。
堆叠柱
ybar stacked 把各系列叠放在一起,而不是并排放置。第二个 \addplot 从第一个结束的地方开始。
按季度堆叠的柱子
\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 中,每个坐标写成(数值, 类别)。
水平条形图
\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 轴上的年份
\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