在matplotlib图中将文本放在左上角
我想知道怎么把文字放在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
matplotlib
现在和最初发布时有些不同。matplotlib.pyplot.text
matplotlib.axes.Axes.text
- 这个回答和 seaborn 有关,seaborn 是一个为 matplotlib 提供的高级接口。
- 在
python 3.10
、matplotlib 3.5.1
和seaborn 0.11.2
中测试过
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')
两个输出的对比
- 来自 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()
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()
ha
和 va
这两个参数用来设置文本相对于插入点的对齐方式。比如,ha='left'
可以防止长文本在手动缩小框架时超出左边界。