在matplotlib图中将文本放在左上角

162 投票
3 回答
301610 浏览
提问于 2025-04-17 08:15

我想知道怎么把文字放在matplotlib图形的左上角(或者右上角),比如说像左上角的图例那样,或者直接放在图的左上角。如果我用的是plt.scatter(),那么我希望文字能放在散点图的左上角。

我希望能做到这一点,而不需要知道散点图的具体比例,因为这个比例会根据不同的数据集而变化。我只想让文字大致位于左上角或者右上角。这样放置的话,文字应该不会和散点图上的点重叠。

3 个回答

11

一种解决办法是使用 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 来让文字变小,这样图例就会变得更小一些。

34
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')

两个输出的对比

这里插入图片描述

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()

这里插入图片描述

seaborn 轴级图

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')

这里插入图片描述

seaborn 图级图

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')

这里插入图片描述

221

你可以使用 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 轴的最大值(在 ylim((ymin,ymax)) 中的 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' 可以防止长文本在手动缩小框架时超出左边界。

撰写回答