利用python处理数据,我们需要学习的至少有numpy、pandas、matplotlib这三个工具。我们最开始学的是matplotlib。
官方文档:https://matplotlib.org
作图参考文档:https://matplotlib.org/gallery/index.html
什么是matplotlib?
Matplotlib是一个Python 2D绘图库,可以生成各种硬拷贝格式和跨平台交互式环境的出版物质量数据。Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包。这是官方文档给出的定义
个人理解是:matplotlib就是一个python用来作图的第三方工具(库)。
在开始使用matplotlib之前,我们需要先安装它,一般如果装的是anaconda的话,里边都会有的,如果没有就可以用
pip install matplotlib
下载
安装好之后就可以使用了
怎么使用?
1、导入matplotlib下的包pyplot,并另起名为plt,目的是为了方便
from matplotlib import pyplot as plt #导入pyplot
或者用如下这种方式导入pyplot为plt
import matplotlib.pyplot as plt
两种方法的效果是一样的
2、取到数据,这里是随便写的几个数据(12小时的温度)用来做例子,在使用的时候根据实际的需求来取数据就行。
#数据在x轴的位置,是一个可迭代对象
x = range(2,26,2) #12小时
#数据在y轴的位置,是一个可迭代对象
y = [15,13,14.5,17,20,25,26,26,24,22,18,15] #对应的温度
3、用plt.plot()
画图,其中plot需要接受参数,前两个参数是x、y坐标,其中x和y都必须是可迭代的,对象。例如如上的x和y,x轴和y轴的数据一起组成了所有要绘制出的坐标,这意味着我们会有12个坐标,分别是(2,15),(4,13),(6,14.5),(8,17),...
plt.plot(x,y) #传入x和y,通过plot绘制出折线图
4、在画完图之后用plt.show()显示出来
plt.show()
完整代码
from matplotlib import pyplot as plt #导入pyplot
#数据在x轴的位置,是一个可迭代对象
x = range(2,26,2)
#数据在y轴的位置,是一个可迭代对象
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
#-->x轴和y轴的数据一起组成了所有要绘制出的坐标
#-->分别是(2,15),(4,13),(6,14.5),(8,17),...
plt.plot(x,y) #传入x和y,通过plot绘制出折线图
# plt.bar(x,y) #根据传入的x和y,通过bar绘制柱状图
plt.show() #在执行程序的时候显示图形
运行得到的图这样就完成了一个简单的作图。但这并不是很完美的作图,一般我们都知道,做一个图要想跟很直观的让每个人都能看明白,那至少得有点标示吧,比如:
1、这个图的名字plt.title()
2、x、y轴分别表示什么plt.xlabel()
, plt.ylabel()
3、图例
有时候一个图表里可能不止一组数据,有多组,那我得知道每条线或者每个条形图、直方图表示的是哪组数据吧,这时候就需要用到图例了,在plot中使用label设置名称plt.plot(x,y,label='第一条线')
然后用plt.legend()
生成图例,这个会在后边使用。
在这里legend有几个参数,如下:
'best' : 0, (only implemented for axes legends)(自适应方式)
'upper right' : 1,
'upper left' : 2,
'lower left' : 3,
'lower right' : 4,
'right' : 5,
'center left' : 6,
'center right' : 7,
'lower center' : 8,
'upper center' : 9,
'center' : 10,
4、x轴的刻度,使用plt.xticks()
设置,它需要参数,第一个是传入x轴的刻度,例如直接传入xplt.xticks(x)
,如果觉得刻度太密集,可以用这个方式来改善plt.xticks(x[::2])
5、这样设置好刻度之后,但我想要更直接的看出x轴的情况,所以这时候就得给x轴设置一些标示值(这个点的描述或解释),方式是在plt.xticks(x)
的参数后边紧跟对x轴的某个点描述的语句plt.xticks(x,_x_ticks)
,描述和刻度必须要是对应的。即:一个刻度对应一个描述。他们的对应关系必须写对了,不然会出现描述与实际不一样的情况,容易误导看图的人做出错误的判断。做出错误的图形。
其中_x_ticks值是的个数是和x的值的个数对应的。
这里还用到了一个参数rotation
这是用来设置描述的倾斜角度的(逆时针),rotation=45
表示逆时针旋转45度。
问题:会出现中文乱码
解决方法:
方法1、在windows上找到自己想用的字体,然后把路径拷贝出来设置即可解决,缺点:涉及到中文的地方就需要设置一次
然后拷贝出他的路径,包括名字。
做如下设置
from matplotlib import font_manager
#设置中文字体,在windows中找到自己想用的字体,然后把字体的路径添加进来,最后在需要的地方通过fontproperties=my_font使用即可
my_font=font_manager.FontProperties(fname='C:/Windows/Fonts/AdobeFangsongStd-Regular.otf')
在涉及中文的地方把fontproperties=my_font)
加进去即可,例如:
plt.title('折线图',fontproperties=my_font)) #把中文字体加进去
方法2
直接在程序中加入如下代码即可
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
下面是Windows的字体对应名称!
黑体 SimHei
微软雅黑 Microsoft YaHei
微软正黑体 Microsoft JhengHei
新宋体 NSimSun
新细明体 PMingLiU
细明体 MingLiU
标楷体 DFKai-SB
仿宋 FangSong
楷体 KaiTi
仿宋_GB2312 FangSong_GB2312
楷体_GB2312 KaiTi_GB2312
加入后就不用修改任何一个地方了。
问题说完了,接下来开始作图
1、折线图plot
练习1、利用折线图显示出12小时内的气温变化
from matplotlib import pyplot as plt #导入pyplot
#数据在x轴的位置,是一个可迭代对象
x = range(2,26,2)
#数据在y轴的位置,是一个可迭代对象
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
#-->x轴和y轴的数据一起组成了所有要绘制出的坐标
#-->分别是(2,15),(4,13),(6,14.5),(8,17),...
plt.plot(x,y) #传入x和y,通过plot绘制出折线图
# plt.bar(x,y) #根据传入的x和y,通过bar绘制柱状图
plt.show() #在执行程序的时候显示图形
结果:练习2、设置图像的大小和像素并保存,设置x轴刻度
import matplotlib.pyplot as plt
#figure指的是图形图表的意思,在这里指的就是我们画的图
#当图片模糊时,可以传入dpi(像素)来改变图片,让图片更清晰,像素越大占的空间也就越大
fig = plt.figure(figsize=(10,8),dpi=80)
#数据在x轴的位置,是一个可迭代对象
x = range(2,26,2)
#数据在y轴的位置,是一个可迭代对象
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
#-->x轴和y轴的数据一起组成了所有要绘制出的坐标
#-->分别是(2,15),(4,13),(6,14.5),(8,17),...
plt.plot(x,y) #传入x和y,通过plot绘制出折线图
plt.savefig('./sig_size.jpg') #将生成的图表保存下来
# plt.bar(x,y) #根据传入的x和y,通过bar绘制柱状图
# plt.xticks(x) #改变x轴的刻度
plt.xticks(x[::2]) #如果觉得刻度太密集,可以用这种方法来改变,因为x和y都是可迭代的对象
plt.show() #在执行程序的时候显示图形
执行结果会在当前目录保存一张图,也会显示出来
练习3、做出10-12点的每一分钟的气温折线图
#a表示10点到12点每一分钟的气温,绘制折线图
import matplotlib.pyplot as plt,random
a = [random.randint(20,35) for i in range(120)] #120个气温点
b = range(120) #120分钟(10-12点)
plt.plot(b,a)
plt.show()
结果:练习3优化、加中文字体方法1
import matplotlib.pyplot as plt
import random
from matplotlib import font_manager
#设置中文字体,在windows中找到自己想用的字体,然后把字体的路径添加进来,最后在需要的地方通过fontproperties=my_font使用即可
my_font = font_manager.FontProperties(fname='C:/Windows/Fonts/AdobeFangsongStd-Regular.otf')
plt.figure(figsize=(12,8))
x = range(120)
random.seed(10) #设置随机种子,让不同时候随机的得到的结果不一样
y = [random.uniform(20,35) for i in range(120)]
plt.plot(x,y)
_x_ticks = ['10点{}分'.format(i) for i in x if i < 60]
_x_ticks += ['11点{}分'.format(i-60) for i in x if i > 60]
plt.xticks(x[::5],_x_ticks[::5],rotation=45,fontproperties=my_font) #rotation旋转的角度,逆时针旋转
plt.show()
结果:加中文字体方法2
import matplotlib.pyplot as plt
import random
from matplotlib import font_manager
#设置字体格式,防止中文乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False #设置正常显示正负号
plt.figure(figsize=(8,6))
x = range(120)
random.seed(10) #设置随机种子,让不同时候随机的得到的结果不一样
y = [random.uniform(20,35) for i in range(120)]
plt.plot(x,y)
_x_ticks = ['10点{}分'.format(i) for i in x if i < 60]
_x_ticks += ['11点{}分'.format(i-60) for i in x if i > 60]
plt.xticks(x[::5],_x_ticks[::5],rotation=45)
plt.show()
结果:设置标题、x轴y轴标签
import matplotlib.pyplot as plt
import random
from matplotlib import font_manager
#设置字体格式,防止中文乱码,这是全局的,比在windows找字体设置要好很多
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
#设置中文字体,在windows中找到自己想用的字体,然后把字体的路径添加进来,最后在需要的地方通过fontproperties=my_font使用即可
# my_font = font_manager.FontProperties(fname='C:/Windows/Fonts/AdobeFangsongStd-Regular.otf')
plt.figure(figsize=(12,8),dpi=80)
x = range(120)
random.seed(10) #设置随机种子,让不同时候随机的得到的结果不一样
y = [random.uniform(20,35) for i in range(120)]
plt.title('10-12点气温变化') #设置标题
plt.xlabel('时间') #设置x轴标签
plt.ylabel('温度℃') #设置y轴标签
plt.plot(x,y)
#因为是10-12点,两个小时,120分钟,所以需要判断一下,小于60说明还在10点,大于60说明到11点了
_x_ticks = ['10点{}分'.format(i) for i in x if i < 60]
_x_ticks += ['11点{}分'.format(i-60) for i in x if i > 60]
plt.xticks(x[::5],_x_ticks[::5],rotation=45) #设置x轴的刻度
#x[::5]指定x轴的刻度,_x_ticks[::5]设置x轴每个刻度的名称,rotation=45逆时针旋转45度
plt.show()
结果:练习4、11-30岁的恋爱次数折线图(作为练习的假设数据)
#画出11-30岁的恋爱情况
import matplotlib.pyplot as plt
import matplotlib
#设置字体格式,防止中文乱码,这是全局的,比在windows找字体设置要好很多
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False #设置正常显示正负号
x = range(11,31) #年龄
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1] #对应年龄的恋爱次数
plt.figure(figsize=(8,6))
plt.title('11-30岁恋爱走势图')
_x_ticks = ['{}岁'.format(i) for i in x]
plt.xlabel('年龄')
plt.ylabel('恋爱次数')
plt.plot(x,y,label='A')
plt.legend() #plt.legend()生成默认图例
plt.xticks(x,_x_ticks,rotation=45)
plt.show()
结果:多条折线合在一起
小明和小王11岁到30岁分别的恋爱次数为
y1 =[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1],做出折线图
import matplotlib.pyplot as plt
import matplotlib
#设置字体格式,防止中文乱码,这是全局的,比在windows找字体设置要好很多
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False #设置正常显示正负号
x = range(11,31)
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y1 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
# plt.figure(figsize=(20,8))
plt.title('11-30岁恋爱走势图')
_x_ticks = ['{}岁'.format(i) for i in x]
plt.xlabel('年龄')
plt.ylabel('恋爱次数')
#设置线条的宽度,颜色
plt.plot(x,y,label='小明',color='red', linewidth=2.5, linestyle="-") #label是设置图例,就是图上的那两个小的解释图的东西
plt.plot(x,y1,label='小王',color='blue' ,linewidth=2.5, linestyle="-")
plt.grid(alpha=0.9) #设置网格(透明度)
#plt.legend()生成图例
plt.legend(loc='best') #在legend的参数中, loc参数设置图例的显示位置的
'''
'best' : 0, (only implemented for axes legends)(自适应方式)
'upper right' : 1,
'upper left' : 2,
'lower left' : 3,
'lower right' : 4,
'right' : 5,
'center left' : 6,
'center right' : 7,
'lower center' : 8,
'upper center' : 9,
'center' : 10,
'''
plt.xticks(x,_x_ticks,rotation=45)
plt.show()
结果:2、条形图bar
条形图和直方图的区别:条形图就是表示一个固定的值,而直方图表示的是一个区域的值
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False #设置正常显示正负号
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
#设置图形大小
plt.figure(figsize=(8,6),dpi=80)
#绘制条形图
# plt.bar(a,b)
# plt.xticks(rotation=90)
# plt.show()
#直接用上边的这种方法也行,但不规律,同学的是规律的
plt.bar(range(len(a)),b,width=0.5,color='blue')
x = range(len(a))
_x_ticks = a
plt.title('条形图')
plt.xlabel('电影名称')
plt.ylabel('票房')
plt.xticks(x,_x_ticks,rotation=90)
plt.show()
结果:2.1、横着的条形图barh
与竖着的区别就是之前本来的x轴的ticks,变成了y轴的ticks
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
#设置图形大小
plt.figure(figsize=(8,6),dpi=80)
#画横着的条形图
plt.barh(range(len(a)),b,height=0.5,color='green')
_y_ticks = a
plt.yticks(range(len(a)),_y_ticks,rotation=45,color='red')
plt.xlabel('票房',color='blue')
plt.ylabel('电影名称',color='blue')
plt.title('横着的条形图',color='blue')
plt.show()
结果:2.2、几个条形图在一个图里显示
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
plt.figure(figsize=(8,6),dpi=80)
a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
#四部电影三天分别的票房
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
"""
下边的设置是为了让三天的票房分别在一起,在设置宽度的时候就得好好计算一下
因为x轴的值是0-4这个范围内,其中
0-1是"猩球崛起3:终极之战",1-2是"敦刻尔克",2-3是"蜘蛛侠:英雄归来",3-4是"战狼2"
所以需要每一个电影的三个条形图的宽度加起来分别都是小于1的,这样才能直观的看出来效果,否则会很混乱,或者图形重叠
x_14=[0,1,2,3,4]
x_15=[0.2,1.2,2.2,3.2,4.2]
x_16=[0.4,2.4,4.4,6.4,8.4]
"""
bar_width = 0.2
x_14 = list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width*2 for i in x_14]
#画条形图
plt.bar(range(len(a)),b_14,width=bar_width,label='9月14日')
plt.bar(x_15,b_15,width=bar_width,label='9月15日')
plt.bar(x_16,b_16,width=bar_width,label='9月16日')
plt.legend(loc='best') #设置图例
plt.title('多数据条形图') #设置图的标题
plt.xlabel('电影名称') #设置x轴的标签
plt.ylabel('票房') #设置y轴的标签
plt.grid(alpha=0.9) #设置网格
#设置x轴的刻度
plt.xticks(x_15,a)
plt.show()
结果:3、直方图hist
直方图非常像条形图,倾向于通过将区段组合在一起来显示分布,条形图是通过一对坐标点来确定表示的,而直方图是一个区域的形式来表示的,一个简单的例子:
import matplotlib.pyplot as plt
population_ages = [22,55,62,45,21,22,34,42,42,4,99,102,110,120,121,122,130,111,115,112,80,75,65,54,44,43,42,48]
bins = [0,10,20,30,40,50,60,70,80,90,100,110,120,130]
plt.hist(population_ages,bins,histtype='bar',rwidth=0.8)
plt.xlabel('x')
plt.ylabel('y')
plt.title('直方图')
# plt.legend()
plt.show()
结果:练习1、有250部电影的时长数据,用直方图表示出来
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
plt.figure(figsize=(8,6),dpi=80)
a=[131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
#计算组距
d = 3 #组距
num_bins = (max(a)-min(a)) // d
print('最大值:',max(a))
print('最小值:',min(a))
print('组距:',d)
print('组数:',bins)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
# plt.hist(data, bins=40, normed=0, facecolor="blue", edgecolor="black", alpha=0.7)
lst = plt.hist(a,num_bins,normed='True',alpha=0.5) #normed是指定显示频数或者频率,默认频数,True的时候为频率
# x = lst[1]
# y = lst[0]
#设置数字标签
# for x1,y1 in zip(x,y):
# plt.text(x1+1.5, y1+0.0005, '%.4f' % y1, ha='center', va= 'bottom',fontsize=12,rotation=-90,color='blue')
#设置x轴的刻度
plt.xticks(range(min(a),max(a)+d,d))
plt.grid() #画网格
plt.xlabel('区间')
plt.ylabel('频率/组距')
plt.title('频率直方图')
plt.show()
结果:4、散点图scatter
画出3月份和10月份的温度散点图,数据已知
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
y_3 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
x_3 = range(1,32)
x_10 = range(51,82) #为了让两个月份的温度散点图区别开来,所以特意取大了。而不是直接从32开始算
#设置图片的大小
plt.figure(figsize=(8,6),dpi=80)
#使用scatter绘制散点图,与折线图唯一的区别就是这里
plt.scatter(x_3,y_3,label='3月份')
plt.scatter(x_10,y_10,label='10月份')
#调整x轴的刻度
_x = list(x_3) + list(x_10)
_xtick_labels = ['3月{}日'.format(i) for i in x_3]
_xtick_labels += ['10月{}日'.format(i-50) for i in x_10]
plt.xlabel('时间')
plt.ylabel('温度')
plt.title('标题')
plt.xticks(_x[::3],_xtick_labels[::3],rotation=45)
plt.legend(loc='best')
plt.show()
结果:5、饼状图
参考自:https://zhuanlan.zhihu.com/p/38160291
绘制饼图
explode
:设置各部分突出
labels
:设置各部分标签
labeldistance
:设置各扇形标签(图例)与圆心的距离,1.1表示1.1倍半径
autocpt
:自动添加百分比显示,可以采用格式化的方法显示
shadow
:设置是否有阴影
startangle
:起始角度,默认从0开始逆时针转
pctdistance
:设置百分比标签与圆心的距离
radius
: 控制饼图半径
counterclock
:是否让饼图按逆时针顺序呈现;wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;textprops:设置饼图中文本的属性,如字体大小、颜色等;center:指定饼图的中心点位置,默认为原点frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;
返回值
l_text
:圆内部文本,matplotlib.text.Text object
p_text
:圆外部文本
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
labels = ['第一部分','第二部分','第三部分'] #各部分标签
size = [55,30,15] #各部分大小
color = ['red','green','blue']#各部分颜色
explode = [0.05,0,0] #各部分突出值
plt.pie(size,explode=explode,labels=labels,colors=color,labeldistance=1.1,autopct='%1.1f%%',shadow=False,startangle=90,pctdistance=0.6)
#颜色也可以不设置,会有默认颜色
plt.axis('equal') #设置横轴和纵轴大小相等,这样饼才是圆的
plt.legend()
plt.show()
结果:可以去这个网站找自己喜欢的颜色,把之前colors里边的简称换成所选颜色的16进制即可http://tool.c7sky.com/webcolor/
或者在下图中去找自己想要的颜色名称
各个颜色名称
图片来自:https://blog.csdn.net/captain811/article/details/79248912