Получить место легенды Seaborn - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу добавить комментарии под своей легендой. Вот пример кода, который делает то, что я хочу:

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

np.random.seed(0)
df1 = pd.DataFrame(np.random.normal(size=100))
df2 = pd.DataFrame(np.random.uniform(size=100))

fig,ax=plt.subplots()
sns.distplot(df1,ax=ax,label='foo')
sns.distplot(df2,ax=ax,label='bar')
hardlocy = 0.92
xmargin=0.02
xmin,xmax = ax.get_xlim()
xtxt=xmax-(xmax-xmin)*xmargin

leg = ax.legend()
plt.text(xtxt,hardlocy,"Comment",
         horizontalalignment='right'
        );

Результат:

Как видите, я полагаюсь при ручной настройке положения, по крайней мере, для оси y. Я хотел бы сделать это автоматически.

Согласно этой теме и этой теме , я попытался получить доступ к характеристикам легенды через p = leg.get_window_extent(), но получил следующее сообщение об ошибке:

AttributeError: 'NoneType' object has no attribute 'points_to_pixels'

(что очень похоже на этот закрытый вопрос )

Я запускаю MacOS Catalina версии 10.15.4 и успешно выполнил conda update --all несколько минут go, безрезультатно.

Как автоматически разместить мои комментарии?

1 Ответ

1 голос
/ 01 апреля 2020

Благодаря @ Йохану C, из этот вопрос :

Чтобы нарисовать легенду, нужно нарисовать фигуру. Следовательно, рабочий код здесь может быть:

np.random.seed(0)
df1 = pd.DataFrame(np.random.normal(size=100))
df2 = pd.DataFrame(np.random.uniform(size=100))

fig,ax=plt.subplots()
sns.distplot(df1,ax=ax,label='foo')
sns.distplot(df2,ax=ax,label='bar')
ymargin=0.05

leg = ax.legend()
fig.canvas.draw()
bbox = leg.get_window_extent()
inv = ax.transData.inverted()

(xloc,yloc)=inv.transform((bbox.x1,bbox.y0))
ymin,ymax = ax.get_ylim()
yloc_margin=yloc-(ymax-ymin)*ymargin

ax.text(xloc,yloc_margin,"Comment",horizontalalignment='right')
...