数据可视化 —— 饼图

一、饼图的所有常用使用场景

饼图是一种直观展示数据占比关系的图表,适用于以下常见场景:


1. 市场与商业分析

  • 市场份额:展示不同品牌/产品在市场中的占有率。

  • 收入构成:分析公司各业务线或产品的收入占比。

  • 客户分布:按地区、行业或客户类型划分的用户比例。


2. 预算与资源分配

  • 预算分配:显示企业或项目的资金分配(如研发、营销、人力等)。

  • 资源使用:展示时间、人力或物料在不同任务中的分配比例。


3. 人口与用户统计

  • 人口结构:按年龄、性别、教育程度等划分的群体比例。

  • 用户画像:用户群体特征(如新用户/老用户、活跃度分布)。

  • 调查结果:问卷反馈的满意度(如"满意/中立/不满意"的占比)。


4. 运营与项目管理

  • 库存管理:不同品类商品的库存占比。

  • 问题归因:分析问题原因的比例(如客户投诉类型分布)。

  • 项目进度:任务完成状态的占比(如已完成/进行中/未开始)。


5. 教育与研究

  • 成绩分布:学生成绩等级(如优秀、良好、及格)的占比。

  • 实验数据:不同实验结果的出现频率或比例。


6. 其他场景

  • 社交媒体互动:点赞、评论、分享等行为的占比。

  • 能源消耗:不同能源类型(如煤炭、太阳能)的使用比例。

  • 选举结果:候选人得票率分布。


使用饼图的注意事项

  1. 类别数量:建议不超过5-7个类别,避免碎片化。

  2. 强调单一占比:适合突出最大或最小的部分(如"其他"类别)。

  3. 数据要求:各部分的百分比总和需为100%。

  4. 对比限制:不适合精确比较多个相似比例(此时条形图更优)。

二、基本用法

python 复制代码
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.style as ms

# 设置主题风格
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='饼图', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False

# 六个数据,每一个数据的百分比是多少
data = np.array([20, 50, 10, 15, 30, 55])

# 饼图是逆时针画的,两个%%显示一个%
# labels:每一个饼图的标签
# autopct:饼内显示的百分比
# explode:每一个脱离圆心的值
# pctdistance:饼图内数据标签对圆心的距离,默认0.6
# shadow=True:给饼图给阴影
# labeldistance:标签对圆心的距离,默认 1.1
# startangle:从多少度逆时针去画图;startangle=90,从90度开始画,默认0度
# radius:饼图的半径大小,默认1.2
# wedgeprops:饼图变圆环(0.7),linewidth:边长大小,edgecolor:边的颜色
# textprops:调标签文本,fontsize:字体大小,fontfamily:字体样式,color:字体颜色
# frame=True:显示图框
plt.pie(data, labels=['A', 'B', 'C', 'D', 'E', 'F'],
        autopct='%3.1f%%',  # 3个字符,保留1个小数位
        explode=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
        pctdistance=0.6, shadow=True,
        labeldistance=1.1, startangle=90, radius=1.2,
        wedgeprops={'width':0.7, 'linewidth':1, 'edgecolor':'k'},
        textprops={'fontsize':12,'fontfamily':'SimHei','color':'k'},
        #frame=True
        )

plt.show()

三、案例一:消费账单占比

python 复制代码
import matplotlib.pyplot as plt
import matplotlib.style as ms

# 设置主题风格
#  classic、fast、petroff10、seaborn-v0_8-colorblind
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='饼图', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False

data = [800/3000,100/3000,1000/3000,200/3000,300/3000,200/3000,200/3000,200/3000]
kind = ['购物','人情往来','餐饮美食','通信物流','生活日用','交通出行','休闲娱乐','其他']

# labels:每一个饼图的标签
# autopct:饼内显示的百分比
# explode:每一个脱离圆心的值
# pctdistance:饼图内数据标签对圆心的距离,默认0.6
# shadow=True:给饼图给阴影
# labeldistance:标签对圆心的距离,默认 1.1
# startangle:从多少度逆时针去画图;startangle=90,从90度开始画,默认0度
# radius:饼图的半径大小,默认1.2
# wedgeprops:饼图变圆环(0.7),linewidth:边长大小,edgecolor:边的颜色
# textprops:调标签文本,fontsize:字体大小,fontfamily:字体样式,color:字体颜色
plt.pie(data, labels=kind, autopct='%3.1f%%',
        explode=[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],
        shadow=True, startangle=90)

plt.show()

四、案例二:店铺促销方式分析(添加表格数据)

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.style as ms

# 设置主题风格
#  classic、fast、petroff10、seaborn-v0_8-colorblind
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='饼图', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_excel('某店铺促销方式分析.xlsx')
data = df['购买人数']

# labels:每一个饼图的标签
# autopct:饼内显示的百分比
# explode:每一个脱离圆心的值
# pctdistance:饼图内数据标签对圆心的距离,默认0.6
# shadow=True:给饼图给阴影
# labeldistance:标签对圆心的距离,默认 1.1
# startangle:从多少度逆时针去画图;startangle=90,从90度开始画,默认0度
# radius:饼图的半径大小,默认1.2
# wedgeprops:饼图变圆环(0.7),linewidth:边长大小,edgecolor:边的颜色
# textprops:调标签文本,fontsize:字体大小,fontfamily:字体样式,color:字体颜色
plt.pie(data, labels=df['促销方式'], autopct='%0.2f%%',
        explode=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1], shadow=True,
        radius=1.2, startangle=90,
        wedgeprops={'width': 0.8, 'linewidth': 1, 'edgecolor':'w'},
        textprops={'fontsize':15,'fontfamily':'KaiTi','color':'k'})

