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

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环境构建对齐的图例标签,既能实现多位置精准对齐,又能保留非等宽字体的美观性。

实现步骤

  1. 启用LaTeX渲染:在代码开头配置matplotlib使用LaTeX处理文本,确保对齐语法生效。
  2. 重构标签逻辑:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:01:13