matplotlib基础

利用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上找到自己想用的字体,然后把路径拷贝出来设置即可解决,缺点:涉及到中文的地方就需要设置一次

在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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 以前,每年到夏天露肉的季节,就会开始叫嚷着健身。并定下远大的目标:练出马甲线,小蛮腰,蜜桃臀。花三分钟定好宏伟的目...
    Jane6666阅读 1,853评论 8 11
  • C太太确实是一个浪漫的人,偶尔写些东西,虽说几乎不定期更新但是还是很有意思的。有一次,写了一个精神励志体的小说,大...
    Caphintty图图阅读 260评论 0 1
  • 弃逐征尘踏归途,迎逢细问通有无。 杯酒洗尽心酸事,花影满身误相拂
    陽春阅读 199评论 6 8