matplotlib之饼图
饼图(pie plot),或称饼状图,在日常的工作、商业活动、数据分析等领域中饼图是应用最广泛的一种数据展示的方式,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于100%。
饼图:
饼图(pie plot),或称饼状图,在日常的工作、商业活动、数据分析等领域中饼图是应用最广泛的一种数据展示的方式,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于100%。
pie函数
- 函数定义:
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, normalize=True, data=None)
- 常用参数:
-
x:指定绘图的数据,每一份数据会按照X/SUM(X)的比例进行划分;
-
explode:指定饼图某些部分的突出显示,即呈现爆炸式;
-
labels:为饼图添加标签说明,类似于图例说明;
-
colors:指定饼图的填充色;
-
autopct:自动添加百分比显示,可以采用格式化的方法显示;
-
pctdistance:设置百分比标签与圆心的距离;
-
shadow:是否添加饼图的阴影效果;
-
labeldistance:设置各扇形标签(图例)与圆心的距离;
-
startangle:设置饼图的初始摆放角度;
-
radius:设置饼图的半径大小;
-
counterclock:是否让饼图按逆时针顺序呈现;
-
wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;
-
textprops:设置饼图中文本的属性,如字体大小、颜色等;
-
center:指定饼图的中心点位置,默认为原点
-
frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;
pie的详细定义:
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html
示例说明:
通过夏季宵夜的销售占比进行示例说明:
import matplotlib.pyplot as plt
import matplotlib
"""
font:设置中文
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
#设置大小
plt.rcParams['figure.figsize']=[10,10]
#定义饼状图的标签,标签是列表
labels =[ '麻辣小龙虾','炭烤生蚝','花毛一体','麻辣田螺']
#每个标签占多大,会自动按照百分比绘制
data = [15,30,45,10]
# 绘制饼图
plt.pie(data,labels=labels)
plt.show()
运行结果:
扩展应用
饼图常用属性
在绘制饼图的时候增加图例,数据标签,以及增加相应的显示效果
换种方式来设置颜色,通过get_cmap函数来选择matplotlib预定义的colormap设置颜色,具体后续会专门写一篇文章进行介绍。
- colormap的介绍
https://matplotlib.org/stable/tutorials/colors/colormaps.html?highlight=colormap - get_cmap函数定义
matplotlib.cm.get_cmap(name=None, lut=None)
官网介绍:https://matplotlib.org/stable/api/cm_api.html#matplotlib.cm.get_cmap
import matplotlib.pyplot as plt
import matplotlib
"""
font:设置中文
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
#设置大小
plt.rcParams['figure.figsize']=[10,10]
#定义饼状图的标签
labels =[ '麻辣小龙虾','炭烤生蚝','花毛一体','麻辣田螺']
#每个标签占比,会自动按照x/sum(x)所占百分比绘制
data = [15,30,45,10]
#对比各个部分的凸显程度
explode = (0,0.1,0.2,0.3)
"""
autopct='%.0f%%' 显示百分比
textprops = {'fontsize':30, 'color':'k'} 大小为30,颜色为黑色
explode=explode 饼图某些部分的突出显示
shadow=True 显示阴影
startangle,起始角度,0,表示第一块从0开始逆时针转.
pctdistance,百分比的文本离圆心的距离为
"""
#选择tab20c的色彩,
cmap = plt.get_cmap("tab20c")
#选择tab20c中的4种颜色
color=cmap([1,3,6,9])
plt.pie(x=data, colors=ccolor,labels=labels,textprops = {'fontsize':12, 'color':'k'},
explode=explode, shadow=True,startangle=30, autopct="%0.2f%%",
pctdistance = 0.5)
# 显示图例
plt.legend()
# 展示
plt.show()
运行结果:
甜甜圈图表
甜甜圈图,又称之为环形图,是饼图的一种变体,是指将两个及以上的大小不一的饼图叠在,挖去中间部分构成的图形,本质是饼图将中间区域挖空。
对比饼图,甜甜圈图能够比较方便的对比各个不同的图形,而不是将注意力关注在饼图的各个扇形所占整体比重上,一般来说饼图很难进行多个饼图直接的对比,而且饼图的空间利用率不如甜甜圈图,甜甜圈图内部空心部分可以显示文本信息,标题等
甜甜圈图是在饼图的基础上通过wedgeprops来控制饼图内外边界的属性进行数据的展示。以家庭开支为例进行说明,其中分为内环和外环进行嵌套,来展示两个大类的数据占比情况。
import matplotlib.pyplot as plt
import matplotlib
"""
font:设置中文
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
fig, ax = plt.subplots()
size = 0.3
category =[60,30,10]
category_labels=["女主","小孩","男主"]
detail=[30,30,20,10,5,5]
detail_labels=["化妆品","衣服","玩具","零食 ","电子产品","游戏"]
#获取需要填充的颜色
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])
#外圈成员开支分类,wedgeprops控制圆环的宽度
ax.pie(category, radius=1, colors=outer_colors,labels=category_labels,
textprops = {'fontsize':15, 'color':'black'},
wedgeprops=dict(width=size, edgecolor='w'))
#内圈各个成员开支细分,wedgeprops控制圆环的宽度
ax.pie(detail, radius=1-size, colors=inner_colors,labels=detail_labels,
textprops = {'fontsize':12, 'color':'w'},
wedgeprops=dict(width=size, edgecolor='w'))
ax.set(aspect="equal", title='家庭开支比例')
plt.legend()
plt.show()
运行结果:
总结
饼图的主要使用场景是用于反映数据构成的比例关系。
饼图的缺点:
- 饼图不适用于多分类的数据
因为随着分类的增多,每个切片就会变小,最后导致大小区分不明显,每个切片看上去都差不多大小,这样对于数据的对比是没有什么意义的。所以饼图不适合用于数据量大且分类很多的场景。
- 相比于具备同样功能的其他图表(比如百分比柱状图),饼图需要占据更大的画布空间。
- 很难进行多个饼图之间的数值比较。
饼图和柱状图区别
- 饼图主要是展示分类之间的占比情况。
- 而柱状图主要展示各个分类数量、大小的对比
更多推荐
所有评论(0)