#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=
, смотрите ссылки в моем ответе