Matplotlib
一、matplotlib的三层结构
1.容器层
包含
\quad
canvas,最底层的系统层,充当画板的角色。
\quad
figure,canvas上方的应用层的第一层,充当画布的角色。
\quad
axes,figure上方的应用层的第二层,充当绘图区/坐标系。
2.图像层
指在axes上通过plot,scatter等函数根据数据绘制出的图像
3.辅助显示层
指在axes上的除了根据数据绘制出的图像以外的内容,eg 外观(facecolor),边框线(spines),坐标轴(axis),坐标轴名称(axis label),刻度(tick),标题(title),图例(legend),网格线(grid)等。该层主要给图形添加描述性信息等,使得图形更加直观,不影响图像的显示效果。
注意:
1)canvas位于最底层为系统层,用户一般接触不到;figure位于canvas之上;axes位于figure之上;axis、grid等辅助层以及图像层位于axes之上。
2)figure指整个图形,可以通过plt.figure()设置画布的大小和分辨率等;axes是数据的绘图区域/坐标系;axis是坐标系中的坐标轴,包含大小限制,刻度等。
2)一个figure可以有多个axes,一个axes可以有多个axis,包含2个则对应的axes为2D坐标系。
二、简单图形绘制
\quad matplotlib绘图主要内容在图像层和辅助显示层,而容器层的figure只需要plt.figure()创建即可,默认一个figure有一个axes,可以通过subplot实现多个axes的多图绘制。
图形绘制的基本步骤: 准备数据→创建画布→绘制图像→显示图像
import matplotlib.pyplot as plt
import random
#0、数据
x=range(0,20)
y=[random.uniform(10,30) for i in range(0,20)]
#1、创建画布
plt.figure()
#2、绘制图像
plt.plot(x,y)
#3、图像显示
plt.show()
三、辅助显示层
1.显示刻度
import matplotlib.pyplot as plt
import random
from pylab import mpl
#设置显示字体
mpl.rcParams['font.sans-serif']=['SimHei']
#设置正常显示符号
mpl.rcParams['axes.unicode_minus']=False
# 0、准备数据
x=range(1,21)
y=[random.uniform(10,30) for i in range(0,20)]
# 1、创建画布
plt.figure(figsize=(20,8))
# 2.绘制图像
plt.plot(x,y)
# 3.辅助显示层——设置刻度
xlabel=['1月{}号'.format(i) for i in x]
plt.xticks(x[::5],xlabel[::5]) #两个参数的大小要一致
# 4、图像显示
plt.show()
2.添加网格
#linestyle为网格线的类型,‘--’为虚线,alpha为网格线的清晰度0-1
plt.grid(True,linestyle='--',alpha=0.5)
plt.grid()
3.添加描述信息
\quad 包括x,y轴标签和标题
plt.xlabel('日期')
plt.ylabel('温度')
plt.title('1月的气温变化')
4.显示图例
\quad 需要在绘制图像的函数中设置label,然后利用legend显示出来。
import matplotlib.pyplot as plt
import random
#需要在plot中设置label,然后利用legend显示出来
# 0、准备数据
x=range(1,32)
y1=[random.uniform(30,50) for i in x]
y2=[random.uniform(30,50) for i in x]
xlabel=["1月{}日".format(i) for i in x]
# 1、创建画布
plt.figure()
# 2、绘制图像
plt.plot(x,y1,label='家里')
plt.plot(x,y2,color='green',linestyle='--',label='学校')#图像风格
# 3、辅助层——设置刻度,网格线,描述信息,图例
plt.xticks(x[::5],xlabel[::5])
plt.grid(True,linestyle='--',alpha=0.5)
plt.xlabel('日期')
plt.ylabel('温度')
plt.title('1月的气温变化')
#设置图例显示的位置参数:'best' ,'right','upper right'等等
plt.legend(loc='best') #自动显示一个合适的位置
# 4、图像显示
plt.show()
四、图像层(常见图像)
折线图,散点图,柱状图,直方图,饼图
1.折线图
import matplotlib.pyplot as plt
import random
#0、数据
x=range(0,20)
y=[random.uniform(10,30) for i in range(0,20)]
#1、创建画布
plt.figure()
#2、绘制图像plot
plt.plot(x,y,color='green',linestyle='--')
#3、图像显示
plt.show()
2.散点图
import matplotlib.pyplot as plt
import random
#0、数据
x=range(0,20)
y=[random.uniform(10,30) for i in range(0,20)]
#1、创建画布
plt.figure()
#2、绘制图像scatter
plt.scatter(x,y,color='green')
#3、图像显示
plt.show()
3.柱状图
# 常见参数:plt.bar(x,y,width,align='center',**kwargs)
#x, y需要传递的数据,width柱的宽度 align柱的对齐方式
import matplotlib.pyplot as plt
# 0、准备数据
y=[100,78,66,88]
x=range(1,5)
# 1、创建画布
plt.figure()
# 2、绘制图像bar
plt.bar(x,y,width=0.5)
xlabel=['大{}'.format(i) for i in x]
# 3、辅助层——设置刻度,添加描述性信息,网格线
plt.xticks(x,xlabel)
plt.xlabel('年级')
plt.ylabel('数量')
plt.title('学生人数情况')
plt.grid('True',linestyle='--',alpha=0.3)
# 4、显示图像
plt.show()
4.直方图
# plt.hist(y,bins=None)
# y需要传递的参数,bins为组距
import numpy as np
import matplotlib.pyplot as plt
# 0、准备数据
y=[np.random.normal(85,3) for i in range(10000)]
# 1、创建画布
plt.figure()
# 2、绘制图像hist
plt.hist(y,100)
# 3、辅助层
plt.title('学生成绩情况')
plt.grid('True',linestyle='--',alpha=0.3)
# 4、显示图像
plt.show()
5.饼图
# plt.pie(x,labels,autopct,colors)
# x百分比,labels每部分的名称,autopct占比显示,colors每部分颜色
import matplotlib.pyplot as plt
# 0、准备数据
x=[100,78,66,88]
# x=range(1,5)
xlabel=['大{}'.format(i) for i in range(1,len(x)+1)]
# 1、创建画布
plt.figure()
# 2、绘制图像撇
plt.pie(x,labels=xlabel)
# 3、辅助层
plt.title('学生人数情况')
# 4、显示图像
plt.show()
五、其他功能
1.绘制多图
①绘制图像时,多次调用绘图函数可在一个坐标系上绘制多个图像
#多次plot
import matplotlib.pyplot as plt
import random
x=range(1,32)
y1=[random.uniform(30,50) for i in x]
y2=[random.uniform(30,50) for i in x]
xlabel=["1月{}日".format(i) for i in x]
plt.figure()
plt.plot(x,y1,label='家里')
plt.plot(x,y2,color='green',linestyle='--',label='学校')#图像风格
plt.xticks(x[::5],xlabel[::5])
plt.grid(True,linestyle='--',alpha=0.5)
plt.xlabel('日期')
plt.ylabel('温度')
plt.title('1月的气温变化')
plt.legend(loc='best') #自动显示一个合适的位置
plt.show()
② 面向对象绘制多个坐标系绘制多个图,subplot
import matplotlib.pyplot as plt
import random
#一、准备数据
x=range(1,32)
y1=[random.uniform(30,50) for i in x]
y2=[random.uniform(40,60) for i in x]
xlabel=['1月{}日'.format(i) for i in x]
#二、创建画布,返回图对象fig和对应序号的坐标系axes
# nrows,ncols 设置有几行几列的坐标系
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=100)
#三、面向对象绘图,利用axes
axes[0].plot(x,y1,label='家里')
axes[1].plot(x,y2,color='green',linestyle='--',label='学校')#图像风格
#四、辅助层
# 1.网格线
axes[0].grid(True,linestyle='--',alpha=0.5)
axes[1].grid(True,linestyle='--',alpha=0.5)
# 2.刻度 set
axes[0].set_xticks(x[::5])
axes[0].set_xticklabels(xlabel[::5])
axes[1].set_xticks(x[::5])
axes[1].set_xticklabels(xlabel[::5])
#3.添加描述 set
axes[0].set_xlabel('时间')
axes[0].set_ylabel('气温')
axes[0].set_title('1月家里的气温变化')
axes[1].set_xlabel('时间')
axes[1].set_ylabel('气温')
axes[1].set_title('1月学校的气温变化')
#4.添加图例
axes[0].legend(loc='best')
axes[1].legend(loc='best')
#五、显示
plt.show()
2.图形保存
plt.savefig(图片保存路径)
import matplotlib.pyplot as plt
import random
x=range(0,20)
y=[random.uniform(10,20) for i in x]
plt.figure()
plt.scatter(x,y)
plt.savefig('test.png') #保存图片在show 之前
#show()会释放figure资源,如果显示图像之后保存图片将只能保存空图片
plt.show()