数据可视化 —— 饼图
一、饼图的所有常用使用场景
饼图是一种直观展示数据占比关系的图表,适用于以下常见场景:
1. 市场与商业分析
-
市场份额:展示不同品牌/产品在市场中的占有率。
-
收入构成:分析公司各业务线或产品的收入占比。
-
客户分布:按地区、行业或客户类型划分的用户比例。
2. 预算与资源分配
-
预算分配:显示企业或项目的资金分配(如研发、营销、人力等)。
-
资源使用:展示时间、人力或物料在不同任务中的分配比例。
3. 人口与用户统计
-
人口结构:按年龄、性别、教育程度等划分的群体比例。
-
用户画像:用户群体特征(如新用户/老用户、活跃度分布)。
-
调查结果:问卷反馈的满意度(如“满意/中立/不满意”的占比)。
4. 运营与项目管理
-
库存管理:不同品类商品的库存占比。
-
问题归因:分析问题原因的比例(如客户投诉类型分布)。
-
项目进度:任务完成状态的占比(如已完成/进行中/未开始)。
5. 教育与研究
-
成绩分布:学生成绩等级(如优秀、良好、及格)的占比。
-
实验数据:不同实验结果的出现频率或比例。
6. 其他场景
-
社交媒体互动:点赞、评论、分享等行为的占比。
-
能源消耗:不同能源类型(如煤炭、太阳能)的使用比例。
-
选举结果:候选人得票率分布。
使用饼图的注意事项
-
类别数量:建议不超过5-7个类别,避免碎片化。
-
强调单一占比:适合突出最大或最小的部分(如“其他”类别)。
-
数据要求:各部分的百分比总和需为100%。
-
对比限制:不适合精确比较多个相似比例(此时条形图更优)。
二、基本用法
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()
三、案例一:消费账单占比
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'] = Falsedata = [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()
四、案例二:店铺促销方式分析(添加表格数据)
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'] = Falsedf = 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()
五、案例三:购物平台的销售额
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'] = Falsedf = 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()