scipy 如何以非均匀分辨率在物理距离坐标中绘制阵列

2w3rbyxf  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(193)
  • 问题 *

我想处理一些来自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
woobm2wo

woobm2wo1#

报价pcolormesh文档
使用非规则矩形网格创建伪彩色图。

下面的代码比您需要的要长,因为我想向您展示着色选项如何更改解释轴限制的方式。
另外,对于shading='flat',你必须传递一个“更小”的颜色矩阵,我只是删除了最后一行,列,你会执行某种均值/插值。
最终,网格线显示网格是不规则的,在生产环境中,您可能会删除ec='w', lw=0.1, antialiased=1参数

from matplotlib.pyplot import show, subplots
from numpy import arange, concatenate, cos, meshgrid

x = 55.0*arange(64)
z = concatenate((
    0.00 + 50*arange( 8),
    400. + 25*arange(18),
    850. + 50*arange( 4),
))
X, Z = meshgrid(x, z)
E = cos((X/3000-Z/1200)) # unimportant

fig, ((none, flat), (nearest, gouraud)) = subplots(2, 2, figsize=(11,4.5), layout='constrained')

none.pcolormesh(X, Z, E, shading=None, ec='w', lw=0.2, antialiased=1)
none.set_aspect(1)
none.set_title('No shading')

flat.pcolormesh(X, Z, E[:-1,:-1], shading='flat', ec='w', lw=0.2, antialiased=1)
flat.set_aspect(1)
flat.set_title('Flat shading')

nearest.pcolormesh(X, Z, E, shading='nearest', ec='w', lw=0.2, antialiased=1)
nearest.set_aspect(1)
nearest.set_title('Nearest shading')

gouraud.pcolormesh(X, Z, E, shading='gouraud', ec='w', lw=0.2, antialiased=1)
gouraud.set_aspect(1)
gouraud.set_title('Gouraud shading')

show()

相关问题