Matplotlib:调整图例中错误栏的大小/高度

时间:2017-09-07 07:41:37

标签: python matplotlib legend legend-properties

我想调整错误栏的高度,如matplotlib图例中所示,以避免它们相互撞击(如下所示)。

我知道这篇文章Matplotlib: Don't show errorbars in legend讨论了如何删除错误栏,但我不知道如何调整处理程序,以便错误栏仍然存在,只是缩短了。

Error bars

重叠错误栏的工作示例是:

import matplotlib
font = {'family' : 'serif',
    'serif': 'Computer Modern Roman',
    'weight' : 'medium',
    'size'   : 19}
matplotlib.rc('font', **font)
matplotlib.rc('text', usetex=True)

fig,ax1=plt.subplots()  
h0=ax1.errorbar([1,2,3],[1,2,3],[1,2,1],c='b',label='$p=5$')
h1=ax1.errorbar([1,2,3],[3,2,1],[1,1,1],c='g',label='$p=5$')
hh=[h0,h1]
ax1.legend(hh,[H.get_label() for H in hh],bbox_to_anchor=(0.02, 0.9, 1., .102),loc=1,labelspacing=0.01, handlelength=0.14, handletextpad=0.4,frameon=False, fontsize=18.5)

我正在使用matplotlib的1.5.1版本,但我认为这不是问题。

1 个答案:

答案 0 :(得分:2)

您可以使用handler_map kwarg来ax.legend来控制图例句柄。

在这种情况下,您希望使用matplotlib.legend_handler中的HandlerErrorbar处理程序,并设置xerr_size选项。默认情况下,这是0.5,所以我们只需要将该数字减少到适合该情节的数字。

the legend guide获取指导,我们可以看到如何使用handler_map。要更改其中一个错误栏句柄,我们可以这样做:

handler_map={h0: HandlerErrorbar(xerr_size=0.3)}

假设您想以相同的方式更改所有错误栏处理,您可以将h0更改为type(h0)

handler_map={type(h0): HandlerErrorbar(xerr_size=0.3)}

请注意,这只是告诉handler_map如何更改所有Errorbars的快捷方式。请注意,这相当于执行以下操作:

from matplotlib.container import ErrorbarContainer
...
ax1.legend(...
    handler_map={ErrorbarContainer: HandlerErrorbar(xerr_size=0.3)}
    ...)

使用type(h0)简写只意味着您不需要额外导入ErrorbarContainer

将这些放在最小的例子中:

import matplotlib
import matplotlib.pyplot as plt

# Import the handler
from matplotlib.legend_handler import HandlerErrorbar

font = {'family' : 'serif',
    'serif': 'Computer Modern Roman',
    'weight' : 'medium',
    'size'   : 19}
matplotlib.rc('font', **font)
matplotlib.rc('text', usetex=True)

fig,ax1=plt.subplots()  
h0=ax1.errorbar([1,2,3],[1,2,3],[1,2,1],c='b',label='$p=5$')
h1=ax1.errorbar([1,2,3],[3,2,1],[1,1,1],c='g',label='$p=5$')
hh=[h0,h1]
ax1.legend(
        hh, [H.get_label() for H in hh],
        handler_map={type(h0): HandlerErrorbar(xerr_size=0.3)},  # adjust xerr_size to suit the plot
        bbox_to_anchor=(0.02, 0.9, 1., .102),
        loc=1, labelspacing=0.01, 
        handlelength=0.14, handletextpad=0.4,
        frameon=False, fontsize=18.5)

plt.show()

enter image description here

为了证明这是有效的,您可以在调整错误栏大小之前将其与原始图像进行比较:

enter image description here