Seaborn: размещение названия и субтитров - PullRequest
0 голосов
/ 21 октября 2018

H все,

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

# imports
import seaborn as sns
import matplotlib
from matplotlib import style
import matplotlib.pyplot as plt

# parameters
matplotlib.rcParams['font.family'] = "roboto"
style.use('fivethirtyeight')

# load data
iris = sns.load_dataset('iris')

# plot
ax = sns.relplot(
    'sepal_length',
    'sepal_width',
    hue='species',
    size='petal_width',
    alpha=0.75,
    kind="scatter",
    legend=False,
    data=iris
)

# make adjustments
ax.set_axis_labels(x_var='Sepal Length', y_var='Sepal Width')
plt.text(x=4.7, y=4.7, s='Sepal Length vs Width', fontsize=16, weight='bold')
plt.text(x=4.7, y=4.6, s='The size of each point corresponds to sepal width', fontsize=8, alpha=0.75)
plt.show()

Вывод:

scatterplot

Вот мои вопросы:

1) Есть ли лучший способ установить субтитры?Я попробовал это, используя ax.suptitle("blah", y=1.05), но в конечном итоге он оказался за рамками фигуры.Мне не нравится, что я должен установить координаты x и y для моего заголовка / субтитра.

2) Есть ли способ для меня, чтобы отобразить цветовую легенду, не показывая легенду размера?Я также хотел бы иметь возможность отображать эту легенду под сюжетом (или за его пределами). если вы сможете ответить на этот вопрос, я поменяю название этого поста, отмечу ваш ответ как завершенный и создам еще один вопрос о заголовках и субтитрах

Большое спасибо!

1 Ответ

0 голосов
/ 22 октября 2018

Использование scatterplot() облегчает манипулирование легендой.Если вы используете legend='brief, вы получите эту легенду:

enter image description here

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

h,l = ax.get_legend_handles_labels()

, поскольку вам нужна только информация о цвете, а не размер, решение состоит в том, чтобы просто воссоздать легенду, используя первую половину художников

ax.legend(h[:4],l[:4])

Полный код:

matplotlib.style.use('fivethirtyeight')
# load data
iris = sns.load_dataset('iris')

# plot
fig, ax = plt.subplots(figsize=(7,5))
sns.scatterplot(
    'sepal_length',
    'sepal_width',
    hue='species',
    size='petal_width',
    alpha=0.75,
    legend='brief',
    data=iris,
    ax=ax
)

# make adjustments
ax.set_xlabel('Sepal Length')
ax.set_ylabel('Sepal Width')

ax.text(x=0.5, y=1.1, s='Sepal Length vs Width', fontsize=16, weight='bold', ha='center', va='bottom', transform=ax.transAxes)
ax.text(x=0.5, y=1.05, s='The size of each point corresponds to sepal width', fontsize=8, alpha=0.75, ha='center', va='bottom', transform=ax.transAxes)

h,l = ax.get_legend_handles_labels()
ax.legend(h[:4],l[:4], bbox_to_anchor=(1.05, 1), loc=2)

fig.tight_layout()
plt.show()

enter image description here

...