饼图是日常表达数据特征常用的方式,在python画图里面也经常用到,今天探索一下饼图画法。
【1】官网教程
养成良好的学习习惯,即使是看不懂,也要到官网瞄一眼,万一有啥可以看懂的。链接如下:
【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】总结
本文给出了饼图的一般绘图教程,包括颜色、比例设置,比例参数和标签参数位置设置,以及特定饼块的爆炸、阴影显示,还对全图进行了旋转。