lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
matplotlib基础使用
2018-10-07 23:04:19
274
0
0
lee-romantic
一个非常好的matplotlib教程: https://www.cnblogs.com/duye/p/8862666.html #1. matplotlib api 入门 matplotlib api函数都位于maptplotlib.pyplot模块中画图的各种方法: >Figure:画图窗口,有点类似于画图需要的画布 Subplot/add_Subplot: 创建一个或多个子图,并且返回子图对象 Subplots_adjust:调整subplot周围的间距 color/linestyle/marker: 线颜色,线型,标记 drawstyle:线型选项修改 xlim: 图表范围,有两个方法get_xlim和set_xlim xticks:刻度位置,有两个方法get_xticks和set_xticksxtick labels: 刻度标签,有两个方法get_xticklabels和set_xticklabels legend: 添加图例。plt.legend(loc='best') #2.plot方法: 1、plt.plot(x,y,format_string,**kwargs) x轴数据,y轴数据,format_string控制曲线的格式字串 format_string 由颜色字符,风格字符,和标记字符: ``` fig=plt.figure(figsize=(8,6)) ax1 =fig.add_subplot(221) ax1.plot(x.numpy(),y2.numpy(),'green','-',lw=1,label='square-randn')#在ax1上画图,'green'要在'-'前面,相当于'g-' #ax1.plot(x.numpy(),y2.numpy(),'g-',lw=1,label='square-randn') ax1.legend(loc='best') ```   关于*kwargs,有时候,函数的参数里会有(*args, *kargs),都是可变参数,*args表示无名参数,是一个元租,**kwargs是键值参数,相当于一个字典,比如你输入参数为:(1,2,3,4,k,a=1,b=2,c=3),*args=(1,2,3,4,k),**kwargs={'a':'1,'b':2,'c':3} 如果同时使用这两个参数,*args要在**kwargs之前,不能是:a=1,b=2,c=3,1,2,3,4,k,这样会出现语法错误提示:SyntaxError:non-keyword arg after keyword arg **kwargs 还可以用来创建字典哦: def dicmake(**kwargs): return kwargs (很鸡肋啦,Python本来就自带dic()来建立字典) 熟悉Matlab的人对plot不会陌生,在matplotlib中的使用方式大致和Matlab中是一致的,使用plot,可以对点的标记的样式以及线条的样式进行设置。 函数的声明为:matplotlib.pyplot.plot(*args, **kwargs)。args的参数的长度是不定 的,可以设置很多的属性,kwargs主要是应用于设置线条的属性。对于标注和线条的样式,可以通过简单的字符来表示:  以及标注和线条的颜色:  例子1: 注意,plot只能绘制numpy的ndarray类型的数据,直接plt.plot(x,y)是会出错的,另外x,y的第一个维度必须相同: ``` import torch import matplotlib.pyplot as plt x=torch.unsqueeze(torch.linspace(-3,3,100),dim=1) #dim=0则会出错,因为x,y的第一个维度必须相同 #x=torch.linspace(-3,3,100).unsqueeze(1)#等价 y1=x.pow(2)+torch.randn(x.size()) y2=torch.sin(x)+torch.normal(torch.linspace(-1,1,100).reshape(x.size()),1) plt.plot(x.numpy(),y2.numpy())#plot只能绘制numpy的ndarray类型的数据,直接plt.plot(x,y)是会出错的,另外x,y的第一个维度必须相同 ``` 结果:  例子2: 关于plt自动获取当前figure和ax子图的问题,`plt获取的是最后创建的一个子图,而不是最近刚使用了的子图`,如下: ``` import torch import matplotlib.pyplot as plt #x=torch.unsqueeze(torch.linspace(-3,3,100),dim=1) x=torch.linspace(-3,3,100).unsqueeze(1) y1=x.pow(2)+torch.randn(x.size()) y2=torch.normal(torch.linspace(-1,1,100),1) print(torch.linspace(-1,1,100)) fig=plt.figure(figsize=(8,6)) ax1 =fig.add_subplot(221) ax2 = fig.add_subplot(222) ax4 = fig.add_subplot(224) #注意创建顺序,4->3 ax3 = fig.add_subplot(223) ax1.plot(x.numpy(),y2.numpy(),'g-',lw=4)#在ax1上画图 plt.plot(x.numpy(),y1.numpy()) #画在第三个子图上,可见,plt获取子图时,获取的是`最后一个创建的子图`,而不是最近才使用了的子图,也不是最后一个位置上的子图 ``` 结果:  当然线条的颜色可以以其他方式定制。比如16进制的字符串('#008000')或者是RGB、RGBA元组的方式RGB or RGBA ((0,1,0,1)) 来实现不同的颜色。 在接下来会应用到更多的属性。对于Line2D的具体细节,也就是线条的属性等,可以进一步查阅其他资料. 设置横轴、纵轴的界限以及标注 很多时候,需要设置横轴和纵轴的界面,从而得到更加清晰明了的图形: ``` plt.xlim(X.min()*1.1, X.max()*1.1) plt.ylim(C.min()*1.1,C.max()*1.1) ``` 此外为了更好的表示横轴和纵轴数据的含义,可以通过ticks对横轴和纵轴的含义进行设置和定制。 ``` plt.xlim(x.min()*1.1, x.max()*1.1) plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$']) plt.ylim(C.min()*1.1,C.max()*1.1) plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$']) ``` 看到yticks和xticks后面一串的数字,看到就觉得可能有点不知道写的什么,熟悉LaTex的人觉得我们这种想法的人有点傻。其实就是很简单的字符串,但是是为了方便Latex去解析这段字符串。一般以r开始,中间的字符串用$字符串$包围起来。 上面的\pi代表的意义就是π。以下是有关希腊字符的表示:  #3.Figure和Subplot/add_Subplot方法 Figure对象: matplotlib的图像都位于Figure对象中,可以用plt.figure创建一个新的Figure. `` fig=plt.figure() plt.show()`` 这时会出现一个空的窗口。figure有点类似于画图需要的画布 ``fig.add_subplot``:创建一个或多个子图,即在一个窗口中画好几个图形。 eg:``ax2=fig.add_subplot(2,2,1)``#这个的意思是:子图排列是应该是2X2个(即上下2个),最后一个1是指当前选中的是4个subplot中的第一个(编号从1开始的),并且使用ax2来保存获得的子图对象,可以进行比如``ax2.set_title('name'``这样的操作)。 如果如下:由窗口中会画3个图 ``` ax1=fig.add_subplot(2,2,1) #选中第一个画子图 ax2=fig.add_subplot(2,2,2) #选中第二个画子图 ax3=fig.add_subplot(2,2,3) #选中第三个画子图 ``` ``plt.subplot``:同样是创建子窗口,与``fig.add_subplot()``参数是一样的,不同之处在于,没有保存子图的对象,后面使用``plt.plot()``将默认在该子图下绘图(当然也可以通过``ax=plt.subplot(221)``这样的方式来获取子图名字,以便于进行其他的操作): 例子1: ``` import matplotlib.pyplot as plt import pandas as pd import numpy as np from numpy.random import randn x=[1,2,3,4,5] y=[2,3,6,7,8] z=[2,5,6,7,8] fig1=plt.figure(1,figsize=(8,5)) plt.subplot(221).plot(x,y,label="what",color='pink') ax=plt.subplot(222) ax.scatter(x,z,label='catter')#与plt.scatter(...)等效,这里plt.scatter(...)会默认在当前画布fig2中的plt.subplot(221)画 ax.set_title('scatter') #ax.legend(loc='right')#可以这样单独为子图创建图例 plt.subplot(212) plt.plot(x,z,label="345",color='green',linestyle='-') fig1.legend(loc='best')#添加图例,loc指定位置,best代表让系统选择一个最好的位置,loc可选参数有upper right以及 center等很多 plt.show() ``` 结果:  上图中:这几个子图是怎么划分的呢? 解释: 将整个表按照 2*2 划分 前两个简单, 分别是 (2, 2, 1) 和 (2, 2, 2) 但是第三个图呢, 他占用了 (2, 2, 3) 和 (2, 2, 4) 显示需要对其重新划分, 按照 2 * 1 划分 前两个图占用了 (2, 1, 1) 的位置 因此第三个图占用了 (2, 1, 2) 的位置 例子2: ``` import matplotlib.pyplot as plt import pandas as pd import numpy as np from numpy.random import randn x=np.linspace(-np.pi,np.pi,256,endpoint=True) C,S=np.cos(x),np.sin(x) plt.plot(x,C,color='red',lw=2.5,linestyle='-') #lw与linewidth效果一样 plt.plot(x,S,color='blue',linewidth=2.5,linestyle='-') ``` 结果:  label的位置可选参数:  函数关键字参数:  #4.cla(),clf(),与close()方法 figure 的重复利用能大大节约时间,但是 matplotlib 维护的 figure 有数量上限(`RuntimeWarning: More than 20 figures have been opened.`)。并且,不断的创建新的 figure 实例,很容易造成内存泄漏,而应合理的复用,能大大的提高运行速度。此外,在某些情况下,不清理 figure 将有可能造成在第一幅中 plot 的线再次出现在第二幅图中。 在pycharm中查看源码,通过plt.cla()清除子图时,cla()会调用gca()来获取当前ax,而gca()又会调用gcf()来获取当前的figure;通过plt.clf()清除当前figure的所有子图时,直接调用gcf().clf() 主要方式包括: (1)隐式方式调用: ``plt.cla()`` # 清除axes,即当前 figure 中的活动的axes,但其他axes保持不变,会保留当前子图的坐标轴。 ``plt.clf() ``# 清除当前 figure 的所有axes,但是不关闭这个 window,所以能继续通过plt.plot()来隐式创建一个axes子图, 并绘图。 ``plt.close() ``# 关闭 window,如果没有指定,则指当前 window。 (2)指定ax显示调用: ``ax1.cla()``#清除子图,保留坐标 #ax1.clf()#错误写法,因为某个子图不能清除其他的子图,ax2.close()也不对,只能``plt.close()`` ``plt.clf()``#清除当前子图所在的figure中,所有的子图,不保留坐标 比如: ``` import torch import matplotlib.pyplot as plt # x=torch.unsqueeze(torch.linspace(-3,3,100),dim=1) x = torch.linspace(-3, 3, 100).unsqueeze(1) y1 = x.pow(2) + torch.randn(x.size()) y2 = torch.normal(torch.linspace(-1, 1, 100), 1) fig = plt.figure(figsize=(8, 6)) ax1 = fig.add_subplot(221) ax2 = fig.add_subplot(222) ax4 = fig.add_subplot(224) ax3 = fig.add_subplot(223) plt.cla() # 根据前面的笔记,这两个plt.cla()都不应该影响到ax1,结果也确实是这样 ax1.plot(x.numpy(), y2.numpy(), 'g-', lw=1) # 在ax1上画图 plt.cla() ax2.scatter(x.numpy(), y2.numpy()) plt.plot(x.numpy(), y1.numpy()) # 可见,plt获取子图时,获取的是最后一个创建的子图,而不是最近才使用了的子图 plt.show() #但是这里plt.show()却并不只显示最后创建的子图,而是所有的 ``` 结果: 
上一篇:
jupyter notebook matplotlib画图动态刷新
下一篇:
图像处理第一次课
0
赞
274 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册