首页 > 解决方案 > 从数据透视表中绘制多个单独的图表

问题描述

我有一个包含以下信息的 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().

为了使问题保持​​简洁明了,我将向读者提供我无数次尝试的示例。

谢谢你的帮助。

标签: pandasdataframematplotlib

解决方案


看起来您正试图同时显示多个图。有很多方法可以做到这一点,但我建议使用子图。我模拟了代表您提供的数据样本的 1000 个数据点。您帖子中的 pivot_table 命令不会产生有意义的数据框,因此您要绘制的内容不是很清楚。无论如何,这是一个如何使用子图在一个图形上显示多个图的示例。您可以增加 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')

推荐阅读