数据可视化 —— 饼图

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

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


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()
相关推荐
思则变20 分钟前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络1 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find2 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
DataGear2 小时前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板
javascript·数据库·sql·信息可视化·数据分析·echarts·数据可视化
博观而约取3 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector5 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习5 小时前
Python入门Day2
开发语言·python
Vertira5 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉5 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗5 小时前
黑马python(二十四)
开发语言·python