Pyplot图例多行文本多位置对齐:不使用等宽字体实现方案
Pyplot图例多位置对齐解决方案
问题描述
我尝试在Pyplot中创建整齐的图例,目前代码及效果如下:
fig = plt.figure() ax = plt.gca() marker_size = [20.0, 40.0, 60.0, 100.0, 150.0] marker_color = ['black', 'red', 'pink', 'white', 'yellow'] ranges = [0.0, 1.5, 20.0, 60.0, 500.0] marker_edge_thickness = 1.2 s = [(m ** 2) / 100.0 for m in marker_size] scatter_kwargs = {'edgecolors' : 'k', 'linewidths' : marker_edge_thickness} for i in range(len(marker_size)): if i == (len(marker_size) - 1): label_str = '{:>5.1f} $\leq$ H$_2$'.format(ranges[i]) else: label_str = '{:>5.1f} $\leq$ H$_2$ < {:>5.1f}'.format(ranges[i], ranges[i + 1]) ax.scatter([], [], s = s[i], c = marker_color[i], label = label_str, **scatter_kwargs) #ax.legend(prop={'family': 'monospace'}) ax.legend() plt.show()
当前图例的各行符号无法正确对齐,我希望将各行在小数点、大于/小于符号以及H₂处实现多位置对齐。我可以使用等宽字体,但该方案不仅美观性差,还与H₂的下标2存在兼容性问题。在LaTeX中可通过alignat环境实现该需求,请问Pyplot中是否可行?
解决方案
可以实现,Pyplot支持通过LaTeX的alignat或tabular环境构建对齐的图例标签,既能实现多位置精准对齐,又能保留非等宽字体的美观性。
实现步骤
- 启用LaTeX渲染:在代码开头配置matplotlib使用LaTeX处理文本,确保对齐语法生效。
- 重构标签逻辑:用
alignat*环境定义多列对齐点,让数值小数点、符号、H₂的位置在每行保持统一。
修改后的完整代码
import matplotlib.pyplot as plt # 启用LaTeX渲染,提升文本排版精度 plt.rcParams.update({ "text.usetex": True, "font.family": "serif", # 可选,使用衬线字体增强美观度 }) fig = plt.figure() ax = plt.gca() marker_size = [20.0, 40.0, 60.0, 100.0, 150.0] marker_color = ['black', 'red', 'pink', 'white', 'yellow'] ranges = [0.0, 1.5, 20.0, 60.0, 500.0] marker_edge_thickness = 1.2 s = [(m ** 2) / 100.0 for m in marker_size] scatter_kwargs = {'edgecolors' : 'k', 'linewidths' : marker_edge_thickness} for i in range(len(marker_size)): if i == (len(marker_size) - 1): # 最后一行闭合区间:补全右侧空白列,保持整体对齐 label_str = r'\begin{alignat*}{3} & {:5.1f} && \leq \text{H}_2 & {} \end{alignat*}'.format(ranges[i], "") else: # 区间行:通过alignat设置3组对齐点,固定小数点、符号、H₂的位置 label_str = r'\begin{alignat*}{3} & {:5.1f} && \leq \text{H}_2 & < {:5.1f} \end{alignat*}'.format(ranges[i], ranges[i + 1]) ax.scatter([], [], s=s[i], c=marker_color[i], label=label_str, **scatter_kwargs) # 调整图例位置,避免文本被截断 ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
关键说明
alignat*环境中的3代表设置3组对齐列,通过&&标记对齐位置,确保每行的数值小数点、$\leq$、H₂和$<$符号完全对齐。- 使用
\text{H}_2替代原有的H$_2$,在LaTeX环境下能更稳定地显示下标,解决字体兼容性问题。 - 启用LaTeX渲染后,可自由选择非等宽字体,兼顾对齐效果与美观性。
内容的提问来源于stack exchange,提问作者Harry Kuril
相关产品推荐
相关产品推荐

