- 积分
- 3628
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-10-21
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 15195775117 于 2020-6-5 00:31 编辑
以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()#显示图
|
|