Seaborn & Matplotlib Добавление текста относительно осей

1

Пытаясь использовать 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()

Кто-нибудь знает, как я могу получить некоторый текст, чтобы показать, относительно позиционированные элементы "значения" - это просто переменные с данными, которые я хочу напечатать. Благодарю.

Теги:
matplotlib
text
seaborn

2 ответа

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()
  • 0
    Я чувствую, что вы не читали то, что я написал в качестве первого примера, который вы мне дали, это пример, который я привел, что он не работает с Морским рожком. Я не пробовал ставить якорь, но сделаю это, и аннотации были неясны, но ваш пример может сработать, я должен дать ему шанс.
  • 1
    Вы можете смело предположить, что я прочитал и понял ваш вопрос. Все 3 примера, показанные здесь, будут работать! Обратите внимание на разницу между аргументами в первом примере. (И, конечно, вам нужно будет заменить топор на ax2 или любое другое имя, которое вы дадите осям, произведенным seaborn.)
Показать ещё 1 комментарий
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()

Это будет выводить

Изображение 174551

и изменение границ не изменит положение текста, т.е.

Изображение 174551

Возможно, вам придется настроить множители 0.01 и 0.95 как вы хотите, исходя из того, насколько близко к углу вы хотите получить текст.

  • 0
    «Изменение границ не изменит положение текста» вводит в заблуждение. Пределы осей могут измениться в любое время, даже после того, как график будет нарисован, например, путем увеличения или добавления дополнительных элементов. В этих случаях лучше вообще не иметь текстовой позиции в координатах данных. Для рекомендуемых альтернатив см. Другой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню