我无法在matplotlib中描绘一些数据。我试图绘制一个从3d温度场切下的垂直横截面温度。
我的温度阵列(T)的大小为50 * 300,其中300是均匀间隔的水平水平的数量。然而,50是垂直水平的数量:a)非均匀间隔;和b)每个垂直柱具有不同的起始水平。因为总有50个垂直水平,但有时它们跨越100-15000米,有时从300-20000米(由于地形差异)。
我还有一个2d高度数组(Z;与T形状相同),1d水平位置数组(LAT)和1d地形高度数组(TER)。
我试图获得类似于here之类的情节,在其中您可以看到地形变黑并且数据在其周围形成轮廓。
我第一次尝试绘制这个是创建一个水平距离和高度的网格网格,然后用这些参数创建contourf温度。但是numpy.meshgrid需要1d输入,而我的高度是2d变量。做这样的事情只能从第一列开始向上绘制轮廓:
ax1 = plt.gca()
z1, x1 = np.meshgrid(LAT, Z[:,0])
plt.contourf(z1, x1, T)
ax1.fill_between(z1[0,:], 0, TER, facecolor='black')
产生this。如果我在网格网格中使用Z [:, - 1],它会在左边的列中进行地下轮廓,这显然是我不想要的。我真正想要的是在meshgrid中使用一些2d数组用于Z,但我不确定如何去做。
我也查看了griddata函数,但也需要1D输入。任何人对如何处理这个有任何想法?任何帮助表示赞赏!
答案 0 :(得分:1)
据我所知,您的数据是结构化的。然后,您可以直接使用contourf
中的contour
或matplotlib
选项。您提供的代码有正确的想法,但您应该使用
x1, z1 = np.meshgrid(LAT, Z[:,0])
plt.contourf(x1, Z, T)
等高线。我在下面有一个例子
import numpy as np
import matplotlib.pyplot as plt
L, H = np.pi*np.mgrid[-1:1:100j, -1:1:100j]
T = np.cos(L)*np.cos(2*H)
H = np.cos(L) + H
plt.contourf(L, H, T, cmap="hot")
plt.show()
看看网格是使用原始边界框生成的,但绘图是使用已转换的高度而不是初始高度。此外,您可以将tricontour
用于非结构化数据(或者一般情况下),但是您需要生成三角测量(在您的情况下很简单)。