matplotlib 在Python中添加文本到图例

ctzwtxfj  于 2023-05-18  发布在  Python
关注(0)|答案(4)|浏览(177)

我试图在图例中添加一些文字。这是关于盒子里的文字。另一个解决方案是文本框留在图例下面,当你放大图形时不会移动。

plt.scatter(stageheight,discharge,color='b',label='measured data')
plt.plot(stageheight_hecras,discharge_hecras,'y^',label='modeled with HEC-RAS')
plt.plot(stageheight_masked,discharge_predicted,'r-',label='regression line measured data')
plt.plot(stageheight_hecras,discharge_predicted_hecras,'g-',label='regression line HEC-RAS')
plt.plot(stageheight_masked,upper,'r--',label='15% error measured data')
plt.plot(stageheight_masked,lower,'r--')
plt.plot(stageheight_hecras,upper_hecras,'g--',label='30% error HEC-RAS')
plt.plot(stageheight_hecras,lower_hecras,'g--')
plt.fill_between(stageheight_masked,upper,lower,facecolor='red',edgecolor='red',alpha=0.5,label='test')
plt.fill_between(stageheight_hecras,upper_hecras,lower_hecras,facecolor='green',alpha=0.5)
plt.axhline(y=0.6,xmin=0,xmax=1,color='black',linewidth = 4.0,label='measuring range')
plt.text(0.02,0.7,'measured rating curve $Q = 1.37H^2 + 0.34H - 0.007$\nmodeled ratign curve $Q = 2.71H^2 - 2.20H + 0.98$',bbox=dict(facecolor='none',edgecolor='black',boxstyle='square'))
plt.title('Rating curve Catsop')
plt.ylabel('discharge')
plt.ylim(0,2.5)
plt.xlim(0,1.2)
plt.xlabel('stageheight[m]')
plt.legend(loc='upper left', title='Legend')
plt.grid(True)
plt.show()

这是我现在得到的图表:

2admgd59

2admgd591#

您可以使用面片,而不是绘制假矩形,它不会显示在图形或轴上:

import matplotlib.patches as mpatches

extraString = 'measured rating curve $Q = 1.37H^2 + 0.34H - 0.007$\nmodeled rating curve $Q = 2.71H^2 - 2.20H + 0.98$'
handles, labels = plt.get_legend_handles_labels()
handles.append(mpatches.Patch(color='none', label=extraString))
plt.legend(handles=handles)

这种方法的额外效果是,您首先获得图例中已经存在的任何内容,因此您不必手动显式构建它。

n3h0vuf2

n3h0vuf22#

这会将文本添加到图例中(受此answer启发):

from matplotlib.patches import Rectangle

plt.plot(range(10))

p = plt.axhline(y=0.6,xmin=0,xmax=1,color='black',linewidth = 4.0,label='measuring range')
plt.ylabel('discharge')
plt.ylim(0,2.5)
plt.xlim(0,1.2)
plt.xlabel('stageheight[m]')
text1 = 'measured rating curve $Q = 1.37H^2 + 0.34H - 0.007$'
text2 = 'modeled ratign curve $Q = 2.71H^2 - 2.20H + 0.98$'
extra = Rectangle((0, 0), 1, 1, fc="w", fill=False, edgecolor='none', linewidth=0)
plt.legend([p, extra, extra],[p.get_label(), text1, text2], loc='upper left', title='Legend')
plt.grid(True)
plt.show()

rdlzhqv9

rdlzhqv93#

尝试在plt.text中使用transform。现在前两个坐标是相对于轴的。

ax = plt.gca()
ax.text(0.3,0.05,'measured rating curve $Q = 1.37H^2 + 0.34H - 0.007$\nmodeled ratign curve $Q = 2.71H^2 - 2.20H + 0.98$',transform=ax.transAxes, bbox=dict(facecolor='none',edgecolor='black',boxstyle='square'))
bd1hkmkf

bd1hkmkf4#

最简单的是:

my_text = "hello legend"
plt.plot(...)
plt.scatter([], [], color="w", alpha=0, label=my_text)

plt.legend()
plt.show()

Patch的解决方案相比,这个解决方案更容易阅读,因为它不使用复杂/高级的功能。但是,如果你使用plt.bar,它可能会影响标签的顺序。
使用Patch的方法迫使您只在轴处理结束时将文本添加到图例中一次,因为它要求plt.legend(...)使用修改的手柄。换句话说,如果您在不同的文本中使用该代码两次,您将只看到最后一次,因为图例被替换,而这种方法允许您多次向图例添加文本。

相关问题