我想调整错误栏的高度,如matplotlib图例中所示,以避免它们相互撞击(如下所示)。
我知道这篇文章Matplotlib: Don't show errorbars in legend讨论了如何删除错误栏,但我不知道如何调整处理程序,以便错误栏仍然存在,只是缩短了。
重叠错误栏的工作示例是:
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版本,但我认为这不是问题。
答案 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()
为了证明这是有效的,您可以在调整错误栏大小之前将其与原始图像进行比较: