如何实现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坐标绑定的方案更灵活,对齐精度也更高:
- 先移除所有手动写的
\draw横线、invisbox/numbox节点代码 - 给pgfplots的轴设置别名,方便后续定位:
\begin{axis}[name=mainaxis, % 新增这一行 % 其余原有参数保持不变 ]
- 将表格作为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
相关产品推荐
相关产品推荐

