python中使用matplotlib绘制饼状图,常用的参数如下:
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False)
x:指定绘图的数据;
explode:指定饼图某些部分的突出显示,即呈现爆炸式;
labels:为饼图添加标签说明,类似于图例说明;
colors:指定饼图的填充色;
autopct:自动添加百分比显示,可以采用格式化的方法显示,可设置保留几位小数;
pctdistance:设置百分比标签与圆心的距离;
shadow:是否添加饼图的阴影效果;
labeldistance:设置各扇形标签(图例)与圆心的距离;
startangle:设置饼图的初始摆放角度;
radius:设置饼图的半径大小;
counterclock:是否让饼图按逆时针顺序呈现;
wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;
textprops:设置饼图中文本的属性,如字体大小、颜色等;
center:指定饼图的中心点位置,默认为原点
frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;
实例1:
将下图数据绘制为饼状图。
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字体
name = ["提高劳动效率", "提高生活质量", "有利于社会安定、生活安全", "丰富娱乐生活", "其他"] # 饼状图标签
data = [84, 79, 46, 62, 1] # 各项的数据,与name一一对应
lt = [] # 建立空列表,用于存放计算结果
for i in range(len(data)): # 遍历data,每遍历一个数据进行一次运算
result = data[i] / sum(data)
# print(result)
lt.append(result) # 将计算结果一次添加到lt中
# print(lt)
print(lt)
plt.axes(aspect=1)
plt.pie(x=lt, autopct='%1.2f%%') # x表示饼状图的数据,autopct后面的值1.2表示保留2位小数,1.1表示保留一位小数
plt.legend(name, loc="best") # 绘制图的图例为name,位置为最佳
plt.title("人工智能对生活的影响") # 饼图的名称
plt.show()
运行结果如下,字体以及图例的位置可自行进行调整。
实例2:
对上面程序添加一些饼图的参数,例如阴影、饼图分离等。
数据如下:
代码实现:
import matplotlib.pylab as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字体
name = ["博士", "硕士", "本科", "大专", "高中/中专"]
data = [15, 28, 37, 6]
lt = []
for i in range(len(data)):
result = data[i]/sum(data)
lt.append(result)
explode = (0, 0.2, 0, 0) # 设置饼图分离
plt.pie(x=lt, autopct='%1.3f%%', pctdistance=1.3, explode=explode, shadow=True)
# 设置保留三位小数,设置百分比距离圆心距离1.3,设置饼图分离,设置阴影
plt.legend(name, loc="best")
plt.title("目前最高学历")
plt.show()
运行结果:
可以提供一些统计数据,给大家自行练习。
最后给大家提供一个自动生成饼状图的代码,提供一个模板,如果需要生成饼状图,只需要把需要的数据输入进去,即可生成。
import matplotlib.pylab as plt
import matplotlib
def get_datas():
labels = []
datas = []
print('if label== +,exit')
while True:
label = input("Input label>>>")
if label == '+':
break
data = eval(input("Input data>>>"))
labels.append(label)
datas.append(data)
sumofdata = sum(datas)
for i in range(len(datas)):
result = datas[i] / sumofdata
return labels, datas
def get_title():
print('Input title>>>')
if __name__ == '__main__':
fig = plt.figure()
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 字体
title = get_title()
plt.title(title)
labels, datas = get_datas()
plt.pie(x=datas, labels=labels, autopct='%1.2f%%')
plt.legend(labels, loc='best')
plt.show()