基于Python中pandas groupby实现按位置分组的多柱状图绘制
按Location生成柱状图的简洁实现方案
当然可以!用Pandas的groupby配合Matplotlib或者Seaborn,几行代码就能搞定按location生成三个柱状图的需求,完全符合你要的「每个日期对应一个柱子」的要求。下面给你两种实用的实现方式:
方法一:Matplotlib + Pandas Groupby(灵活可控)
这种方式手动创建子图并遍历分组,能更细致地控制图表样式:
import pandas as pd import matplotlib.pyplot as plt # 初始化并预处理数据 data = {"location": ["USA", "USA", "USA", "UK", "UK", "UK", "World", "World", "World"], "date": ["21-06-2021", "22-06-2021", "23-06-2021", "21-06-2021", "22-06-2021", "23-06-2021", "21-06-2021", "22-06-2021", "23-06-2021"], "number": [456, 543, 675, 543, 765, 345, 654, 345, 654]} df = pd.DataFrame(data, columns=['location','date','number']) df["date"] = pd.to_datetime(df["date"], format="%d-%m-%Y") # 指定日期格式避免解析错误 # 创建1行3列的子图布局,设置合适尺寸 fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 5)) # 遍历每个location分组,在对应子图绘制柱状图 for (location, group), ax in zip(df.groupby('location'), axes.flatten()): ax.bar(group['date'], group['number'], color='skyblue') ax.set_title(f'Number by Date - {location}') ax.set_xlabel('Date') ax.set_ylabel('Number') ax.tick_params(axis='x', rotation=45) # 旋转日期标签,避免重叠 plt.tight_layout() # 自动调整子图间距,优化显示效果 plt.show()
关键说明:
df.groupby('location')自动将数据按位置拆分成3个分组,无需手动筛选每个locationaxes.flatten()把子图数组转换成一维,方便和分组一一对应- 旋转X轴标签、设置标题等细节让图表更易读
方法二:Seaborn Catplot(极简高效)
如果你想少写代码,Seaborn的catplot能一键生成符合要求的图表,代码更简洁:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 数据预处理同上 data = {"location": ["USA", "USA", "USA", "UK", "UK", "UK", "World", "World", "World"], "date": ["21-06-2021", "22-06-2021", "23-06-2021", "21-06-2021", "22-06-2021", "23-06-2021", "21-06-2021", "22-06-2021", "23-06-2021"], "number": [456, 543, 675, 543, 765, 345, 654, 345, 654]} df = pd.DataFrame(data, columns=['location','date','number']) df["date"] = pd.to_datetime(df["date"], format="%d-%m-%Y") # 一行代码生成三个柱状图 sns.catplot(data=df, x='date', y='number', col='location', kind='bar', height=4, aspect=1.2) plt.tick_params(axis='x', rotation=45) plt.tight_layout() plt.show()
关键说明:
col='location'直接告诉Seaborn按location拆分图表,自动生成子图kind='bar'指定绘制柱状图,完美匹配你的需求height和aspect参数可以快速调整每个子图的大小
两种方法都能高效实现你的需求,Matplotlib适合需要自定义样式的场景,Seaborn适合快速出图。
内容的提问来源于stack exchange,提问作者Katharina Böhm
相关产品推荐
相关产品推荐

