Как изменить положение заголовков подзаголовков и меток осей в Seaborn FacetGrid?

Я пытаюсь построить полярный график, используя FacetGrid Seaborn, аналогично тому, что подробно описано в галерее seaborn Я использую следующий код:

sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1.25)

# Set up a grid of axes with a polar projection
g = sns.FacetGrid(df_total, col="Construct", hue="Run", col_wrap=5,    subplot_kws=dict(projection='polar'), size=5, sharex=False, sharey=False, despine=False)

# Draw a scatterplot onto each axes in the grid
g.map(plt.plot, 'Rad', ''y axis label', marker=".", ms=3,   ls='None').set_titles("{col_name}")

plt.savefig('./image.pdf')

Что с моими данными дает следующее:

введите здесь описание изображения

Хочу сохранить в этой организации по 5 участков на линию.

Проблема в том, что заголовок каждого подзаголовка перекрывается со значениями отметок, как и для метки оси y.

Есть ли способ предотвратить такое поведение? Могу ли я как-то сместить заголовки немного выше их текущего положения и могу ли я немного сместить метки оси Y слева от их текущего положения?

Спасибо заранее!

РЕДАКТИРОВАТЬ: Это не дубликат этого SO, поскольку проблема заключалась в том, что заголовок одного подзаголовка перекрывался с меткой оси другого подзаголовка.

Здесь моя проблема в том, что заголовок одного подзаголовка перекрывается с меткой меток того же подзаголовка, и аналогично метка оси перекрывается с меткой меток тот же подсюжет.

Я также хотел бы добавить, что меня не волнует, что они перекрываются в моем блокноте jupyter (поскольку он был создан с его помощью), однако я хочу, чтобы final сохраненное изображение без перекрытия, поэтому, возможно, есть что-то, что мне нужно сделать, чтобы сохранить изображение в немного другом формате, чтобы этого избежать, но я не знаю, что именно (я использую plt.savefig только для его сохранения).

РЕДАКТИРОВАТЬ 2: Если кто-то хочет воспроизвести проблему, вот минимальный пример:

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

sns.set()
sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1.5)
# Generate an example radial datast
r = np.linspace(0, 10000, num=100)
df = pd.DataFrame({'label': r, 'slow': r, 'medium-slow': 1 * r, 'medium': 2 * r, 'medium-fast': 3 * r, 'fast': 4 * r})

# Convert the dataframe to long-form or "tidy" format
df = pd.melt(df, id_vars=['label'], var_name='speed', value_name='theta')

# Set up a grid of axes with a polar projection
g = sns.FacetGrid(df, col="speed", hue="speed",
                  subplot_kws=dict(projection='polar'), size=4.5, col_wrap=5,
                  sharex=False, sharey=False, despine=False)

# Draw a scatterplot onto each axes in the grid
g.map(plt.scatter, "theta", "label")

plt.savefig('./image.png')
plt.show()

Это дает следующее изображение, на котором заголовки не так плохи, как в моей исходной задаче (но все же частично перекрываются), а метка с левой стороны полностью перекрывается.  введите описание изображения здесь


person ejl62    schedule 09.05.2017    source источник
comment
Можете ли вы опубликовать минимальный воспроизводимый пример проблемы?   -  person ImportanceOfBeingErnest    schedule 10.05.2017
comment
Просто отредактировал вопрос, чтобы добавить пример. Спасибо.   -  person ejl62    schedule 10.05.2017


Ответы (2)


Чтобы переместить заголовок немного выше, вы можете установить его в новой позиции,

ax.title.set_position([.5, 1.1])

Чтобы переместить ylabel немного дальше влево, вы можете добавить отступ

ax.yaxis.labelpad = 25

Чтобы сделать это для осей фасетной сетки, вы должны сделать:

for ax in g.axes:
    ax.title.set_position([.5, 1.1])
    ax.yaxis.labelpad = 25
person ImportanceOfBeingErnest    schedule 10.05.2017
comment
Большое спасибо @ImportanceOfBeingErnest, это именно то, что мне было нужно! Спасибо большое за вашу помощь. - person ejl62; 10.05.2017
comment
labelpad потрясающий! - person haperes; 30.04.2021

Ответ, предоставленный ImportanceOfBeingErnest в этом вопросе SO, может помочь.

person aorr    schedule 09.05.2017
comment
Нет @aorr, в этом случае это не сработает, как объяснено в редактировании сообщения, моя проблема в том, что заголовок одного подзаговора перекрывается с меткой галочки того же самого подзаговора и аналогичным образом метка оси перекрывается с меткой меток того же подзаголовка, а не другого подзаголовка - person ejl62; 10.05.2017