python画图|饼图绘制教程

饼图是日常表达数据特征常用的方式,在python画图里面也经常用到,今天探索一下饼图画法。

【1】官网教程

养成良好的学习习惯,即使是看不懂,也要到官网瞄一眼,万一有啥可以看懂的。链接如下:

https://matplotlib.org/stable/gallery/pie_and_polar_charts/pie_features.html#sphx-glr-gallery-pie-and-polar-charts-pie-features-py

【1.1】Label slices教程

打开后的页面给了一个示例:Label slices。代码如下:

import matplotlib.pyplot as plt

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]

fig, ax = plt.subplots()
ax.pie(sizes, labels=labels)

尝试运行后输出图1:

图1

由图1可见:

【a】按照不同的标签即label画出了饼图;

【b】每一部分的比例按照sizes数组分配;

【c】ax.pie(sizes,labels=labels)通过调用pie定义了画饼图,sizes就是每一部分所占比例,labels就是各部分的标签

基于上述,给官网代码添加注释。注:官网程序其实无法输出图形,因为缺少plt.show()

import matplotlib.pyplot as plt #引入matplotlib模块

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' #定义一个label数组,存储了字符量
sizes = [15, 30, 45, 10] #定义sizes数组,存储整型数据

fig, ax = plt.subplots() #定义一个图形,图形的坐标将通过ax设置
ax.pie(sizes, labels=labels) #画一个饼图
plt.show() #绘图

【1.2】Auto-label slices教程

第一个程序解读完毕,意犹未尽,因为常规的饼图一般要加上具体比例,为此来到第二个示例:

相对于label slices,Auto-label slices仅仅在最后的ax.pie()部分增加了:

autopct='%1.1f%%')

增加后的完整代码为:

import matplotlib.pyplot as plt #引入matplotlib模块

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' #定义一个label数组,存储了字符量
sizes = [15, 30, 45, 10] #定义sizes数组,存储整型数据

fig, ax = plt.subplots() #定义一个图形,图形的坐标将通过ax设置
ax.pie(sizes, labels=labels, autopct='%1.1f%%') #画一个饼图
plt.show() #绘图

运行后输出结果为:

图2

图2相对图1增加了各部分所占的比例,在日常应用中更为常见。

autopct的作用就是将各部分比例显示出来。

【1.3】Color slices教程

在第二个程序解读完毕基础上,我们发现饼图颜色总是自动配成,有时候饼图颜色需要个性化设置,为此学习第三个示例。

相对于Auto-label slices,Color slices仅仅在最后的ax.pie()部分,删除autopct,但是增加了:

 colors=['olivedrab', 'rosybrown', 'gray', 'saddlebrown']

增加后的完整代码为:

import matplotlib.pyplot as plt #引入matplotlib模块

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' #定义一个label数组,存储了字符量
sizes = [15, 30, 45, 10] #定义sizes数组,存储整型数据

fig, ax = plt.subplots() #定义一个图形,图形的坐标将通过ax设置
ax.pie(sizes, labels=labels, colors=['olivedrab', 'rosybrown', 'gray', 'saddlebrown']) #画一个饼图

plt.show() #绘图

 运行后输出图片为:

图3

由图3可见:

【a】colors=['olivedrab', 'rosybrown', 'gray', 'saddlebrown']设置了饼图颜色

【b】由于上述颜色单词除gray外几乎不太认识,因此尝试更改为我们熟悉的颜色,更改后的colors为:

colors=['blue', 'red', 'gray', 'yellow']

完整代码为:

import matplotlib.pyplot as plt #引入matplotlib模块

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' #定义一个label数组,存储了字符量
sizes = [15, 30, 45, 10] #定义sizes数组,存储整型数据

fig, ax = plt.subplots() #定义一个图形,图形的坐标将通过ax设置
ax.pie(sizes, labels=labels, colors=['blue', 'red', 'gray', 'yellow']) #画一个饼图

plt.show() #绘图

运行后的输出结果为:

图4

至此可知,pie()模块可控制各部分占比和饼图颜色输出。

【1.4】Hatch slices教程

