爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 41585|回复: 45

[参考资料] [已收纳]python可视化库matplotlib与IDL对比

[复制链接]

新浪微博达人勋

发表于 2019-6-28 23:07:23 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 15195775117 于 2021-1-31 18:41 编辑

IDL的静态可视化我已经比较熟练了,gif、视频和交互还没深入研究。
python的可视化库matplotlib,我专门买了本书,虽然电子资料也容易找,我也存了一些,但是我很重视书的系统性,一本实体书拿在手里,是一种天然的督促。看着matplotlib书里的图,感觉B格比IDL逊色不少,就是些很常见的、很基础的图,毕竟论专业性,还是IDL强。


虽然IDL的绘图功能已经完全可以替代matplotlib,但是学学matplotlib对于掌握python的风格也是有帮助的。
好处有以下:
1、有IDL和matlab的制图基础,学习matplotlib会是非常快的;
2、python有不少冷门算法,如EMD分解,在python开发平台直接绘图比转到IDL绘图要快捷;
3、学习和操作的过程中,可以发现不同语言制图上的共通规则;
4、matplotlib制图可能有些方便比IDL便捷,比如IDL没有饼图,这经常让我感觉尴尬。
综上所述,我决定在这个主题中,一边学习和操作matplotlib制图,一边与IDL对比。
开始...........

本帖被以下淘专辑推荐:

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-6-29 15:50:25 | 显示全部楼层

三维图之Surface
360截图20190629154153374.jpg
import numpy as np
import matplotlib.pyplot as plt
#导入3D绘图模块:
from mpl_toolkits.mplot3d import Axes3D
#新建图表对象:
fig=plt.figure()
#设置为三维模式:
#ax=fig.add_subplot(111,projection='3d')与ax=Axes3D(fig)一样
ax=Axes3D(fig)
#以上为绘制三维图定式开头
#绘图数据
x=np.arange(-5,5,0.25)
y=np.arange(-5,5,0.25)
#数据网格化:
X,Y=np.meshgrid(x,y)
R=np.sqrt(X**2+Y**2)
Z=np.sin(R)
#画曲面:
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,
                cmap=plt.get_cmap('rainbow'))
#图不能交互,那视角怎么设置?
#画投影,投影方向是z
ax.contour(X,Y,Z,zdim='z',offset=-2,cmap='rainbow')
#cmap相当于IDL的RGB_table?
#IDL也有offset,得研究下这是个啥?
#z轴范围:
ax.set_xlim(-5,5)
ax.set_ylim(-5,5)
ax.set_zlim(-1,1)
#轴名
ax.set_xlabel('xxx')
ax.set_ylabel('yyy')
ax.set_zlabel('zzz')

密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-28 23:13:25 | 显示全部楼层
python与IDL颜色缩写一样:
红r,绿g,蓝b,黑k,黄y,白w,品红m,青色c
不是看到python的c,我还不知道IDL的'c'表示青色!这就是对比学习的好处

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-29 00:36:06 | 显示全部楼层
调用内嵌数学公式画图,就是不用数组就可以画曲线那种,IDL和MATLAB都有
import numpy as np
#matplotlib的子库pyplot库可快捷画二维图:
import matplotlib.pyplot as plt
#在label中使用$;color是颜色;linewidth是粗细;label就是legend

plt.plot(x,y,label="$sin(x)$",color="m",linewidth=2)

360截图20190628231656738.jpg
如果要设置图的尺寸,多加一句:
plt.figure(figsize=(8,4),dpi=100)
plt.plot(x,y,label="$sin(x)$",color="m",linewidth=2)
图宽8英寸,高4英寸,dpi是分辨率,100(像素/英寸),
所以图宽800像素,高400像素
------------------------------------
线型:
默认是实线,短线是:
plt.plot(x,y,"m--",label="$sin(x)$")
360截图20190629002408381.jpg
点与短线交替是"m-.",虚线是"m:",m表示品红
0.jpg
--------------------------------------------------
对比:
IDL的图是独立窗口,spyder的图是在控制台输出的,没有交互,灵活性差,查看不便;
IDL和matplotlib对图句柄的操作都是面对对象,比如IDL设置图色是fig.color='b'等



密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-29 10:14:15 | 显示全部楼层
import numpy as np
import matplotlib.pyplot as plt
from numpy import pi  #引入π

x=np.arange(360)/180*pi
y=np.sin(x)
plt.figure(figsize=[8,4],dpi=100)


