如何基于已有dataframe使用facet_wrap绘制分面饼图
基于DataFrame绘制分面饼图实现方案
你已创建的数据集示例如下:
分面饼图的核心逻辑是按指定分面字段拆分数据子集,为每个子集单独绘制饼图后按网格排布,以下是两种最常用的落地实现方式:
方法1:Matplotlib + Pandas 静态图实现(最通用,无额外复杂依赖)
前置要求
你的数据集需要包含三类字段:
- 分面维度列:用来拆分出多个子饼图的分组依据,比如不同区域、不同时间周期
- 分类列:单个饼图内每个扇区对应的类别名称
- 数值列:每个扇区对应的量化值,用来计算占比
完整实现代码
import pandas as pd import matplotlib.pyplot as plt # -------------------------- # 这里替换成你自己的DataFrame # df = 你已经创建好的dataframe变量 # -------------------------- # 配置参数,根据自己的需求修改 facet_col = "你的分面列名" # 比如"地区""月份" category_col = "你的饼图分类列名" # 比如"消费类型""渠道" value_col = "你的数值列名" # 比如"订单量""金额" n_cols = 3 # 子图网格每行放几个饼图 # 自动计算子图行数 groups = df[facet_col].unique() n_groups = len(groups) n_rows = (n_groups + n_cols - 1) // n_cols # 创建子图网格 fig, axes = plt.subplots( nrows=n_rows, ncols=n_cols, figsize=(5*n_cols, 4*n_rows) ) # 将axes转为一维数组方便循环 axes = axes.flatten() # 循环绘制每个分面的饼图 for idx, group_name in enumerate(groups): # 筛选当前分面的数据 sub_df = df[df[facet_col] == group_name] # 绘制饼图,autopct控制百分比显示格式 axes[idx].pie( sub_df[value_col], labels=sub_df[category_col], autopct="%1.1f%%", startangle=90 ) # 设置子图标题为分面名称 axes[idx].set_title(f"{facet_col}: {group_name}") # 隐藏多余的空白子图 for idx in range(n_groups, len(axes)): axes[idx].axis("off") # 自动调整间距避免标签重叠 plt.tight_layout() plt.show()
方法2:Plotly 交互式分面饼图(代码更简洁,支持交互查看)
如果需要可交互的图表(鼠标悬浮显示详情、缩放、导出等),可以直接用plotly的分面参数,不需要手动写循环:
import plotly.express as px # 替换成你自己的列名即可 fig = px.pie( df, values="你的数值列名", names="你的饼图分类列名", facet_col="你的分面列名", # 按列分面,也可以用facet_row按行分面 facet_col_wrap=3 # 每行最多放3个饼图 ) fig.show()
实用优化提示
- 为了避免不同子饼图中同一类别颜色不一致,可以提前定义分类和颜色的映射字典,在
pie()方法中传入colors参数固定配色 - 如果分类太多不适合在每个饼图旁加标签,可以关闭labels参数,统一在画布外侧加全局共享图例
- 可以给
pie()加wedgeprops={"width":0.6}参数,把普通饼图改成环形图,视觉效果更清爽
内容的提问来源于stack exchange,提问作者trangha2710
相关产品推荐
相关产品推荐

