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

如何实现TikZ堆叠条形图右侧数值的垂直对齐

解决方案

一、无需改现有结构,直接修复数值对齐

对齐问题本质是无衬线字体默认使用比例宽度数字,不同数字占位宽度不同,导致右对齐时数字的个位无法对齐,两个修复方案可选:

  • 方案1:全局启用libertine的等宽数字特性,在加载libertine包时加tnum参数即可:
\usepackage[lf, p, sflf, sfp, tnum]{libertine}

tnum参数会将所有数字设置为等宽样式,直接就能让1、9、10、11的个位对齐,百分号自然落在同一条竖线上。

  • 方案2:如果不想全局修改数字样式,仅给右侧数值使用等宽数字,修改numbox的样式增加字体配置即可:
\tikzstyle{numbox}   = [rectangle, minimum width = 2cm, draw = black, outer sep = 0, inner sep = 0, text width = 2cm, align = right, font=\fontfamily{LinuxLibertineT-TLF}\selectfont]

二、改用表格实现的方案(更易维护)

你现有代码里的坐标都是硬编码,修改数据就要重新计算所有高度,用表格+TikZ坐标绑定的方案更灵活,对齐精度也更高:

  1. 先移除所有手动写的\draw横线、invisbox/numbox节点代码
  2. 给pgfplots的轴设置别名,方便后续定位:
\begin{axis}[name=mainaxis, % 新增这一行
            % 其余原有参数保持不变
]
  1. 将表格作为TikZ节点放在轴的右侧,用\rule设置每一行的高度和堆叠分段高度完全一致,分隔线自然和条形图分割线对齐:
\node[anchor=north west, outer sep=0, inner sep=0] at (mainaxis.north east) {
    \renewcommand{\arraystretch}{0} % 关闭表格默认行高缩放
    \begin{tabular}{|p{7cm}|p{2cm}|}
    \hline
    \rule{0pt}{0.5cm} \textbf{Total} & \textbf{\SI{9}{\percent}} \\
    \hline
    \rule{0pt}{0.673cm} OS and Middleware & \SI{11}{\percent} \\
    \hline
    \rule{0pt}{0.758cm} Body and Energy & \SI{10}{\percent} \\
    \hline
    \rule{0pt}{0.505cm} Powertrain and Chassis & \SI{1}{\percent} \\
    \hline
    \rule{0pt}{1.515cm} Infotainment, Connectivity, Security & \SI{9}{\percent} \\
    \hline
    \rule{0pt}{3.62cm} Fahrerassistenzsysteme und autonomes Fahren & \SI{11}{\percent} \\
    \hline
    \end{tabular}
};

如果需要更灵活的适配,还可以通过pgfplots的接口自动读取堆叠分段的高度生成表格行高,后续修改数据时不需要手动调整高度数值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:15:07