- 问题 *
我想处理一些来自64*30(在XZ平面上)多云大气的模拟数据。
具体来说,我想显示一些物理属性的图像,例如:消光,作为位置的函数(以物理距离单位(km),而不是以“x点的数量,z点的数量”/“像素”坐标,如果这不清楚,将进一步举例说明)。
- 我有水平分辨率:55米
- 我知道垂直轴从0到1000米。垂直分辨率不是恒定的,它在云层内加倍(因为我们想要更高的精度)。
- 即:z ∈ [0,400]m,分辨率为50 m,即从索引z[0]到z[9] -云以下
z ∈ [400,850]m,分辨率为25 m,即从索引z[9]到z[26] -在云中
z ∈ [850,1000]m,分辨率又是50 m,即从索引z[26]到z[29] -在云上方
这个问题基本上是在不规则的网格中显示数组。我不知道做这件事最有效的方法是什么。
还有什么方法是我没想到的?
我所做的
我的数据组织为:
X1 Z1 EXTINCTION ... other parameters ...
X1 Z2 EXTINCTION ... other parameters ...
.
.
.
X1 Z30 EXTINCTION ...other parameters ...
X2 Z1 EXTINCTION ...other parameters ...
.
.
.
X64 Z30 EXTINCTION ...other parameters ...
我已经将每条线的消光值存储在某个数组EXT
中,并将每条线的x和z坐标存储在X
& Z
中
接下来,我将EXT
的值添加到一个表示空间坐标的64*30矩阵中。我在range循环中使用了2来遵循数据中的行索引的顺序,它由k表示。
Extinction = np.zeros(64,30)
k = 0 #count the line
for x in range (0,64):
for z in range(0,30) :
Extinction [x,z] = EXT[k] #Add the value of extinction for the corresponding x,z position
k += 1 #next line
最后,我使用matplotlib.pyplot.imshow
来显示结果
fig, ax = plt.subplots()
im = ax.imshow(Extinction.T,cmap='gnuplot',origin='lower')
由于我希望我的轴以米为单位显示距离,知道分辨率和像素数,我只需用途:extent(55*64,0,1000)
作为ax.imshow()
中的参数
- 当然,所得到的图仅对恒定的垂直分辨率是正确的。Extent()仅均匀拉伸图。由于分辨率从50米到25米,因此高度将不正确。Basic plot
“蛮力”法
我试着走一条看似简单的路。我不能肯定它是否正确。
我修改了我的Extinction
数组,人为地将云外的点的数量增加了一倍(本质上是将分辨率增加了一倍)。我这样做是为了使垂直分辨率在任何地方都是恒定的。我的想法是,既然空气中的消光系数总是0,那就不应该是个问题。我做了以下工作:
import numpy as np
import matplotlib.pyplot as plt
Alebdo = np.zeros(64,30)
k = 0
for x in range (0,64):
for z in range(0,17): #below the cloud
Extinction[x,z] = 0
k += 9 #we doubled each line. The line number corresponding the beginning of the cloud is 9
for z in range(17,36): #cloudy zone
Extinction[x,z] = EXT[k]
k += 1
for z in range(36,40): #above the cloud
Extinction[x,z] = 0
k += 2
这似乎是可行的,但是:
1.云层有点“挤”
1.我不知道这是不是身体上的“正确”
1.有些性质(不像反照率或消光)在云层下面并不是恒定的。所以我不能把云层从空气中分离出来,然后在其他地方放一个常量。例如,辐射场在云下方将不是均匀的。
1.这不是很实际,因为我必须根据我使用的模拟手动更改很多参数。
"Brute-force"/manual edit of the array plot
插值
我以前很少使用插值。但据我所知,它在这种不规则网格的情况下很强大:
from scipy.interpolate import griddata
xg = np.linspace(0,64,41)
zg = np.arange(0,30,1)
xgrid, zgrid = np.meshgrid(xg, zg)
EXT_interpolate = griddata((X, Z), EXT, (xgrid, zgrid), method='nearest')
im=ax.imshow(xgrid, zgrid, EXT_interpolate, cmap='gnuplot')
f=fig.colorbar(im, ax=ax,shrink=0.8)
我的问题:
1.我的图以“数组索引”坐标显示数据。如何以米为单位显示距离?我不能像以前那样简单地使用extent()
,有没有contourf
的等价物?
1.我应该在哪里插入数据?使用41个垂直点是有意义的(因为这是我在分辨率为25 m时的点数:40* 25 m = 1000 m,加上标高z=0)。Interpolated plot
**编辑:**感谢Paul Brodersen的评论,我选择插入:
#X was previously a list of index : X=[1,2,3....,64]
#I changed it to distances in km since I know the resolution is 55m X=[0,0.055,0.110 ,...]
#Same for Z, which is now Z=[0,0.050,0.0100,0.0150, ..., 0.350,0.400,0.425,0.450,...]
# So it now accounts for the change in resolution
from scipy.interpolate import griddata
#Grid on which we will interpolate
xg = np.linspace(0,3.465,0.055) #don't touch the x resolution
zg = np.arange(0,1,100)#change z resolution so that it's uniform, 10m here.
xgrid, zgrid = np.meshgrid(xg, zg)
EXT_interpolate = griddata((X, Z), EXT, (xgrid, zgrid), method='nearest')
#Plot the interpolation
im=ax.imshow(xgrid, zgrid, EXT_interpolate, cmap='gnuplot2')
f=fig.colorbar(im, ax=ax,shrink=0.8)
#I still have to add extent(0,3.465,0,1) if I want to display distances and not the index of my grid points
1条答案
按热度按时间woobm2wo1#
报价pcolormesh文档
使用非规则矩形网格创建伪彩色图。
下面的代码比您需要的要长,因为我想向您展示着色选项如何更改解释轴限制的方式。
另外,对于
shading='flat'
,你必须传递一个“更小”的颜色矩阵,我只是删除了最后一行,列,你会执行某种均值/插值。最终,网格线显示网格是不规则的,在生产环境中,您可能会删除
ec='w', lw=0.1, antialiased=1
参数