此处是将饼图设置为类似多孔介质的形式,为防止密集恐惧,慎用,最好不学。

【1.5】Swap label and autopct text positions-交换标签和比例文本位置教程

在饼图上可以显示各部分标签和占比,有时候为了表达的需求,这两个参数的位置需要灵活设定,此处考虑直接将其交换。

依然是在ax.pie()里,新增一条:

pctdistance=1.25, labeldistance=.6

此时的完整代码为:

import matplotlib.pyplot as plt #引入matplotlib模块

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' #定义一个label数组,存储了字符量
sizes = [15, 30, 45, 10] #定义sizes数组,存储整型数据

fig, ax = plt.subplots() #定义一个图形,图形的坐标将通过ax设置
ax.pie(sizes, labels=labels,autopct='%1.1f%%', pctdistance=1.25, labeldistance=.6) #画一个饼图

plt.show() #绘图

运行后输出结果为:

图5

由图可见:

pctdistance=1.25, labeldistance=.6是将占比比例数据移到饼图外侧,把标签移到饼图内侧。

尝试修改这两个参数的位置为:

pctdistance=0.6, labeldistance=1.25

运行程序后:

图6

 可见,只要这个distance设置的数据<1,对应的参数就置于饼图内侧,否则就是外侧;

继续修改,尝试全部放到图内:

pctdistance=0.6, labeldistance=0.6

运行后的输出结果为:

图7

标签和比例果然贴到了一起,这提示我们要仔细设定参数位置。

【1.6】explode, shade, and rotate slices-爆炸,阴影和旋转教程

画饼图时,为了突出某一部分,往往会尝试将其单独打出来,再打上阴影,要想实现这个目标,这里主要使用的就是explode和shade模块。

尝试在代码中增加explode定义:

explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs'),将第二个饼状即Hogs所对应饼状单独爆炸出来

与之相对应,在ax.pie()模块,增加shadow=True,即有阴影;增加startangle=90,即整个图旋转90度。此时的完整代码为:

import matplotlib.pyplot as plt #引入matplotlib模块

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' #定义一个label数组,存储了字符量
sizes = [15, 30, 45, 10] #定义sizes数组,存储整型数据

explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs'),将第二个饼状即Hogs所对应饼状单独爆炸出来

fig, ax = plt.subplots()
ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
       shadow=True, startangle=90) #画饼状图,摆闸部分有阴影,全图旋转90度

plt.show() #绘图

运行后的输出结果为:

图8

第二个饼状果然爆炸出来,还将全图旋转。

为测试startangle,我们尝试修改它的赋值为0,90,180和270,并且将所有图同时输出,此时的代码为:

import matplotlib.pyplot as plt #引入matplotlib模块

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' #定义一个label数组,存储了字符量
sizes = [15, 30, 45, 10] #定义sizes数组,存储整型数据

explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs'),将第二个饼状即Hogs所对应饼状单独爆炸出来

fig, axs = plt.subplots(2,2)
axs[0,0].pie(sizes, explode=explode, labels=labels,autopct='%1.1f%%',
       shadow=True, startangle=0) #画饼状图,摆闸部分有阴影,全图旋转0度
axs[0,0].set_title('startangle=0') #增加图名
axs[0,1].pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
       shadow=True, startangle=90) #画饼状图,摆闸部分有阴影,全图旋转90度
axs[0,1].set_title('startangle=90') #增加图名
axs[1,0].pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
       shadow=True, startangle=180) #画饼状图,摆闸部分有阴影,全图旋转180度
axs[1,0].set_title('startangle=180') #增加图名
axs[1,1].pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
       shadow=True, startangle=270) #画饼状图,摆闸部分有阴影,全图旋转270度
axs[1,1].set_title('startangle=270') #增加图名
plt.show() #绘图

运行后的输出结果为:

图9

可见整个图做了一轮顺时针旋转。

【2】总结

本文给出了饼图的一般绘图教程,包括颜色、比例设置,比例参数和标签参数位置设置,以及特定饼块的爆炸、阴影显示,还对全图进行了旋转。

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值