将文本放在matplotlib图的左上角


112

如何在matplotlib图形的左上角(或右上角)放置文本,例如,左上角图例所在的位置,还是绘图的顶部,但在左上角?例如,如果它是一个plt.scatter(),那么将在散点图的平方内放置一些东西,将其放在最左上角。

我想在不理想地知道例如散点图的比例的情况下进行此操作,因为它会随数据集的不同而变化。我只希望它的文字大致在左上方,或大致在右上方。使用图例类型定位时,它无论如何都不应与任何散点图点重叠。

谢谢!


如果您想将文本放在框中stackoverflow.com/questions/20842613/…–
raphael

1
我认为这是这个问题的重复。重复的问题甚至具有更好的答案,尽管此处提供的答案(使用textax.transAxes)不在其中。
ImportanceOfBeingErnest

Answers:


162

您可以使用text

text(x, y, s, fontsize=12)

text 可以相对于轴指定坐标,因此文本的位置将与绘图的大小无关:

默认转换指定文本在数据坐标中,或者,您也可以在坐标轴中指定文本(0,0是左下角,而1,1是右上角)。下面的示例将文本放置在轴的中心::

text(0.5, 0.5,'matplotlib',
     horizontalalignment='center',
     verticalalignment='center',
     transform = ax.transAxes)

要防止文本干扰散点图的任何点,都是比较困难的。比较简单的方法是将y_axis(的ymax ylim((ymin,ymax))轴)设置为比点的最大y坐标高一点的值。这样,您将始终拥有文本的可用空间。

编辑:这里有一个例子:

In [17]: from pylab import figure, text, scatter, show
In [18]: f = figure()
In [19]: ax = f.add_subplot(111)
In [20]: scatter([3,5,2,6,8],[5,3,2,1,5])
Out[20]: <matplotlib.collections.CircleCollection object at 0x0000000007439A90>
In [21]: text(0.1, 0.9,'matplotlib', ha='center', va='center', transform=ax.transAxes)
Out[21]: <matplotlib.text.Text object at 0x0000000007415B38>
In [22]:

在此处输入图片说明

ha和va参数设置文本相对于插入点的对齐方式。即。ha ='left'是一个很好的设置,可以防止在手动缩小(变窄)帧时长文本从左轴移出。


我得到了居中的位置,但如何使它位于左上角?我尝试将“ horizo​​ntalalignment”设置为“ left”,并将verticalalignment设置为top,但它不起作用

1
您必须按照指示使用x,y值进行游戏(0,0是左下角,而1,1是右上角)。见编辑
joaquin 2011年

2
@ user3645626导入为:from pylab import figure, text, scatter, show 答案中的代码是在pylab模式下的ipython控制台中执行的,不需要显式导入。在一个干净的环境中,您需要导入以上内容并show()查看情节
joaquin

5

一种解决方案是使用该plt.legend功能,即使您不需要实际的图例。您可以使用loc关键字词指定图例框的位置。可以在此网站上找到更多信息但我还提供了一个示例,说明如何放置图例:

ax.scatter(xa,ya, marker='o', s=20, c="lightgreen", alpha=0.9)
ax.scatter(xb,yb, marker='o', s=20, c="dodgerblue", alpha=0.9)
ax.scatter(xc,yc marker='o', s=20, c="firebrick", alpha=1.0)
ax.scatter(xd,xd,xd, marker='o', s=20, c="goldenrod", alpha=0.9)
line1 = Line2D(range(10), range(10), marker='o', color="goldenrod")
line2 = Line2D(range(10), range(10), marker='o',color="firebrick")
line3 = Line2D(range(10), range(10), marker='o',color="lightgreen")
line4 = Line2D(range(10), range(10), marker='o',color="dodgerblue")
plt.legend((line1,line2,line3, line4),('line1','line2', 'line3', 'line4'),numpoints=1, loc=2) 

请注意,因为loc=2,图例位于图的左上角。并且如果文本与图重叠,则可以使用来使其变小legend.fontsize,从而使图例变小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.