Построить графики на одном полотне, где столбцы графика - уникальные значения одного столбца фрейма, а строки - значения другого столбца

Есть датафрейм со столбцами Date, Type, Location и Price. Нужно построить графики (каждый - на отдельной картинке) зависимости Price от Date для каждого Type и всё это - в зависимости от Location. То есть на каждом графике должна быть зависимость Price от Date для каждого Type, при этом все графики для каждой из Location должны быть сгруппированы в отдельные столбцы. У меня есть код, который выводит необходимые графики в один столбец, то есть без учета Location.

dat = pd.read_csv('ap-northeast-1.csv', parse_dates = True, names=['Date','Type','OS', 'Location', 'Price'])
da = dat[dat.OS == 'Windows']
del da['OS']
del da['Location']
date = []
for d in da["Date"]:
    d = str(d)
    date.append(d[:10])
da["Date"] = date
df = da.loc[da.Type.str.startswith('i')]
(df
 .set_index("Date")
 .groupby(['Type','Location'])
 .apply(lambda x: x[["Price"]].plot(grid=True, \
                                    title=[x.name], \
                                    subplots=True)))

Всего получается 20 графиков. Полученные 20 графиков необходимо разделить по столбцам в зависимости от того, к какой Location эти графики относятся. Всего в столбце Location два значения, это ap-northeast-1a и ap-northeast-1c. В качестве иллюстрации я в Paint сгруппировал по 10 графиков соответствующим образом. В результате работы программы должна происходить аналогичная сортировка графиков, только отображение необходимо в два столбика (по числу разных Location, которых в данном случае всего два).

Как разделить эти графики по столбцам с учетом Location?

Датасет.

Группа графиков по первому Location

Группа графиков по второму Location

Что должно получиться в результате обработки датасета введите сюда описание изображения


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

Автор решения: MaxU
def my_plot(df, 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()

my_plot(df.set_index("Date"), rot=45, figsize=(12,10), sharex=True, sharey=False)

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

→ Ссылка