fig.tight_layout (), но графики все еще пересекаются - PullRequest
0 голосов
/ 08 февраля 2019

Представьте, что у меня есть некоторый набор данных для вин, и я нахожу 5 лучших стран-производителей вина:

# Find top 5 wine producing countries.
top_countries = wines_df.groupby('country').size().reset_index(name='n').sort_values('n', ascending=False)[:5]['country'].tolist()

Теперь, когда у меня есть значения, я пытаюсь отобразить результаты в 10 графиках, 5 строках и 2 столбцах..

fig = plt.figure(figsize=(16, 15))
fig.tight_layout()
i = 0
for c in top_countries:
    c_df = wines_df[wines_df.country == c]
    i +=1
    ax1 = fig.add_subplot(5,2,i)
    i +=1
    ax2 = fig.add_subplot(5,2,i)
    sns.kdeplot(c_df['points'], ax=ax1)
    ax1.set_title("POINTS OF ALL WINES IN %s, n=%d" % (c.upper(), c_df.shape[0]), fontsize=16)
    sns.boxplot(c_df['price'], ax=ax2)
    ax2.set_title("PRICE OF ALL WINES IN %s, n=%d" % (c.upper(), c_df.shape[0]), fontsize=16)
plt.show()

Даже при таком результате мои подсюжеты все еще перекрываются.

enter image description here

Я что-то не так делаю?Использование python3.6 с matplotlib==2.2.2

1 Ответ

0 голосов
/ 08 февраля 2019

Как сказал Томас Кюн, вы должны переместиться на tight_layout() после выполнения графиков, например:

fig = plt.figure(figsize=(16, 15))
i = 0
for c in top_countries:
    c_df = wines_df[wines_df.country == c]
    i +=1
    ax1 = fig.add_subplot(5,2,i)
    i +=1
    ax2 = fig.add_subplot(5,2,i)
    sns.kdeplot(c_df['points'], ax=ax1)
    ax1.set_title("POINTS OF ALL WINES IN %s, n=%d" % (c.upper(), c_df.shape[0]), fontsize=16)
    sns.boxplot(c_df['price'], ax=ax2)
    ax2.set_title("PRICE OF ALL WINES IN %s, n=%d" % (c.upper(), c_df.shape[0]), fontsize=16)
fig.tight_layout()
plt.show()

Если оно все еще перекрывается (это может случаться в некоторых редких случаях), вы можете указатьзаполнение с помощью:

fig.tight_layout(pad=0., w_pad=0.3, h_pad=1.0)

Где pad - общее заполнение, w_pad - горизонтальное заполнение и h_pad - вертикальное заполнение.Просто попробуйте некоторые значения, пока ваш сюжет не выглядит красиво.(pad=0., w_pad=.3, h_pad=.3) - хорошее начало, если вы хотите, чтобы ваши графики были как можно более узкими.

Другая возможность - указать constrained_layout=True на рисунке:

fig = plt.figure(figsize=(16, 15), constrained_layout=True)

Теперь вы можетеудалите строку fig.tight_layout().


edit:
Еще одна вещь, на которую я наткнулся:
Кажется, вы указываете свой figsize, чтобы онпомещается на стандартную бумагу DIN A4 в сантиметрах (типичная ширина текста: 16 см).Но figsize в matplotlib в дюймах .Так что, вероятно, лучше заменить figsize на figsize=(16/2.54, 15/2.54).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...