我正在绘制两个时间序列并为它们计算各种指数。
如何使用python中的annotation
或text
在图表外写下这些图表的索引?
以下是我的代码
import matplotlib.pyplot as plt
obs_graph=plt.plot(obs_df['cms'], '-r', label='Observed')
plt.legend(loc='best')
plt.hold(True)
sim_graph=plt.plot(sim_df['cms'], '-g', label="Simulated")
plt.legend(loc='best')
plt.ylabel('Daily Discharge (m^3/s)')
plt.xlabel('Year')
plt.title('Observed vs Simulated Daily Discharge')
textstr = 'NSE=%.2f\nRMSE=%.2f\n'%(NSE, RMSE)
# print textstr
plt.text(2000, 2000, textstr, fontsize=14)
plt.grid(True)
plt.show()
我想在地块外打印teststr
。这是当前的情节:
答案 0 :(得分:42)
最好定义图坐标中的位置而不是数据坐标,因为您可能不希望文本在更改数据时更改其位置。
使用图形坐标可以通过指定图形变换(fig.transFigure
)
plt.text(0.02, 0.5, textstr, fontsize=14, transform=plt.gcf().transFigure)
或使用图中的text
方法而不是轴的方法。
plt.gcf().text(0.02, 0.5, textstr, fontsize=14)
在这两种情况下,放置文本的坐标都是图形坐标,其中(0,0)
是左下角,(1,1)
是图的右上角。
最后,您仍然可能希望使用plt.subplots_adjust(left=0.3)
左右为文本提供一些额外的空间以适应轴。
答案 1 :(得分:2)
看起来文字在那里,但它位于图形边界之外。
使用subplots_adjust()
为文字腾出空间:
import matplotlib.pyplot as plt
textstr = 'NSE=%.2f\nRMSE=%.2f\n'%(1, 2)
plt.xlim(2002, 2008)
plt.ylim(0, 4500)
# print textstr
plt.text(2000, 2000, textstr, fontsize=14)
plt.grid(True)
plt.subplots_adjust(left=0.25)
plt.show()
答案 2 :(得分:1)
根据 Matplotlib 3.3.4 版文档,您可以使用 figtext method:
matplotlib.pyplot.figtext(x, y, s, fontdict=None, **kwargs)
或者你的情况
plt.figtext(0.02, 0.5, textstr, fontsize=14)
它似乎给出了与@ImportanceOfBeingErnest 的 answer 之一相同的结果,即:
plt.gcf().text(0.02, 0.5, textstr, fontsize=14)
我在 Matplobib 3.3.1 版中使用了这两个命令。