You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:12:53