matplotlib 如何将文本置于情节之外

blmhpbnm  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(140)

我正在绘制两个时间序列,并为它们计算不同的指数。
如何在python中使用annotationtext为图外的这些图编写这些索引?
下面是我的代码

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。下面是当前图:

2w2cym1i

2w2cym1i1#

最好用图形坐标而不是数据坐标来定义位置,因为您可能不希望文本在更改数据时更改其位置。
使用地物坐标可以通过指定地物变换(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)左右。

sycxhyv7

sycxhyv72#

看起来文本在那里,但它位于图形边界之外。使用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()

twh00eeo

twh00eeo3#

根据Matplotlib 3.3.4版文档,您可以使用figtext方法:

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版中使用了这两个命令。

sg24os4d

sg24os4d4#

使用bbox

如果你想让盒子在图的外面,并且在保存图的时候不被裁剪,你必须使用bbox。下面是一个最小的工作示例:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 1, figsize=(8, 4))
x = np.random.normal(loc=15.0, scale=2.0, size=10000)
mu = np.mean(x)
sigma = np.std(x)

my_text = '- Estimated quantities -\n'
my_text += fr'$\mu=${mu:.3f}' + '\n' + fr'$\sigma=${sigma:.3f}'

ax.hist(x, bins=100)
props = dict(boxstyle='round', facecolor='grey', alpha=0.15)  # bbox features
ax.text(1.03, 0.98, my_text, transform=ax.transAxes, fontsize=12, verticalalignment='top', bbox=props)
plt.tight_layout()
plt.show()

更多详情:https://matplotlib.org/3.3.4/gallery/recipes/placing_text_boxes.html

相关问题