使用pcolor在Python中绘制三个数组

1 投票
1 回答
2364 浏览
提问于 2025-04-17 05:18

我读取了一张卫星图像,从中提取了经纬度数据,并把它们放进了一个数组里。纬度(lat)的尺寸是(135,90),经度(lon)也是(135,90)。原始数据的尺寸是(135,90,4,9,8),其中4代表图像的波段。经过处理(使用了一个循环把所有波段合并成一张图),数据的尺寸变成了(1215,720),也就是(135 x 9, 90 x 8)。我有一段代码,如下:

x = lat   # dimension (135,90)
y = lon   # dimension (135,90)
z = data  # dimension ( 1215, 720) 

plt.figure()
plt.pcolor(x,y,z)
plt.colorbar()
plt.savefig("proj1.png")

但是生成的图像效果很差,如下所示:

enter image description here

我的朋友之前告诉我,应该在经纬度上取更多的点,这样才能让它们的尺寸和数据一致。但我不知道该怎么做。他说的方法对吗?

1 个回答

0

又是我... matplotlib的文档在这里说 http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.pcolor

X和Y,如果给定的话,指定了有颜色的四边形的(x, y)坐标;C[i,j]的四边形的角落在:

    (X[i,   j],   Y[i,   j]),
    (X[i,   j+1], Y[i,   j+1]),
    (X[i+1, j],   Y[i+1, j]),
    (X[i+1, j+1], Y[i+1, j+1]).

理想情况下,X和Y的维度应该比C大1;如果维度相同,那么C的最后一行和最后一列将被忽略。

但是C的维度(或形状)和X、Y完全不同。matplotlib希望你准备(1) X和Y是网格点(或角点)的x和y坐标,(2) C是被4个相邻网格点包围的瓦片的值。所以你的x和y的形状应该是135和90。然后颜色应该是134乘89,或者135乘90。

我理解的是,这个C的数据来自modis像素,而你已经有了135x90的数据。所以你应该指定这12150个瓦片的角点...明白了吗?如果你知道中心点的经纬度,你可以向左/下移动半个距离,然后在右/上添加一行和一列来创建网格点。如果你使用投影坐标而不是经纬度,那也是一样的。或者你可以不考虑这些半个距离的问题,直接把你已经得到的X和Y(135x90)和C(必须是135x90)一起用到pcolor中。

(135,90,4,9,8)中的9和8是什么意思?你在每个水平网格单元中有9*8种不同的属性吗?比如说,垂直层、不同种类的化学物质或物理属性?如果是这样,你必须选择一个,然后一次画一个图(也就是说,只输入135x90的C和你的X和Y)。另外,你提到4是“波段”。如果这个是像RGBK这样的颜色波段,而你想显示这个颜色,那么可能pcolor不太合适,你需要找其他的函数或者东西来理解这4个数字。pcolor只是读取数字范围,然后在最小值和最大值之间应用比例,再从蓝色到红色(或者你选择的其他颜色)应用颜色比例。

编辑

我抓取了Level-1B的可见光数据集和文档,来自 http://disc.sci.gsfc.nasa.gov/AIRS/data-holdings/by-access-method

这个数据集是从AIRS 1A级数字数值(DN)生成的,包括0.4到1.0微米范围内的4个通道。一天的AIRS数据被分成240个场景,每个场景持续6分钟。对于AIRS的可见光/近红外测量,一个场景包含135条扫描线,每条扫描线包含720个横向像素和9个纵向像素;每个场景总共有720 x 9 x 135 = 874,800个可见光/近红外像素。

所以最简单的方法是获取每个位置的8x9值的平均值,然后一次选择四个轨道中的一个。或者,由于这些波段对应不同的颜色,如下所示的波长,

  • 通道1:0.41微米 - 0.44微米
  • 通道2:0.58微米 - 0.68微米
  • 通道3:0.71微米 - 0.92微米
  • 通道4:0.49微米 - 0.94微米

你可以把这些作为RGBK值用于pylab的imshow()函数的输入,可能。你可能不喜欢空间平均后输出的粗糙分辨率。在这种情况下,你必须以某种方式获取每个位置内每个(9,8)像素的坐标。不过应该有一种标准的方法,因为这些数据是广泛使用的公共数据。

撰写回答