Пытаясь использовать seaborn и matplotlib для построения некоторых данных, нужно добавить некоторый описательный текст к моему графику, обычно я просто использую текст команды matplotlib и помещаю его туда, где я хотел относительно осей, но это не работать на всех, я не получаю текст, показывающий за пределами материала по умолчанию на осях, галочки и т.д. Что я хочу, это некоторый пользовательский текст, отображаемый в верхнем левом углу области графика.
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
df - это мой pandas dataframe, он просто содержит несколько столбцов времени и координатных данных с тегом "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()
Кто-нибудь знает, как я могу получить некоторый текст, чтобы показать, относительно позиционированные элементы "значения" - это просто переменные с данными, которые я хочу напечатать. Благодарю.
Вы хотите разместить текст "в верхнем левом углу области графика". "Площадь участка" называется осями. На ум приходят три решения:
Вы можете указать текст в координатах осей. Они варьируются от (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()
Чтобы расположить текст в верхнем левом углу графика, не зная заранее пределов, вы можете запросить пределы осей 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()
Это будет выводить
и изменение границ не изменит положение текста, т.е.
Возможно, вам придется настроить множители 0.01
и 0.95
как вы хотите, исходя из того, насколько близко к углу вы хотите получить текст.