本文共 9171 字,大约阅读时间需要 30 分钟。
先给出我认为比较好的其他教程
Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab的启发而研发,matplotlib.pyplot是绘制各类可视化图形的命令子库,引入方式如下:
import matplotlib.pyplot as plt;
1.
import matplotlib.pyplot as pltplt.plot([2,1,4,43])plt.ylabel("Y")plt.xlabel("X")
当plot的参数为数组或列表时,那么将被当做y轴参数,而X轴自动生成
2.
import matplotlib.pyplot as pltplt.plot([2,1,4,43])plt.ylabel("Y")plt.xlabel("X")plt.savefig("math.png",dpi=600)plt.show()
savefig将图形存储为文件,格式默认为png,也可以自行加后缀改为jpg,通过修改dpi的值调整大小与质量
3.
import matplotlib.pyplot as pltplt.plot([-1,1,2,3],[4,7,2,8])plt.ylabel("Y")plt.xlabel("X")plt.axis([-2,4,1,10])plt.show()
plot有两个参数时,第一个代表横坐标,第二个代表纵坐标,上面axis的参数表示横轴的范围是-2-4,纵轴的范围是1-10
plt.subplot(nrows,ncols,plot_num),其中nrows-1表示横轴的个数,ncols表示纵轴的个数,plot_num表示对应在第几个区域,当调用函数后,在他之后的图形会被绘制在plot_num对应的区域内
举例分析
比如:plt.subplot(3,2,4)小技巧:上面的plt.subplot(3,2,4)可以写为plt.subplot(324)效果一样
4.
绘制函数 c o s ( 2 π x ) cos(2{\pi}x) cos(2πx) e − x e^{-x} e−x, c o s ( 2 π x ) cos(2{\pi}x) cos(2πx)import numpy as npimport matplotlib.pyplot as pltdef f(x): return np.exp(-x)*np.cos(np.pi*x*2)x = np.arange(0,5.0,0.02)plt.subplot(2,1,1)plt.plot(x,f(x))plt.xlabel("X轴")plt.ylabel("Y轴")plt.subplot(2,1,2)plt.plot(x,np.cos(2*np.pi*x))
下面这张图保证了将两个函数画在了同一张图里
import numpy as npimport matplotlib.pyplot as pltx = np.arange(10)plt.plot(x,x,x,1.5*x,x,2*x)
绘制三条曲线:
下面介绍format_string参数的使用 format_string:控制曲线格式的字符串,是可选参数,由颜色字符,风格字符,标记字符组成颜色字符:
风格字符:
标记字符 上面介绍了部分,详细参见以上的风格字符,颜色字符,标记字符可以任意的组合使用
下面做一些展示,在上面代码基础上改进
import numpy as npimport matplotlib.pyplot as pltx = np.arange(10)plt.plot(x,x,'og-',x,1.5*x,'r:v',x,2*x,'b--.')当然还有一些其它的参数的使用也可以用来控制曲线
我们要了解pyplot其实并不默认支持中文显示,需要修改使用
使用rcParams修改字体实现
先看个例子import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(10)matplotlib.rcParams["font.family"]='SimHei' #'SimHei'表示黑体plt.ylabel("Y轴")plt.plot(x,x)rcParams的属性介绍: font.family取值: 下面看个例子
import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(10)matplotlib.rcParams["font.family"]='SimHei'matplotlib.rcParams["font.size"] = 25matplotlib.rcParams["font.style"]='italic'plt.ylabel("Y轴")plt.plot(x,x)
在有中文输出的地方加上fontproperties属性
先来看个例子import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(10)matplotlib.rcParams["font.size"] = 25matplotlib.rcParams["font.style"]='italic'plt.ylabel("Y轴",fontproperties = 'Kaiti')plt.plot(x,x)这样做的好处在于:比如上面这个例子fontproperties只会对ylabel起作用,别的地方不起作用
下面是文本显示相关的函数
实例: 画出正弦波import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(-2,2,0.02)plt.axis([-3,3,-2,2])matplotlib.rcParams['axes.unicode_minus'] =Falseplt.ylabel("Y轴:振幅",fontproperties = 'Kaiti',fontsize = 25)plt.xlabel("X轴:时间",fontproperties = 'SimHei',fontsize = 25,color = 'red')plt.grid(True)plt.plot(x,np.cos(2*np.pi*x))上面两行代码解释一下
matplotlib.rcParams['axes.unicode_minus'] =False 保证负号显示
plt.grid(True) 显示背景格子
再来个例子:
import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(-2,2,0.02)plt.axis([-3,3,-2,2])matplotlib.rcParams['axes.unicode_minus'] =Falseplt.ylabel("Y轴:振幅",fontproperties = 'Kaiti',fontsize = 25)plt.xlabel("X轴:时间",fontproperties = 'SimHei',fontsize = 25,color = 'red')plt.text(-0.5,1.25,"正弦波",fontproperties = 'SimHei',fontsize=25)plt.title("正弦波 ${\mu = 100}$",fontproperties = 'SimHei',fontsize = 25,color = 'green') #也可作r"正弦波 ${\mu = 100}$"plt.grid(True)plt.plot(x,np.cos(2*np.pi*x))
上面用到了,十分流行
接下来就是介绍annotate函数 看例子:import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(-2,2,0.02)plt.axis([-3,3,-2,2])matplotlib.rcParams['axes.unicode_minus'] =Falseplt.ylabel("Y轴:振幅",fontproperties = 'Kaiti',fontsize = 25)plt.xlabel("X轴:时间",fontproperties = 'SimHei',fontsize = 25,color = 'red')plt.annotate(r"$\mu=100$",xy=(0,1.0),xytext=(1,1.5),fontsize=25,fontproperties="Kaiti",arrowprops = dict(facecolor="red",shrink=5,width=2))plt.title("正弦波 ${\mu = 100}$",fontproperties = 'SimHei',fontsize = 25,color = 'green')#也可作r"正弦波 ${\mu = 100}$"plt.grid(True)plt.plot(x,np.cos(2*np.pi*x))介绍上面annotate几个参数含义(annotate相当于是text的一个升级版)
r"$\mu=100$":文本内容xy:代表箭头的末端的位置xytext:代表文本的位置(箭头由文本的位置指向末端的位置)arrowprops = dict(facecolor="red",shrink=5,width=2)):facecolor代表箭头颜色,shrink代表箭头长度比例,width代表箭头的宽度
前面介绍了subplot函数,现在介绍下面两个函数
import numpy as npimport matplotlib.pyplot as pltimport matplotlibplt.subplot2grid((3,3),(0,0),colspan=3) #整个区域割分为3行3列,并选中(0,0)编号,并向右扩展使得总跨度为3,下同plt.subplot2grid((3,3),(1,0),colspan=2)plt.subplot2grid((3,3),(2,0))plt.subplot2grid((3,3),(2,1))plt.subplot2grid((3,3),(1,2),rowspan=2)
上面的函数每次都要划分3x3比较麻烦,下面这个好点 看代码理解即可
例1.import matplotlib.pyplot as pltimport matplotlib.gridspec as gridspecgs2 = gridspec.GridSpec(3, 3)gs2.update(left=1, right=1.5, top =1.5,bottom =1,hspace=0.05)ax4 = plt.subplot(gs2[:, :-1])ax5 = plt.subplot(gs2[:-1, -1])ax6 = plt.subplot(gs2[-1, -1])gs3 = gridspec.GridSpec(3, 3)gs3.update(left=1.5, right=2, top =2,bottom =1.5,hspace=0.05)ax4 = plt.subplot(gs3[:, :-1])ax5 = plt.subplot(gs3[:-1, -1])ax6 = plt.subplot(gs3[-1, -1])例2. 这个是官方的一个比较好的嵌套例子,在这里讲解一下 先看一下 示例: 相当于一个迭代器,把所有的组合方式全都列出来
import itertoolsa = (1, 2)b = ('A')c = itertools.product(a,repeat=2)for elem in c: print(elem)
import itertoolsa = (1, 2)b = ('A')c = itertools.product(a,b,repeat=2)for elem in c: print(elem)
再看一下:
例子: 相当于给每一个值赋予一个索引,第二个参数是索引的起始值list=[1,2,3,4]for index,value in enumerate(list,1): print("%d,%d"%(index,value))
再看一下;
例子:import numpy as npimport matplotlib.pyplot as plt x = np.arange(0, 100) fig = plt.figure() ax1 = fig.add_subplot(221)ax1.plot(x, x) ax2 = fig.add_subplot(222)ax2.plot(x, -x) ax3 = fig.add_subplot(223)ax3.plot(x, x ** 2) ax4 = fig.add_subplot(224)ax4.plot(x, np.log(x)) plt.show()
正式代码:(看懂就行,有关绘图函数的部分我们不需要太多的关注)
import matplotlib.pyplot as pltimport matplotlib.gridspec as gridspecimport numpy as npfrom itertools import product#相当于返回sin(ax)cos(bx)与sin(cx)cos(dx)def squiggle_xy(a, b, c, d): i = np.arange(0.0, 2*np.pi, 0.05) return np.sin(i*a)*np.cos(i*b), np.sin(i*c)*np.cos(i*d)fig = plt.figure(figsize=(3, 3)) # 生成一个窗口,长与宽均为3,单位为英寸,还有一个属性可以指定分辨率,dpi=10,代表每一寸10像素,dpi默认为80# gridspec inside gridspec,割分区域为4行4列一共16块,为外部格子outer_grid = gridspec.GridSpec(4, 4, wspace=0.0, hspace=0.0)for i in range(16): #获取内部格子 inner_grid = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=outer_grid[i], wspace=0.0, hspace=0.0) a = i // 4 + 1 #//表示除的结果取整数部分,/表示把数字当做浮点数除 b = i % 4 + 1 for j, (c, d) in enumerate(product(range(1, 4), repeat=2)):#为了绘制丰富的图形使用到了project,其实我认为没有太大必要,例3会简化更易于理解 ax = fig.add_subplot(inner_grid[j])# ax.plot(*squiggle_xy(a, b, c, d)) ax.set_xticks([]) #x轴标签设置为空 ax.set_yticks([]) #y轴标签设置为空 fig.add_subplot(ax) #添加子区域,把原来的ax覆盖掉,但不写也没啥,官方有毒all_axes = fig.get_axes() #获取每一个子区域# show only the outside spinesfor ax in all_axes: for sp in ax.spines.values():#先把所有的线都抹去 sp.set_visible(False) if ax.is_first_row(): ax.spines['top'].set_visible(True) if ax.is_last_row(): ax.spines['bottom'].set_visible(True) if ax.is_first_col(): ax.spines['left'].set_visible(True) if ax.is_last_col(): ax.spines['right'].set_visible(True)plt.show()例3: 在上面代码看懂后我们来自行设计一个,不过不需要让每一个小方格的图形不一样
我们把每个小区域的图形全部设置为 y = x {y=x} y=x
不去边界#导入模板import matplotlib.pyplot as pltimport numpy as npimport matplotlib.gridspec as gridspec#定义函数y=xdef fun(): x =np.arange(0,3,0.02) y =x return x,ydef fun1(): x =np.arange(0,3,0.02) y =-x+3 return x,yfg = plt.figure(figsize=(4,4))#长宽为4,现在什么也没有,要等会儿加gs_outer = gridspec.GridSpec(4,4,wspace=0,hspace=0)for i in range(16): inner_grid = gridspec.GridSpecFromSubplotSpec(3,3,gs_outer[i],wspace=0,hspace=0) for j in range(9): ax = fg.add_subplot(inner_grid[j])#加内部子区域即可,他会自动的按照原来的排列加入 if j==3: ax.plot(*fun1()) ax.set_xticks([]) ax.set_yticks([]) ax.plot(*fun()) ax.set_xticks([]) ax.set_yticks([])all_axes = fg.get_axes()plt.show();
去边界
#导入模板import matplotlib.pyplot as pltimport numpy as npimport matplotlib.gridspec as gridspec#定义函数y=xdef fun(): x =np.arange(0,3,0.02) y =x return x,ydef fun1(): x =np.arange(0,3,0.02) y =-x+3 return x,yfg = plt.figure(figsize=(4,4))#长宽为4,现在什么也没有,要等会儿加gs_outer = gridspec.GridSpec(4,4,wspace=0,hspace=0)for i in range(16): inner_grid = gridspec.GridSpecFromSubplotSpec(3,3,gs_outer[i],wspace=0,hspace=0) for j in range(9): ax = fg.add_subplot(inner_grid[j])#加内部子区域即可,他会自动的按照原来的排列加入 if j==3: ax.plot(*fun1()) ax.set_xticks([]) ax.set_yticks([]) ax.plot(*fun()) ax.set_xticks([]) ax.set_yticks([])all_axes = fg.get_axes()for ax in all_axes:#遍历也是按照加入的顺序 for sp in ax.spines.values():#获取区域的边界对象 sp.set_visible(False) if ax.is_first_row():#相对于他的上一级区域而言 ax.spines['top'].set_visible(True) if ax.is_last_row(): ax.spines['bottom'].set_visible(True) if ax.is_first_col(): ax.spines['left'].set_visible(True) if ax.is_last_col(): ax.spines['right'].set_visible(True)plt.show();现在对于嵌套有了比较好的了解了
转载地址:http://gslzi.baihongyu.com/