Как раздвинуть графики между собой по оси Y?

Есть код:

def my_plot(data, rot=45, **kwargs):
    ncols = df["Location"].nunique()
    nrows = df["Type"].nunique()
    f, axes = plt.subplots(nrows, ncols, **kwargs)
    for col, loc in enumerate(df["Location"].unique()):
        d = df.query("Location == @loc")
        for row, typ in enumerate(d["Type"].unique()):
            (d
             .set_index("Date")
             .query("Type == @typ")
             [["Price"]]
             .plot(grid=True, rot=rot, ax=axes[row, col], title=f"{loc}, {typ}"))
    plt.tight_layout()

Получается так.

Нужно, чтобы даты всех графиков были видны и чтобы они были равномерно и читаемо расположены по всем осям Х, а не были прибиты к их левому краю.

Насколько я понимаю, нужно что-то сделать с plt.subplots_adjust(). Я установил plt.subplots_adjust(hspace = 1, wspace=1, top=5, bottom=0.2) и настраиваю hspace. В итоге расстояние между графиками увеличивается, но видимость дат от этого не появляется.

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

Датасет


Ответы (1 шт):

Автор решения: MaxU
import matplotlib.dates as mdates

def my_plot(
        df,
        rot=45,
        dt_fmt="%d.%m.%y",
        subplots_adjust_args=dict(hspace=1, wspace=.3, top=2, bottom=0.2),
        **kwargs):
    ncols = df["Location"].nunique()
    nrows = df["Type"].nunique()
    f, axes = plt.subplots(nrows, ncols, **kwargs)
    for col, loc in enumerate(df["Location"].unique()):
        d = df.query("Location == @loc")
        for row, typ in enumerate(d["Type"].unique()):
            (d
             .set_index("Date")
             .query("Type == @typ")
             [["Price"]]
             .plot(grid=True, rot=rot, ax=axes[row, col], title=f"{loc}, {typ}", xlabel=""))
            if not kwargs.get("sharex", False):
                axes[row, col].xaxis.set_major_formatter(mdates.DateFormatter(dt_fmt))
    plt.subplots_adjust(**subplots_adjust_args)
    # plt.tight_layout()


df = (pd
      .read_csv('ap-northeast-1.csv', parse_dates=["Date"],
                names=['Date','Type','OS', 'Location', 'Price'])
      .query("OS == 'Windows' and Type.str[0] == 'i'"))

my_plot(df, rot=0, subplots_adjust_args=dict(hspace=.7, wspace=.3, top=1.4), 
        dt_fmt="%d.%m", figsize=(12,9), sharex=False, sharey=False)

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

PS все графики на полотно не вмещаются - попробуйте поиграться с параметрами subplots_adjust_args

→ Ссылка