【问题标题】:How to set a title above each marker which represents a same label如何在代表相同标签的每个标记上方设置标题
【发布时间】:2020-11-11 02:51:23
【问题描述】:

我在下面的情节中有第一个版本的图例:

使用以下代码:

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

这样,我得到下图:

然后,出现 2 个问题:

1) 2 个标记之间的空间与上面的第一个图相比太小:如何在标记之间插入更大的空间并为标记本身插入更多的长度(例如,有 4 个破折号-虚线标记的线条,例如我帖子开头上面第一个图的图例上的4个虚线标记)

2) 如何将标题k_max = 0.3k_max = 1.0 放在每列标记的上方? :这样,我可以快速识别我在情节中考虑的情况(就像我在上面的第一个图上所做的那样,但是通过重复显示所有标签两次存在冗余)。

【问题讨论】:

    标签: python matplotlib label legend markers


    【解决方案1】:

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

    1.1 要增加标记之间的空间,您可以提供附加参数 padHandlerTuple()(来自 here)。它将调整不同标记部分之间的间距。这看起来像:

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

    1.2 要为标记添加更多宽度,您可以像这样增加handlelength 参数的值:

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

    具有这些值的结果将如下所示:

    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}$', ...], ...)
    

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

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

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

    这将导致:

    【讨论】:

    • 谢谢!效果很好,我会尽快奖励你的。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2020-01-13
    • 2020-06-05
    相关资源
    最近更新 更多