pandas - 从数据透视表中绘制多个单独的图表
问题描述
我有一个包含以下信息的 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()
.
为了使问题保持简洁明了,我将向读者提供我无数次尝试的示例。
谢谢你的帮助。
解决方案
看起来您正试图同时显示多个图。有很多方法可以做到这一点,但我建议使用子图。我模拟了代表您提供的数据样本的 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')
推荐阅读
- c# - 从外部程序集中获取 TypeSyntax 的命名空间
- ios - 删除 CoreData 对象会导致 EXC_BAD_INSTRUCTION
- c# - 使用路由约束时,如果路由参数验证失败,为什么 API 返回 404 而不是 400
- node.js - 快递 | 节点.js | oauth2 未进行身份验证
- delphi - DELPHI 上 ZEOSDBO 组件的问题
- python - 了解递归算法及其工作原理
- python - matplotlib 的组标题
- docker - Docker swarm 失去了管理者?
- amazon-web-services - 尝试在后确认功能中使用模型
- r - 因子查找中 NA 的意外回报