Построение нескольких и отдельных диаграмм из сводных таблиц

#pandas #dataframe #matplotlib

Вопрос:

У меня есть csv-файл, содержащий следующую информацию:

 Time,   Type,   Gender,   Hair,    Eyes    Age      
1:00,   Adult,  Male,     Brown,   Green,  33
1:10,   Adult,  Female,   Blonde,  Green,  67
1:15,   Child,  Female,   Red,     Brown,  13
1:20,   Child,  Male,     Blonde,  Blue,   5
1:50,   Child,  Male,     Red,     Brown,  17
2:00,   Adult,  Female,   Brown,   Blue,   42
 

Я создаю фрейм данных из этого файла:

 df = pd.read_csv(myCSV)
 

а затем я создаю отдельные сводные таблицы из этого фрейма данных:

 pivot1 = df.pivot_table(index=['Time'], columns=['Gender', 'Eyes'], values=['Age'])

pivot2 = df.pivot_table(index=['Time'], columns=['Hair'])

pivot3 = df.pivot_table(index=['Time'], columns=['Type'], values=['Age'])
 

Я хотел бы, чтобы plt.plot() все сводные таблицы (а в идеале и многие другие) были отдельными диаграммами, но я сталкиваюсь с тупиками в том, как это сделать при вызове plt.show() .

Я избавлю читателя от примеров моих бесчисленных попыток, чтобы вопрос был ясным и кратким.

Спасибо за любую помощь.

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

1. Поместите их в цикл for и plt.show() на каждой итерации?

Ответ №1:

Похоже, вы пытаетесь показать несколько сюжетов одновременно. Есть много способов сделать это, но я бы рекомендовал использовать подзаголовки. Я смоделировал 1000 точек данных, представляющих образец данных, который вы предоставили. Команды сводной таблицы в вашем посте не приводят к значимым кадрам данных, поэтому не очень понятно, что вы пытаетесь построить. Независимо от этого, вот пример того, как использовать подзаголовки для отображения множества графиков на одном рисунке. Вы можете увеличить параметры nrows или ncols, чтобы на одном рисунке отображалось столько графиков, сколько вам нужно. Надеюсь, это сможет ответить на ваш вопрос.

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

 import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

#generate data
df = pd.DataFrame({
    'Time': pd.date_range(start='1-1-2021 13:00:00', periods=1000, freq='600s'), 
    'Type': np.random.choice(['Adult', 'Child'], 1000), 
    'Gender': np.random.choice(['M','F'], 1000),
    'Hair': np.random.choice(['Brown','Blonde','Red','Black'], 1000),
    'Eyes': np.random.choice(['Green','Brown','Blue','Brown'], 1000),
    'Age': np.random.randint(18, 64, 1000)
})

#make some groupings for bar charts
plot_1 = df.groupby(['Gender','Hair'], as_index=False).Age.mean()
plot_2 = df.groupby('Type').Gender.size()
plot_3 = df.groupby('Type').Age.mean()

fig, axes = plt.subplots(ncols=3, nrows=1, figsize=(18,8)) #define fig/axes
axes = axes.flatten() #make axes a 1D array containing subplots

#plot data on appropriate axes
sns.barplot(x = 'Hair', y = 'Age', data=plot_1, ci=None, palette=['#0373fc'], ax=axes[0])
sns.barplot(x=plot_2.index, y=plot_2.values, ci=None, palette=['#0373fc'], ax=axes[1])
sns.barplot(x=plot_3.index, y=plot_3.values, ci=None, palette=['#0373fc'], ax=axes[2])

#Add y labels to 2nd and 3rd plots
axes[1].set_ylabel('Number of Male or Female')
axes[2].set_ylabel('Average age')
 

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

1. Спасибо за пример. Я попробую использовать свои фактические данные, чтобы увидеть, позволяет ли groupby() то, чего я пытаюсь достичь, но я все равно хотел бы понять, как добиться одновременного отображения нескольких pivot_table() приложений, а также без использования Seaborn (хотя я намерен изучить это). Я просто составляю синтаксис здесь (и могу представить себе множество вариантов такого рода), но в идеале я хотел бы иметь возможность сделать что-то подобное plt.plot(pivot1); plt.plot(pivot2); plt.plot(pivot3); plt.show() . Есть какие-либо предложения относительно использования pivot_table() и plt.show() ?