# cellText:创建二维
# cellLoc:文本对齐方式
# rowLabels:行标题
# colLabels:列标题
# loc:图表位置
plt.table(cellText=[df['购买人数']],
          cellLoc='center',
          rowLabels=['购买人数'],
          colLabels=df['促销方式'],
          # 下部居中对齐
          loc='lower center',

          # [x, y, width, height]
          # x:表格左下角的 x 坐标。该坐标以坐标轴为参照,取值范围在 0 到 1 之间,代表坐标轴区域的相对位置。这里 x = 0 意味着表格左下角处于坐标轴区域的最左侧。
          # y:表格左下角的 y 坐标。同样,取值范围是 0 到 1,代表在坐标轴区域的相对位置。y = -0.25 表示表格左下角在坐标轴区域的下方,超出了正常的坐标轴范围。这种设置通常用于把表格放置在图表下方,避免和其他元素重叠。
          # width:表格的宽度。它也是相对于坐标轴区域的比例值。width = 1 表明表格的宽度等同于坐标轴区域的宽度。
          # height:表格的高度。同样是相对于坐标轴区域的比例值。height = 0.15 意味着表格高度为坐标轴区域高度的 0.15 倍。
          bbox=[0, -0.25, 1, 0.15])  # 调整表格位置,避免与饼图重叠)

plt.subplots_adjust(bottom=0.2)  # 增加底部边距

plt.show()

五、案例三:购物平台的销售额

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as ms

# 设置主题风格
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='拼多多平台子类目的销售额', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_excel('拼多多平台子类目的销售额.xlsx')
data = df['销售额']

plt.subplots_adjust(bottom=0.2)  # 增加底部边距

# labels:每一个饼图的标签
# autopct:饼内显示的百分比
# explode:每一个脱离圆心的值
# pctdistance:饼图内数据标签对圆心的距离,默认0.6
# shadow=True:给饼图给阴影
# labeldistance:标签对圆心的距离,默认 1.1
# startangle:从多少度逆时针去画图;startangle=90,从90度开始画,默认0度
# radius:饼图的半径大小,默认1.2
# wedgeprops:饼图变圆环(0.7),linewidth:边长大小,edgecolor:边的颜色
# textprops:调标签文本,fontsize:字体大小,fontfamily:字体样式,color:字体颜色
plt.pie(data, labels=df['子类目'], autopct='%0.2f%%',
        explode=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], shadow=True,
        radius=1.2, startangle=90,
        # wedgeprops={'width': 0.8, 'linewidth': 1, 'edgecolor': 'w'},
        textprops={'fontsize': 15, 'fontfamily': 'KaiTi', 'color': 'k'})

# cellText:创建二维
# cellLoc:文本对齐方式
# rowLabels:行标题
# colLabels:列标题
# loc:图表位置
plt.table(cellText=[data],
          cellLoc='center',
          rowLabels=['销售额'],
          colLabels=df['子类目'],
          # 下部居中对齐
          loc='lower center',

          # x:表格左下角的 x 坐标。
          # y:表格左下角的 y 坐标。
          # width:表格的宽度。
          # height:表格的高度。
          bbox=[0, -0.25, 1, 0.1])  # 调整表格位置,避免与饼图重叠

# 修改后的图例设置
plt.legend(
    df['子类目'],
    loc='center left',          # 基准定位点设为左侧中部
    bbox_to_anchor=(1, 1),    # 将图例锚定到画布右侧 (x=1, y=1)
    prop={'size': 10},           # 调小字体避免溢出
    title="子类目说明",          # 添加标题提升可读性
    # frameon=False               # 去掉图例边框(可选)
)

plt.tight_layout()  # 关键!自动压缩饼图区域,为图例腾出空间

plt.show()
相关推荐
煤烦恼5 分钟前
大数据应用开发与实战(1)
信息可视化
刘立军31 分钟前
本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)
人工智能·后端·python
初心_202438 分钟前
2. python协程/异步编程详解
java·前端·python
Psycho_MrZhang1 小时前
Pytorch 反向传播
人工智能·pytorch·python
这里有鱼汤1 小时前
别怪 Python 慢,是你 import 的姿势不对!我亲测提速 3~5 倍
后端·python
hyhrosewind2 小时前
Python数据容器:数据容器的分类、数据容器特点总结、各数据容器遍历的特点、数据容器通用操作(统计,转换,排序)
python·数据容器的分类·各数据容器的特点·各数据容器的遍历·数据容器的通用操作·统计,转换,排序
灏瀚星空2 小时前
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——线性代数与矩阵运算 | 矩阵基础
笔记·python·学习·线性代数·数学建模·金融·矩阵
Amctwd2 小时前
【LLM】解析RAG增强检索技术:原理、实现与应用
python
乐享极致2 小时前
Python 数据可视化进阶:精准插入图表到指定 Excel 工作表
python·信息可视化·excel