Seaborn&Matplotlib在轴上添加相对文本

时间:2019-03-01 17:41:15

标签: python matplotlib text seaborn

尝试使用seaborn和matplotlib绘制一些数据,需要在我的绘图中添加一些描述性文本,通常我只需要使用matplotlib命令文本,并将其放置在相对于坐标轴的位置即可,但是并没有。似乎根本无法工作,我没有显示超出轴,刻度等默认值的文本。我想要的是在绘图区域的左上角显示一些自定义文本。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

df是我的熊猫数据框,它只包含一些时间列,并使用标签“ p”作为标识符来协调数据。

ax2 = sns.scatterplot("t","x", data = df, hue = "p")
ax2.text(0.1, 0.9, r"$s = {}, F = {}, N = {}$".format(value1, valu2, value3))

plt.show()

任何人都知道如何才能显示一些相对定位的文本,“值”项只是我要打印的数据的变量。谢谢。

2 个答案:

答案 0 :(得分:1)

为了在不知道限制的情况下将文本放置在绘图的左上角,您可以查询轴的x和y限制,并使用该限制将文本相对于绘图的边界定位。考虑这个示例(我还包括了用于生成一些随机数据进行演示的代码)

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

np.random.seed(1)
df = pd.DataFrame({'t':np.linspace(1,2,100),
                  'x':np.random.randn(100)})

value1 = 1
value2 = 2
value3 = 3
ax2 = sns.scatterplot("t","x", data = df)
tl = ((ax2.get_xlim()[1] - ax2.get_xlim()[0])*0.010 + ax2.get_xlim()[0],
      (ax2.get_ylim()[1] - ax2.get_ylim()[0])*0.95 + ax2.get_ylim()[0])
ax2.text(tl[0], tl[1], r"$s = {}, F = {}, N = {}$".format(value1, value2, value3))

plt.show()

这将输出

Text positioned in upper left

并更改边界不会更改文本的位置,即

Text positioned in upper left (with larger bounds)

您可能需要根据所需文本的精确度来调整乘数0.010.95

答案 1 :(得分:0)

您要在“绘图区域的左上角”放置一个文本。 “绘图区域”称为轴。我想到了三种解决方案:

文本在坐标轴上

您可以在轴坐标中指定文本。范围从轴左下角的(0,0)到轴右上角的(1,1)。相应的变换是通过ax.transAxes获得的。

import matplotlib.pyplot as plt
fig, ax = plt.subplots()

ax.text(0.02, 0.98, "Text", ha="left", va="top", transform=ax.transAxes)

plt.show()

带偏移的注释

在上面的文字和左上角之间的距离将取决于轴的大小。因此,将文本恰好定位在左上角(即,在坐标轴上为(0,1)),然后将其偏移一些点(即,以绝对单位为单位)可能是有益的。

ax.annotate("Text", xy=(0,1), xycoords="axes fraction",
                    xytext=(5,-5), textcoords="offset points",
                    ha="left", va="top")

这里的结果看起来与上面相似,但与轴或图形尺寸无关;文字始终离左上角5磅。

文本在锚定位置

最后,您实际上可能根本不想指定任何坐标。毕竟"upper left"应该足以作为定位信息。这可以通过AnchoredText如下实现。

import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredText

fig, ax = plt.subplots()

anc = AnchoredText("Text", loc="upper left", frameon=False)
ax.add_artist(anc)

plt.show()