使用pcolor在python中绘制3个数组

时间:2011-10-30 22:57:18

标签: python image-processing numpy matplotlib

我读了一个卫星图像,然后从图像中获取数据,拉出和放入数组。 lat的维数是(135,90),lon也是(135,90)。数据的维度最初是(135,90,4,9,8),其中4代表图像的带。在处理之后(使用for循环将所有频带放在单个图像中),数据的维度是biw(1215,720),即(135 x9,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 :(得分: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的尺寸;如果尺寸相同,则忽略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瓷砖的角点......有意义吗?如果您知道中心点的纬度/经度,则将它们向左/向下移动一半距离,然后在右侧/上方添加一行和一列以创建网格点。如果你使用投影坐标而不是lat / lon,那也是一样的。或者你可以忘记这些半距离交易,只需插入你已经得到的X和Y(135x90),以及C,必须是135x90,才能使用pcolor。

9,8(135,90,4,9,8)的含义是什么?你在每个水平网格单元有9 * 8不同的属性吗?例如垂直层,不同种类的化学物质或物理性质?如果是这样,你必须选择一个并一次制作一个图(即,只提供135x90的C以及你的X和Y)。另外,你提到4是“乐队”。如果这个id颜色带像RGBK并且你想要显示那种颜色,那么可能pcolor并不好,你必须寻找一些其他功能或了解那些4号的东西。 pcolor只需读取数字范围,然后在最小值和最大值之间应用比例,然后应用从蓝色到红色的颜色标度(或者如果你选择的话,可以选择任何颜色)

修改

我抓住了Level-1B,VISIBLE的数据集以及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 um - 0.44 um
  • 第2频道:0.58 um - 0.68 um
  • 第3频道:0.71 um - 0.92 um
  • 第4频道:0.49 um - 0.94 um

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