如何在表示相同标签的每个标记上方设置标题

2024-05-31 21:11:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在下面的情节中有一个传说的第一个版本:

2 columns into legend

使用以下代码:

# 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.3k_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)})

这样,我得到了下图:

same labels for 2 markers

然后,出现两个问题:

1)与上面的第一个图相比,两个标记之间的空间太小:如何在标记之间插入更大的空间以及标记本身的长度(例如,有4条虚线作为虚线标记,就像我文章开头第一幅图图例上的4条虚线标记一样)

2)如何将标题k_max = 0.3k_max = 1.0放在标记的每一列之上通过这种方式,我可以很快地识别出我在情节上考虑的情况(就像我在上面的第一个图上所做的那样,但是通过重复两次显示所有标签而产生冗余)。p>


Tags: 标记noneplotpltdensityarrayphgc
1条回答
网友
1楼 · 发布于 2024-05-31 21:11:24

要解决您的问题,您可以尝试以下方法:

1.1要增加标记之间的间距,可以提供额外的参数padHandlerTuple()(从here)。它将调整不同标记段之间的间距。这将看起来像:

l = plt.legend(..., handler_map={tuple: HandlerTuple(ndivide=None, pad=2)})

1.2要增加标记的宽度,可以增加handlelength参数的值,如下所示:

l = plt.legend(..., handlelength=6.5, ...)

使用这些值生成的结果如下所示: Part 1 solution

  1. 要在标记列上方指定描述,可以将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}$', ...], ...)

通过这些调整,图例应如下所示:

Part 2 solution

完整的代码应该如下所示:

# 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)})

这将导致:

Part 2 alternative solution

相关问题 更多 >