一、Matplotlib库介绍
概述、gallery示例
- Matplotlib是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
- Matplotlib库由各种可视化类构成,内部结构复杂。
- Matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式
- Matplotlib文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源代码。因此如果需要绘制某类图,只需要在这个页面中浏览、复制、粘贴一下,基本上通过修改数据和设置都能搞定。
Matplotlib库网址:https://matplotlib.org/gallery/index.html
现在,我们来点击第一个缩略图,便可以查看到源代码,如下:
你可以直接将代码复制到jupyter notebook代码框运行,查看运行结果:
# Stacked Bar Graph
import numpy as np
import matplotlib.pyplot as plt
N=5
# 创建四个数据元组
menMeans = (20,35,30,35,27)
womenMeans = (25,32,34,20,25)
menStd = (2,3,4,1,2)
womenStd = (3,5,2,3,3)
ind = np.arange(N) # the x locations for groups
width = 0.35 # the width of the bars
p1 = plt.bar(ind,menMeans,width,yerr=menStd) # bar()函数绘制柱状图,ind表示x轴,menMeans为元组名,width柱宽,yerr为误差(小段黑线)
p2 = plt.bar(ind,womenMeans,width,bottom = menMeans,yerr = womenStd) #bottom表示从后面带的参数开始算起,即menMeans
plt.ylabel('Scores') # 列标题
plt.title('Scores by group and gender') # 整个图标的标题
plt.xticks(ind,('G1','G2','G3','G4','G5')) # x轴各个柱标题
plt.yticks(np.arange(0,81,10)) # 定义范围[0,81)和单位间距10
plt.legend((p1[0],p2[0]),('Men','Women')) # 右上角图例
plt.show()
二、Matplotlib快速绘图
plot函数参数、快速绘图示例
- matplotlib中的快速绘图的函数库可以通过如下语句载入:
import matplotlib.pyplot as plt
- 接下来调用figure创建一个绘图对象,并且使它成为当前的绘图对象
plt.figure(figsize=(8,4))
- 通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80.
- 也可以不创建绘图对象直接调用接下来的plot函数直接绘图,matplotlib会自动创建一个绘图对象。像上面那个示例一样
- 如果需要同时绘制多幅图表,可以是给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让他成为当前绘图对象。
- plot函数的调用方式很灵活,使用关键字参数指定各种属性:
label:给所绘制的曲线一个名字,此名字在图示(legend)种显示。只要在字符串前后添加"$"符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式
color:指定曲线的颜色
linewidth:指定曲线的宽度
参数“b--”指定曲线的颜色和线型,b--表示blue,线型为---------(自行查找对照表)
- 可通过一系列函数设置绘图对象的各个属性:
xlabel/ylabel:设置X轴/Y轴的文字
title:设置图标的标题
ylim:设置Y轴的范围
legend:图例显示
plt.show():显示出创建的所有绘图对象
plt.xlabel("Times(s)") plt.ylabel("Volt") plt.title("PyPlot First Example") plt.ylim(-1.2,1.2) plt.legend()
- 可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定
plt.savefig("test.png",dpi=120)
下面我们通过一个示例来看:
绘制sin(x)和cos(x**2)两条曲线,要求x取值范围0至10、x轴设为"Time(s)"、y轴设为"Vlot"、图名称为PyPlot First Example,并显示图例
步骤:1、导入numpy和matplotlib库;2、设计绘图数据;3、绘制曲线;4、设置相关参数
我们来按照步骤写一下试试看:
发现图虽然画出来了,但是没有图例,而且提示了No handles with labels found to put in legend,我们就发现,上面参数设置时少了东西,虽然有legend(图示),但是没有设置label,所以我们增加语句,如下:
import numpy as np
import matplotlib.pyplot as plt
# 计算绘图数据
x = np.linspace(0,10,100) #
y = np.sin(x)
z = np.cos(x**2)
# 绘制曲线
plt.plot(x,y,"r-",label = '$sin(x)$',linewidth = 2)
plt.plot(x,z,"b--",label = '$cos(x**2)$')
# 设置相关参数
plt.xlabel("Time(s)")
plt.ylabel("Vlot")
plt.title("PyPlot First Example")
plt.legend()
plt.show()
输出结果视图:
pyplot的基础图标函数如下:
函数 | 说明 |
---|---|
plt.plot(x,y,fmt,...) | 绘制一个坐标图 |
plt.boxplot(data,notch,position) | 绘制一个箱型图 |
plt.bar(left,height,width,bottom) | 绘制一个柱状图 |
plt.barh(width,bottom,left,height) | 绘制一个横向条形图 |
plt.polar(theta,r) | 绘制极坐标图 |
plt.pie(data,explode) | 绘制饼状图 |
plt.psd(x,NFFT=256,pad_to,Fs) | 绘制功率谱密度图 |
plt.cohere(x,y,NFFT=256,Fs) | 绘制X-Y的相关性函数 |
plt.scatter(x,y) | 绘制散点图,其中x和y长度相同 |
plt.step(x,y,where) | 绘制步阶图 |
plt.hist(x,bins,normed) | 绘制直方图 |
plt.contour(X,Y,Z,N) | 绘制等值图 |
plt.vlines() | 绘制垂直图 |
plt.stem(x,y,linefmt,makerfmt) | 绘制柴火图 |
plt.plot_date() | 绘制数据日期 |
pyplot的绘图区域
- 可以用子图来将图样(plot)放在均匀的坐标网格中
- plt.subplot(nrows,ncols,plot_number)
- 用subplot函数的时候,需要指明网格的行列数量,以及你希望将图样放在哪一个网格中
例如将一个二维的坐标轴看作是绘图区域,那么他的四个象限为四个网格,分别标号上面两个左1右2,下面两个左3右4,那么用subplot函数表示的时候,如果在第四个区域,则为subplot(2,2,4)表示两行两列第四个网格,看示例:
import matplotlib.pyplot as plt
plt.subplot(2,1,1)
plt.xticks([]),plt.yticks([]) # x轴和y轴标号,设为空
plt.text(0.5,0.5,'subplot(2,1,1)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,1,1)做数据,居中,大小24,透明度为.5
plt.subplot(2,1,2)
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5,'subplot(2,1,2)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,1,2)做数据,居中,大小24,透明度为.5
# plt.savefig('../figures/subplot-horizontal.png',dpi=64)
plt.show()
运行结果视图:
matplotlib通过pyplot模块提供了一套和MATLIB类似的绘图API,matplotlib还提供了一个名为pylab的模块,其中包括了许多Numpy和pyplot模块中常用的函数,方便用户速计算和绘图,十分适合在IPython交互式环境中使用,但两者有什么区别呢?
pylab结合pyplot和numpy,对交互式使用来说比较方便,既可以画图又可以简单的计算。但是,对于一个项目来说,建议分别导入使用,即:
import numpy as np
import matplotlib.pyplot as plt
而不是import pylab as pl或from pylab import *
from pylab import *
subplot(1,2,1)
xticks([]),yticks([])
text(0.5,0.5,'subplot(1,2,1)',ha='center',va='center',size=20,alpha=.5)
subplot(1,2,2)
xticks([]),yticks([])
text(0.5,0.5,'subplot(1,2,2)',ha='center',va='center',size=20,alpha=.5)
show()
以此类推我们来看,上下左右四个子图的绘制方式,首先使用pylab模块方式
from pylab import *
subplot(2,2,1)
xticks([]),yticks([])
text(0.5,0.5,'subplot(2,2,1)',ha='center',va='center',size=20,alpha=.5)
subplot(2,2,2)
xticks([]),yticks([])
text(0.5,0.5,'subplot(2,2,2)',ha='center',va='center',size=20,alpha=.5)
subplot(2,2,3)
xticks([]),yticks([])
text(0.5,0.5,'subplot(2,2,3)',ha='center',va='center',size=20,alpha=.5)
subplot(2,2,4)
xticks([]),yticks([])
text(0.5,0.5,'subplot(2,2,4)',ha='center',va='center',size=20,alpha=.5)
show()
使用matplotlib方式:
import matplotlib.pyplot as plt
plt.subplot(2,2,1)
plt.xticks([]),plt.yticks([]) # x轴和y轴标号,设为空
plt.text(0.5,0.5,'subplot(2,1,1)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,2,1)做数据,居中,大小24,透明度为.5
plt.subplot(2,2,2)
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5,'subplot(2,1,2)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,2,2)做数据,居中,大小24,透明度为.5
plt.subplot(2,2,3)
plt.xticks([]),plt.yticks([]) # x轴和y轴标号,设为空
plt.text(0.5,0.5,'subplot(2,1,1)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,2,3)做数据,居中,大小24,透明度为.5
plt.subplot(2,2,4)
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5,'subplot(2,1,2)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,2,4)做数据,居中,大小24,透明度为.5
# plt.savefig('../figures/subplot-horizontal.png',dpi=64)
plt.show()
可以看到,方式完全同前面一样,只需要把必要的子图的行和列还有区域号指定好即可。
另外,subplot()函数中的三个参数相乘如果不大于10,中间的逗号是可以省略的,比如subplot(2,2,1)可以写成subplot(221)快去试一下吧。