无需硬编码字段与修改表格,用Matplotlib绘制堆叠柱状图
实现全遍历逻辑的堆叠柱状图
当然可以实现这种全遍历的逻辑,不用依赖groupby或pivot,直接基于原始表格数据就能画出目标堆叠柱状图。下面是具体的实现代码和细节说明:
1. 导入所需库
import pandas as pd import matplotlib.pyplot as plt import numpy as np
2. 读取并预处理数据
首先读取数据集,提取并整理月份信息(原数据包含Date列,需转换为月份维度):
# 读取数据集 df = pd.read_csv("https://raw.githubusercontent.com/Curbal-Data-Labs/Matplotlib-Labs/master/Activities.csv") # 将日期转换为月份名称,也可以用`dt.month`获取数字月份 df['Month'] = pd.to_datetime(df['Date']).dt.month_name() # 定义月份的自然顺序,确保X轴排序正确 month_order = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] df['Month'] = pd.Categorical(df['Month'], categories=month_order, ordered=True)
3. 提取核心类别并初始化绘图参数
# 获取唯一的月份和活动类型列表 unique_months = df['Month'].unique() unique_activities = df['Activity Type'].unique() # 创建X轴的位置索引 x = np.arange(len(unique_months)) # 设置柱子宽度 bar_width = 0.7 # 为每个活动类型分配不同的颜色 colors = plt.cm.tab10(np.linspace(0, 1, len(unique_activities)))
4. 全遍历绘制堆叠柱状图
# 初始化堆叠的底部基准线,初始值为0 bottom = np.zeros(len(unique_months)) plt.figure(figsize=(12, 6)) # 外层遍历每个活动类型 for activity, color in zip(unique_activities, colors): # 内层遍历每个月份,计算当前活动在该月的总距离 monthly_distances = [] for month in unique_months: # 筛选当月当前活动的数据,求和距离 total_dist = df[(df['Month'] == month) & (df['Activity Type'] == activity)]['Distance'].sum() monthly_distances.append(total_dist) # 绘制当前活动的柱子,通过bottom参数实现堆叠 plt.bar(x, monthly_distances, bar_width, bottom=bottom, label=activity, color=color) # 更新底部基准线,为下一个活动的堆叠做准备 bottom += np.array(monthly_distances) # 设置X轴的标签为月份名称 plt.xticks(x, unique_months) # 添加图表标题和轴标签 plt.title('Monthly Total Distance by Activity Type', fontsize=14) plt.xlabel('Month', fontsize=12) plt.ylabel('Total Distance', fontsize=12) # 添加图例 plt.legend(title='Activity Type') # 自动调整布局,避免标签重叠 plt.tight_layout() plt.show()
关键逻辑说明
- 全程通过两层循环实现遍历:外层循环遍历每个活动类型,内层循环遍历每个月份,直接从原表格筛选对应数据并计算总距离,完全不需要
groupby或pivot。 - 利用
bottom参数实现堆叠效果:每绘制完一个活动类型的柱子,就将底部基准线更新为当前柱子的顶部高度,下一个活动的柱子从该位置开始绘制。 - 通过
pd.Categorical定义月份的有序类别,确保X轴上的月份按自然时间顺序排列,避免出现乱序问题。
内容的提问来源于stack exchange,提问作者ruthpozuelo
相关产品推荐
相关产品推荐

