将文本放在 matplotlib 绘图的左上角

如何将文本放在 matplotlib 图形的左上角(或右上角) ,例如左上图例应该放在哪里,或者放在图形的顶部但放在左上角?例如,如果它是一个 plt.scatter(),那么它将在散点的正方形内,放在最左上角。

例如,我希望在理想情况下不知道正在绘制的散点图的大小,因为它将从一个数据集变为另一个数据集。我只希望文本大致在左上角,或者大致在右上角。与图例类型的定位,它不应该与任何散点重叠情节点无论如何。

250674 次浏览

你可以使用 text

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

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

默认转换指定文本位于数据坐标中, 或者,您可以在轴坐标中指定文本(0,0是左下角的 和1,1是右上角)。下面的例子将文本放在中间 轴线:

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

要防止文字干扰到你的任何散点都是比较困难的一招。更简单的方法是将 y _ axis (ymax 在 ylim((ymin,ymax))中)设置为比你的点的最大 y 坐标稍微高一点的值。通过这种方式,您将始终有这个自由空间的文本。

编辑: 这里有一个例子:

from matplotlib import pyplot as plt


f, ax = plt.subplots()
plt.scatter([3,5,2,6,8],[5,3,2,1,5])
plt.text(.01, .99, 'matplotlib', ha='left', va='top', transform=ax.transAxes)
f.tight_layout()

plot

hava参数设置文本相对于插入点的对齐方式。也就是说。ha='left'是一个很好的设置,以防止长文本走出左轴时,框架减少(使狭窄)手动。

一个解决方案是使用 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使其变小,这将使图例变小。

import matplotlib.pyplot as plt


plt.figure(figsize=(6, 6))
plt.text(0.1, 0.9, 'text', size=15, color='purple')


# or


fig, axe = plt.subplots(figsize=(6, 6))
axe.text(0.1, 0.9, 'text', size=15, color='purple')

两者的产出

enter image description here

  • 来自 < a href = “ https://matplotlib.org/stat/Gallery/text _ label _ and _ notations/text _ alignment.html”rel = “ nofollow noReferrer”> matplotlib: 精确的文本布局
    • 您可以精确地以数据或轴坐标布局文本。
import matplotlib.pyplot as plt


# Build a rectangle in axes coords
left, width = .25, .5
bottom, height = .25, .5
right = left + width
top = bottom + height
ax = plt.gca()
p = plt.Rectangle((left, bottom), width, height, fill=False)
p.set_transform(ax.transAxes)
p.set_clip_on(False)
ax.add_patch(p)




ax.text(left, bottom, 'left top',
horizontalalignment='left',
verticalalignment='top',
transform=ax.transAxes)


ax.text(left, bottom, 'left bottom',
horizontalalignment='left',
verticalalignment='bottom',
transform=ax.transAxes)


ax.text(right, top, 'right bottom',
horizontalalignment='right',
verticalalignment='bottom',
transform=ax.transAxes)


ax.text(right, top, 'right top',
horizontalalignment='right',
verticalalignment='top',
transform=ax.transAxes)


ax.text(right, bottom, 'center top',
horizontalalignment='center',
verticalalignment='top',
transform=ax.transAxes)


ax.text(left, 0.5 * (bottom + top), 'right center',
horizontalalignment='right',
verticalalignment='center',
rotation='vertical',
transform=ax.transAxes)


ax.text(left, 0.5 * (bottom + top), 'left center',
horizontalalignment='left',
verticalalignment='center',
rotation='vertical',
transform=ax.transAxes)


ax.text(0.5 * (left + right), 0.5 * (bottom + top), 'middle',
horizontalalignment='center',
verticalalignment='center',
transform=ax.transAxes)


ax.text(right, 0.5 * (bottom + top), 'centered',
horizontalalignment='center',
verticalalignment='center',
rotation='vertical',
transform=ax.transAxes)


ax.text(left, top, 'rotated\nwith newlines',
horizontalalignment='center',
verticalalignment='center',
rotation=45,
transform=ax.transAxes)


plt.axis('off')


plt.show()

enter image description here

海运轴线平面图

import seaborn as sns


# sample dataframe
flights = sns.load_dataset("flights")


fig, ax = plt.subplots(figsize=(6, 6))
sns.lineplot(data=flights, x="year", y="passengers", ax=ax)
ax.text(1950, 500, 'flights with CI', size=15, color='purple')

enter image description here

海运数字水平图

tips = sns.load_dataset('tips')


g = sns.relplot(data=tips, x="total_bill", y="tip", hue="day", col="time")


# iterate through each axes
for ax in g.axes.flat:
    

ax.text(10, 9, "Who's Hungy?", size=15, color='purple')

enter image description here