Seaborn выравнивает графики в подзаголовках

#python #matplotlib #data-visualization #seaborn

#python #matplotlib #визуализация данных #seaborn

Вопрос:

Я использую Seaborn для построения 3 графиков. Я хотел бы знать, как я мог бы выровнять по вертикали разные графики.

Пока это мой график:

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

И это мой код:

 import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as plticker
import seaborn as sns
import numpy as np

flatui = ["#636EFA", "#EF553B", "#00CC96", "#AB63FA"]

fig, ax = plt.subplots(figsize=(17, 7))    
plot=sns.lineplot(ax=ax,x="number of weeks", y="avg streams", hue="year", data=df, palette=flatui)

ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: '{:,.2f}'.format(x/1000)   'K'))

plot.set(title='Streams trend')
plot.xaxis.set_major_locator(ticker.MultipleLocator(2))

    

    
fig, ax =plt.subplots(1,2, figsize=(17,7))
plot = sns.barplot(x="Artist", y="Releases", data = result.head(10), ax=ax[0])
plot.set_xticklabels(
    plot.get_xticklabels(), 
    rotation=90, 
    horizontalalignment='center',
    fontweight='light',
    fontsize='x-large'

)
plot=sns.barplot(x="Artist", y="Streams", data = result.head(10), ax=ax[1])
plot.set_xticklabels(
    plot.get_xticklabels(), 
    rotation=90, 
    horizontalalignment='center',
    fontweight='light',
    fontsize='x-large'

)
  

В основном я создаю фигуру, на которой я строю график тренда, а затем фигуру с 2 подзаголовками, на которых я строю свои 2 столбчатых графика.

Что я хотел бы сделать, так это выровнять график тренда и 2 гистограммы. Как вы могли заметить слева, график тренда и первая гистограмма не выровнены, я хотел бы, чтобы две фигуры начинались с одной и той же точки (например, в конце графика тренда и второй гистограммы, где 2 графика выровнены).

Как я мог это сделать?

Комментарии:

1. Можете ли вы подтвердить, что вам нужны 2 отдельных рисунка, а не 1 рисунок с 3 подзаголовками?

2. @DizietAsahi Это то же самое. Я создал 2 рисунка, потому что я не мог найти способ заставить один график занимать 2 «слота» в подзаголовке. Цель состоит в том, чтобы иметь график тренда выше и график с 2 полосами ниже, как показано на моем изображении

Ответ №1:

Вот решение, использующее спецификацию сетки

 fig = plt.figure()
gs0 = matplotlib.gridspec.GridSpec(2,2, figure=fig)

ax1 = fig.add_subplot(gs0[0,:])
ax2 = fig.add_subplot(gs0[1,0])
ax3 = fig.add_subplot(gs0[1,1])

sns.lineplot(ax=ax1, ...)
sns.barplot(ax=ax2, ...)
sns.barplot(ax=ax3, ...)
  

Если у вас установлена новейшая версия matplotlib, вы также можете использовать новый механизм составления семантических фигур

 axd = plt.figure(constrained_layout=True).subplot_mosaic(
    """
    AA
    BC
    """
)

sns.lineplot(ax=axd['A'], ...)
sns.barplot(ax=axd['B'], ...)
sns.barplot(ax=axd['C'], ...)
  

Комментарии:

1. Работает отлично. Есть ли способ установить границу между верхним графиком (трендовым) и столбчатыми диаграммами? Они довольно близки друг к другу, я хотел бы переместить их немного ниже

2. Вы можете настроить параметр, hspace который вы можете передать GridSpec или subplot_mosaic() через gridspec_kw= , смотрите ссылки в моем ответе