python - 如何在代表相同标签的每个标记上方设置标题
问题描述
我在以下情节中有第一个版本的图例:
使用以下代码:
# Plot and save : kmax = 0.3
p11, = plt.plot([0], marker='None',
linestyle='None', label='$k_{max} = 0.3$')
p1, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,1], '-b', label = '$GC_{sp}$')
p2, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,2], '-r', label = '$GC_{ph}$')
p3, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,3], '-y', label = '$WL$')
p4, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,4], '-g', label = '$GC_{ph} + WL + XC$')
p5, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,5], '-m', label = \
'$GC_{sp} + (GC_{ph} + WL + XC)$')
# Plot and save : kmax = 1.0
p12, = plt.plot([0], marker='None',
linestyle='None', label='$k_{max} = 1.0$')
p6, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,1], '--b', label = '$GC_{sp}$')
p7, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,2], '--r', label = '$GC_{ph}$')
p8, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,3], '--y', label = '$WL$')
p9, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,4], '--g', label = '$GC_{ph} + WL + XC$')
p10, =plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,5], '--m', label = \
'$GC_{sp} + (GC_{ph} + WL + XC)$')
plt.legend(fontsize=14, loc='best', ncol=2, handleheight=1.4, labelspacing=0.05)
如您所见,我为每一列标记和列添加了标题(k_max = 0.3
和)。k_max = 1.0
现在,为了避免这种冗余,我试图合并所有重复的标签,同时保留每个标记的标题:
from matplotlib.legend_handler import HandlerTuple
# Plot and save : kmax = 0.3
p11, = plt.plot([0], marker='None', linestyle='None')
p1, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,1], '-b')
p2, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,2], '-r')
p3, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,3], '-y')
p4, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,4], '-g')
p5, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,5], '-m')
# Plot and save : kmax = 1.0
p12, = plt.plot([0], marker='None', linestyle='None')
p6, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,1], '--b')
p7, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,2], '--r')
p8, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,3], '--y')
p9, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,4], '--g')
p10, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,5], '--m')
l = plt.legend([(p1,p6), (p2,p7), (p3,p8), (p4,p9), (p5,p10)], ['$GC_{sp}$', \
'$GC_{ph}$', '$WL$', '$GC_{ph} + WL + XC$', '$GC_{sp} + (GC_{ph} + WL + XC)$'], \
fontsize=14, loc='best', handlelength=2.5, handleheight=1.4, labelspacing=0.05, \
handler_map={tuple: HandlerTuple(ndivide=None)})
这样,我得到下图:
然后,出现2个问题:
1)与上面的第一个图相比,2个标记之间的空间太小:如何在标记之间插入更大的空间以及标记本身的更多长度(例如,虚线标记有4条虚线,例如我的帖子开头上面第一个图的图例上的 4 条虚线标记)
2)如何将标题k_max = 0.3
和k_max = 1.0
每列标记放在上面?:这样,我可以快速识别出我在情节中考虑的情况(就像我在上面的第一个图中所做的那样,但是通过重复显示所有标签的两倍存在冗余)。
解决方案
要解决您的问题,您可以尝试以下方法:
1.1 要增加标记之间的空间,您可以pad
向HandlerTuple()
(从此处)提供附加参数。它将调整不同标记部分之间的间距。这看起来像:
l = plt.legend(..., handler_map={tuple: HandlerTuple(ndivide=None, pad=2)})
1.2 要为标记添加更多宽度,您可以handlelength
像这样增加参数的值:
l = plt.legend(..., handlelength=6.5, ...)
- 要在标记列上方指定描述,您可以将
p11, = plt.plot([0], marker='None', linestyle='None')
和p12, = plt.plot([0], marker='None', linestyle='None')
行修改为以下内容:
# your code:
# p11, = plt.plot([0], marker='None', linestyle='None')
# p12, = plt.plot([0], marker='None', linestyle='None')
p11, = plt.plot([], marker='$0.3$', linestyle='None', color='k', markersize=18, mec='None')
p12, = plt.plot([], marker='$1.0$', linestyle='None', color='k', markersize=18, mec='None')
[0]
用空列表替换[]
将导致实际上没有绘制任何内容。
mec='None'
将删除标记边缘颜色。没有它,标记看起来像用粗体写的。
要在图例中显示这些“线条”,请在图例中添加以下内容:
l = plt.legend([(p11,p12), ....], ['$k_{max}$', ...], ...)
通过这些调整,图例应如下所示:
完整的代码应如下所示:
# Plot and save : kmax = 0.3
p11, = plt.plot([], marker=r'$0.3$', linestyle='None', color='k', markersize=18, mec='None')
p1, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,1], '-b')
p2, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,2], '-r')
p3, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,3], '-y')
p4, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,4], '-g')
p5, = plt.plot(FoM_vs_Density_array_1[:,0],FoM_vs_Density_array_1[:,5], '-m')
# Plot and save : kmax = 1.0
p12, = plt.plot([], marker='$1.0$', linestyle='None', color='k', markersize=18, mec='None')
p6, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,1], '--b')
p7, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,2], '--r')
p8, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,3], '--y')
p9, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,4], '--g')
p10, = plt.plot(FoM_vs_Density_array_2[:,0],FoM_vs_Density_array_2[:,5], '--m')
l = plt.legend([(p11,p12),(p1,p6), (p2,p7), (p3,p8), (p4,p9), (p5,p10)], ['$k_{max}$','$GC_{sp}$', \
'$GC_{ph}$', '$WL$', '$GC_{ph} + WL + XC$', '$GC_{sp} + (GC_{ph} + WL + XC)$'], \
fontsize=14, loc='best', handlelength=6.5, handleheight=1.4, labelspacing=0.05, \
handler_map={tuple: HandlerTuple(ndivide=None, pad=2)})
要像您在第一张图片中显示的那样格式化列名,请使用:
# change marker and markersize
p11, = plt.plot([], marker=r'$k_{max}=0.3$', linestyle='None', color='k', markersize=45, mec='None')
p12, = plt.plot([], marker='$k_{max}=1.0$', linestyle='None', color='k', markersize=45, mec='None')
# change plt.legend, use 'borderpad' parameter to increase the legend box,
# otherwise part of the column name will be written out of bounds
# | change here
l = plt.legend([(p11,p12),(p1,p6), (p2,p7), (p3,p8), (p4,p9), (p5,p10)], ['','$GC_{sp}$', \
'$GC_{ph}$', '$WL$', '$GC_{ph} + WL + XC$', '$GC_{sp} + (GC_{ph} + WL + XC)$'], \
fontsize=14, loc='best', handlelength=6.5, handleheight=1.4, labelspacing=0.05, \
borderpad=0.6, # change here
handler_map={tuple: HandlerTuple(ndivide=None, pad=2)})
这将导致:
推荐阅读
- python - 如果在执行 iterrows 时匹配给定条件,则删除行
- vba - 在当前查看的页面上选择表格(不是当前选择的页面)
- ubuntu-16.04 - EAP-FAST 的 hostapd 基本配置?
- python - 有问题的 for 循环:重复打印包含目录中文件中的关键短语的行
- google-analytics - GTM 在会话期间保持相同的变量值
- javascript - 通过 reducer 获取相同的数据或空数据
- unity3d - 生成和显示数千个多边形的最佳实践
- javascript - React - 加载外部脚本的问题
- powershell - 用于填充描述字段的 Powershell 脚本
- for-loop - 使用 for 循环在 tkinter 中创建小部件网格