Matplotlib 在绘图上创建带标签的水平线

Matplotlib 在绘图上创建带标签的水平线,matplotlib,annotate,horizontal-line,Matplotlib,Annotate,Horizontal Line,我试图复制这个图表: 但是我很难用横条画出水平线。我尝试了annotate和hlines,但它们没有达到我想要的效果。 将matplotlib.pyplot作为plt导入 plt.grid(which = 'both') plt.xticks(fontsize = 16) plt.yticks(fontsize = 16) plt.xlim(-0.5,8) plt.ylim(-0.5,10) plt.xlabel('Redshift, z', fontsize = 16) plt.hlines

我试图复制这个图表:

但是我很难用横条画出水平线。我尝试了
annotate
hlines
,但它们没有达到我想要的效果。 将matplotlib.pyplot作为plt导入

plt.grid(which = 'both')
plt.xticks(fontsize = 16)
plt.yticks(fontsize = 16)
plt.xlim(-0.5,8)
plt.ylim(-0.5,10)
plt.xlabel('Redshift, z', fontsize = 16)
plt.hlines(8, 0, .3)
plt.annotate(r'H$\alpha$', fontsize = 16, xy = (0,8), xycoords='data', xytext=(0,8), textcoords='data',
             arrowprops=dict(arrowstyle='<|-|>', connectionstyle='arc3', color = 'k', lw=2))
fig = plt.gcf()
width, height = 15,35   #   inches
fig.set_size_inches(width, height, forward = True)
plt.show()
plt.grid(其中='both')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.xlim(-0.5,8)
plt.ylim(-0.5,10)
plt.xlabel('Redshift,z',fontsize=16)
plt.hlines(8,0,3)
plt.annotate(r'H$\alpha$',fontsize=16,xy=(0,8),xycoords='data',xytext=(0,8),textcoords='data',
arrowprops=dict(arrowstyle='',connectionstyle='arc3',color='k',lw=2))
图=plt.gcf()
宽度、高度=15,35英寸
图设置尺寸英寸(宽度、高度、正向=真)
plt.show()

生成这样的条形图的最佳方法是什么?

我会直接使用
注释
,但为了更灵活,我会将水平条形图和相应的文本分开

plt.figure()
plt.grid(which = 'both')
plt.xticks(fontsize = 16)
plt.yticks(fontsize = 16)
plt.xlim(-0.5,8)
plt.ylim(-0.5,10)
plt.xlabel('Redshift, z', fontsize = 16)

bar_ys = [8,4]
bar_xs = [[0,6],[3,5]]
bar_texts = [r'H$\alpha$',r'H$\beta$']
bar_color = ['k','orange']

for y,xs,t,c in zip(bar_ys,bar_xs,bar_texts,bar_color):
    plt.annotate('', xy = (xs[0],y), xycoords='data', xytext=(xs[1],y),
                 arrowprops=dict(arrowstyle='|-|', color=c, lw=2, shrinkA=0, shrinkB=0))
    plt.annotate(t, xy = (xs[1],y), xycoords='data', xytext=(-5,5), textcoords='offset points',
                 fontsize = 16, va='baseline', ha='right', color=c)
plt.show()

接受的答案非常有效,谢谢

此外,我还实现了颜色自动化,因此:

colors = iter(cm.tab10(np.linspace(0,0.8,13)))

colour = 'k'
for y,xs,t in zip(bar_ys,bar_xs,bar_texts):
    plt.annotate('', xy = (xs[0],y), xycoords='data', xytext=(xs[1],y),
                 arrowprops=dict(arrowstyle='|-|', color=colour, lw=2, shrinkA=0, shrinkB=0))
    plt.annotate(t, xy = (xs[1],y), xycoords='data', xytext=(-5,5), textcoords='offset points',
                 fontsize = 16, va='baseline', ha='right', color=colour)
    colour = next(colors)