#这个$sin(x)$出现了不能用的情况:
plt.plot(x,y,"r:",label="$sin(x)$")


#用汉字也会出现跟IDL一样的方框乱码,不知如何设置字体,IDL改个字体就行了


#x轴名,python的xlabel=IDL的xtitle
plt.xlabel("lon")
plt.ylabel("lat")


#和IDL的图题一样都叫title
plt.title('fig title')


#x和y轴范围,对应IDL的xrange和yrange
plt.xlim(0,pi*2)
plt.ylim(-1,1)


#显示图例:
plt.legend()


#plt.show()方法用来显示图,但是上面都是自动显示图的


#存图:
figfile=r'C:\Users\朽木\Desktop\pyfig\py.jpg'
plt.savefig(figfile,dpi=800)
print('程序结束!')

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-29 10:57:28 | 显示全部楼层
窗口绘制多图
IDL是通过current和layout来实现的,python则使用subplot来做
import numpy as np
import matplotlib.pyplot as plt
from numpy import pi
#这个linspace好熟眼(IDL也有类似的):
x=np.linspace(0,360,120)/180*pi
y=np.sin(x)
for idx,color in enumerate("bgrcmk"):
    print(idx,color)
    #3行2列序号(从1开始而不是0跟IDL规则一样)
    plt.subplot(3,2,1+idx)
    plt.plot(x,y,color=color,linewidth=3)
plt.show()
输出:
0 b
1 g
2 r
3 c
4 m

5 k
360截图20190629104727513.jpg
-----------------------------------------------------
-----------------------------------------------------
也可以做这种不均匀的排列:
360截图20190629105406755.jpg
import numpy as np
import matplotlib.pyplot as plt
from numpy import pi
#这个linspace好熟眼,IDL也有类似的:
x=np.linspace(0,360,120)/180*pi
y=np.sin(x)
#先排4个
for idx,color in enumerate("bgrc"):
    #3行2列序号(从1开始而不是0跟IDL规则一样)
    plt.subplot(3,2,1+idx)
    plt.plot(x,y,color=color,linewidth=3)
plt.show()
#最后一行排一个:
plt.subplot(3,1,3)

plt.plot(x,y,color='m',linewidth=3)


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-29 14:29:14 | 显示全部楼层
360截图20190629142541317.jpg
灵活选择子图
sca方法可以灵活转换绘图的子图
--------------------------------
import matplotlib.pyplot as plt
from numpy import pi
#准备绘图数据
x=np.linspace(1,10,1000)
y=np.sin(i*x/3)
z=np.cos(i*x/3)
#子图名与位置
ax1=plt.subplot(2,2,1)
ax2=plt.subplot(2,2,2)
ax3=plt.subplot(2,2,3)
ax4=plt.subplot(2,2,4)
#选择子图并绘图
plt.sca(ax4)
plt.plot(x,y,color='r')
plt.sca(ax3)
plt.plot(x,y,color='g')
plt.sca(ax2)
plt.plot(x,y,color='b')
plt.sca(ax1)
plt.plot(x,y,color='c')
plt.sca(ax3)
plt.plot(x,z,color='m')

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-29 14:37:08 | 显示全部楼层

360截图20190629143331137.jpg
python默认在之前的坐标轴上绘图,
跟IDL的overplot绘图关键字的功能一样
----------------------------------------
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(1,10,1000)
plt.plot(x,np.sin(i*x/3),color='r')
plt.plot(x,np.cos(i*x/3),color='g')
plt.plot(x,np.sin(i*x/2),color='b')

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-29 15:01:50 | 显示全部楼层
三维图之三角曲面tri-Surf
360截图20190629145636415.jpg
import numpy as np
import matplotlib.pyplot as plt
#导入3D绘图模块:
from mpl_toolkits.mplot3d import Axes3D
#新建图表对象:
fig=plt.figure()
#设置为三维模式:
#ax=fig.add_subplot(111,projection='3d')与ax=Axes3D(fig)一样
ax=Axes3D(fig)
x=[0,1,3,2]
y=[0,4,4,2]
z=[0,2,1,0]
#以三角形构成的surface:
ax.plot_trisurf(x,y,z)

--------------------------
与IDL对比:
IDL的快速可视化、智能化工具都支持图的交互,
python的三维图不支持
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-8-10 16:48:27 | 显示全部楼层
持续关注后续更新
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表