爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 16567|回复: 12

[混合编程] python之等值线图tricontourf

[复制链接]

新浪微博达人勋

发表于 2020-6-5 00:28:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 15195775117 于 2020-6-5 00:31 编辑

等值线图都有3个量:横轴x,纵轴y,中间的数据z
以M和N代表数组长度,对x,y,z的要求一般有以下3种:

1、M*N的x,M*N的y,M*N的z
2、M的x,N的y,M*N的z
3、M的x,M的y,M的z

使用help()查询了plt.contour()的语法,发现它只支持前2种
但第3种也是非常常见的,这个问题一定要解决!
IDL语言的contour()直接支持这3种,由于之前就知道它使用三角网TRIANGULATE来插值,突然让我发现有个plt.tricontour()!
原来,对于第3种情况,matplotlib使用了另一个函数tricontour(),我去!

于是从网上找到了一个不错的例子:
https://matplotlib.org/gallery/images_contours_and_fields/irregulardatagrid.html#sphx-glr-gallery-images-contours-and-fields-irregulardatagrid-py

代码经过我重新注解如下:

import matplotlib.pyplot as plt
import matplotlib.tri as tri
import numpy as np

#以下代码生成 x,y,z 3个一维向量备用
N = 100
M = 200
x = np.random.uniform(-2, 2, M)#生成[-2,2]区间的M个随机数
y = np.random.uniform(-2, 2, M)#生成[-2,2]区间的M个随机数
z = x * np.exp(-x**2 - y**2)#根据x和y生成z


#新建窗口,有上下2个绘图窗,句柄分别是ax1和ax2:
fig,(ax1,ax2)=plt.subplots(nrows=2)


#以下步骤利用xyz生成xi,yi,zi
#xi是100个元素的数组,yi是200个的,zi是200行100列的
xi = np.linspace(-2.1, 2.1, N)#生成[-2.1,2.1]区间N个索引序列
yi = np.linspace(-2.1, 2.1, M)
triang = tri.Triangulation(x, y)
interpolator = tri.LinearTriInterpolator(triang, z)
Xi, Yi = np.meshgrid(xi, yi)
zi = interpolator(Xi, Yi)

print(xi.shape,yi.shape,zi.shape)#查看大小
#输出:(100,) (200,) (200, 100)

#xi,yi,zi的结构直接适用plt.contour语法
ax1.contour(xi, yi, zi, levels=14, linewidths=0.5, colors='k')#只有线条的等值线
#注意这里contour和contourf的区别,带f的是填充的
cntr1 = ax1.contourf(xi, yi, zi, levels=14, cmap="RdBu_r")#填充色的等值线图
fig.colorbar(cntr1, ax=ax1)#添加色条
ax1.plot(x, y, 'ko', ms=3)#叠加散点
ax1.set(xlim=(-2, 2), ylim=(-2, 2))#坐标限
ax1.set_title('grid and contour')#标题

#以下x、y、z都是一维200个元素的向量,使用tricontour画等值线

print(x.shape,y.shape,z.shape)#查看大小
#输出:(200,) (200,) (200,)

ax2.tricontour(x, y, z, levels=14, linewidths=0.5, colors='k')#等值线条
cntr2 = ax2.tricontourf(x, y, z, levels=14, cmap="RdBu_r")#填色等值线图
fig.colorbar(cntr2,ax=ax2)#添加色条
ax2.plot(x, y, 'ko', ms=3)#叠加散点
ax2.set(xlim=(-2, 2), ylim=(-2, 2))#坐标限
ax2.set_title('tricontour')#标题

plt.subplots_adjust(hspace=0.5)#调整2个绘图窗的距离
plt.show()#显示图
360截图20200605002306543.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-6-29 23:24:49 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-29 23:26 编辑

网格化应用案例
Figure_1.png
把不规则散点转化为规则网格,IDL使用triGrid函数来实现,python使用scipy中的griddata

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt

#散点位置与其值:
def func(x, y):
    return x**2+y**2
points = np.random.rand(100,2)#实际点坐标
values = func(points[:,0],points[:,1])#实际点的值

#规则点的位置:
x=np.linspace(0,1,11)
y=np.linspace(0,1,11)
xx,yy= np.meshgrid(x,y)
xx=xx.reshape(121,1)
yy=yy.reshape(121,1)
point_grid=np.hstack((xx,yy))

#从散点位置和值计算出规则位置的值:
grid_z0 = griddata(points, values, point_grid, method='nearest')

#绘制不规则点:
plt.scatter(points[:,0],points[:,1],c=values,cmap='rainbow')
#绘制插值后的规则点:
plt.scatter(point_grid[:,0],point_grid[:,1],c=grid_z0,marker='*',cmap='rainbow')
#添加网格线:
for i in np.arange(0,1.1,0.1):
    plt.axhline(y=i,c='k',lw=1,ls='--')
    plt.axvline(x=i,c='k',lw=1,ls='--')
plt.show()
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-22 16:06:31 | 显示全部楼层
等值线条的选择与标值
Figure_1.png

#该用例实现IDL的c_value关键字的功能,即选择性画等值线条,并标值
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#字体设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['font.size'] = 12

s=np.linspace(-1,1,100)
x,y=np.meshgrid(s,s)#网格化
fig,(ax1,ax2)=plt.subplots(ncols=2)
z=x*y#构造个鞍型场
cs1=ax1.contour(x,y,z,
               np.arange(np.min(z),np.max(z),0.1),#画哪些线
               cmap='rainbow')
ax1.clabel(cs1,fmt='%.1f')#等值线标值格式

cs2=ax2.contourf(x,y,z,cmap='rainbow')
cs3=ax2.contour(x,y,z,
               np.arange(np.min(z),np.max(z),0.1),#画哪些线
               colors='k')
ax2.clabel(cs3,fmt='%.1f')#等值线标值格式
plt.colorbar(cs2)#显示色条

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

使用道具 举报

新浪微博达人勋

发表于 2020-6-5 08:27:24 | 显示全部楼层
{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-6-5 08:39:23 | 显示全部楼层
非常细致
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2020-6-5 09:21:34 | 显示全部楼层
学习了!!!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2020-6-5 09:46:50 | 显示全部楼层
{:eb502:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2020-6-7 10:11:49 | 显示全部楼层
谢谢楼主大大
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-6-7 15:27:18 | 显示全部楼层
谢谢楼主!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2020-6-22 16:54:04 | 显示全部楼层
学习了,学习了!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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