如何用Matplotlib按年份、EventCode分组绘制Top5城市EventCount多饼图
实现按年份+EventCode分组的前5城市饼图可视化
没问题,我来一步步帮你搞定这个需求。咱们可以用Pandas做数据筛选,再结合Matplotlib来生成每个分组的饼图,具体操作如下:
步骤1:数据预处理——提取每组前5的城市
首先,我们需要按Year和EventCode分组,在每个组内按EventCount降序排序,取出排名前5的城市。用Pandas的groupby+nlargest就能轻松实现:
import pandas as pd import matplotlib.pyplot as plt # 先模拟你的示例数据(如果已有真实DataFrame可以替换这部分) data = [ [2015, 10, "Jakarta", 12], [2015, 10, "Yogjakarta", 15], [2015, 10, "Padang", 27], [2015, 10, "Bandung", 20], [2015, 10, "Surabaya", 18], [2015, 10, "Medan", 10], [2015, 13, "Jayapura", 34], [2015, 13, "Manado", 22], [2015, 14, "Jakarta", 24], [2015, 14, "Yogjakarta", 15], [2019, 14, "Jayapura", 12], [2019, 14, "Makassar", 28], [2019, 14, "Palembang", 20], [2019, 14, "Semarang", 16], [2019, 14, "Balikpapan", 14], [2019, 14, "Batam", 11] ] df = pd.DataFrame(data, columns=["Year", "EventCode", "CityName", "EventCount"]) # 分组并提取每组前5的城市 top5_df = df.groupby(["Year", "EventCode"]).apply( lambda x: x.nlargest(5, "EventCount") ).reset_index(drop=True)
步骤2:生成每个分组的饼图
接下来,我们要为每一组(Year+EventCode)单独绘制饼图。可以先获取所有唯一的分组组合,然后用Matplotlib的子图网格来排列这些饼图,让布局更整齐:
# 获取所有唯一的分组组合 groups = top5_df.groupby(["Year", "EventCode"]).groups.keys() group_count = len(groups) # 计算子图的行数和列数(这里按每行3个饼图排列,你可以根据需要调整) cols = 3 rows = (group_count + cols - 1) // cols # 创建子图网格 fig, axes = plt.subplots(rows, cols, figsize=(15, 5*rows)) axes = axes.flatten() # 把二维数组转为一维,方便循环 # 遍历每个分组,绘制饼图 for idx, (year, event_code) in enumerate(groups): # 取出当前分组的数据 group_data = top5_df[(top5_df["Year"] == year) & (top5_df["EventCode"] == event_code)] cities = group_data["CityName"] counts = group_data["EventCount"] # 绘制饼图 ax = axes[idx] wedges, texts, autotexts = ax.pie( counts, labels=cities, autopct='%1.1f%%', # 显示百分比 startangle=90 ) # 设置标题 ax.set_title(f"Year: {year}, EventCode: {event_code}") # 调整标签大小,避免重叠 plt.setp(texts, size=8) plt.setp(autotexts, size=7) # 隐藏多余的子图(如果分组数不是cols的整数倍) for idx in range(group_count, rows*cols): axes[idx].axis('off') # 调整子图间距,让布局更美观 plt.tight_layout() plt.show()
一些小提示
- 如果某个分组的城市数量不足5个,
nlargest会自动保留该组的所有数据,不会报错 - 你可以调整
cols的值来改变每行显示的饼图数量,比如改成2个会让每个饼图更大 - 如果想让饼图的标签更清晰,可以尝试设置
labeldistance参数,或者把图例放在饼图外面
内容的提问来源于stack exchange,提问作者Pundun
相关产品推荐
相关产品推荐

