用一堆不同颜色的二维数组绘制pcolormesh

时间:2016-01-17 08:04:02

标签: python arrays numpy matplotlib matplotlib-basemap

这是我的问题

对不起表达困惑。

只需查看我的更新。它更清楚。

1。简介

  • 3-d numpy-array "数据" ,形状为(10,31,37)。
  • 第一维10是2维数组的数量
  • 最后2个数组表示2-d区域的某个网格值,值为0& 1

它显示如下:

### mask the value 0 of data[1,:,:]
data_mask = np.ma.masked_less(data[[1,:,:],0.001)
pc =plt.pcolor(xx,yy,data_mask[i,:,:],alpha =1,facecolor = "pink",edgecolor = 'steelblue',zorder =3)
## plotting the grid line
mesh =plt.pcolor(xx,yy,data[1,:,:],cmap="gray",alpha =0.45,facecolor = "none",edgecolor = 'k')       

Sorry, China don't allow me using imgur http://i8.tietuku.com/f3573868c548d7e3.png

2。我的尝试

  • 在一个图中用不同的颜色绘制每个2维阵列
  • 如果可以将横截面部分绘制成另一种颜色(如维恩图)或填充类型("孵化"),则:

http://i8.tietuku.com/3f39c4b125286324.png

3。我的代码

例如两个二维阵列 http://i8.tietuku.com/7b8b67f8422631e1.png

cs=plt.cm.jet(np.arange(2)/2.)     
for i in range(0,2,1):
    data_mask = np.ma.masked_less(data[i,:,:],0.001)
    plt.pcolor(xx,yy, data_mask[i,:,:],alpha =0.95,facecolor = cs[i],edgecolor = 'k',zorder =3)      

结果
http://i8.tietuku.com/13092a81a118e180.png

这些数字似乎都是颜色设置错误。

4。我的问题

  
      
  1. 如何设置pcolor网格颜色?在我的示例中,使用facecolor =并不起作用。我知道使用cmap = plt.cm.xxx作品(如下图所示)。但我必须分别绘制这两个二维阵列。
  2.   

http://i8.tietuku.com/3c1ccd7252476678.png

  
      
  1. 正如我在'我的尝试2' 中说的那样,是否有一种方法来证明重叠并以某种聪明的方式标记这些网格。
  2.   

我能想到的是生成另一个名为'重叠的np.array。并保存每个网格的信息

for i in range(0,data.shape[1],1):
    for j in range(0,dat.shape[2],1):
        if (data[0,i,j] == 1) & (data[1,i,j] == 1.0):
            overlap[i,j] = 1       

当有两个以上的二维阵列时,这种方法无法应对。

更新-2016-01-17

我将我的问题总结为一个图,其中包含生成它的代码:

cover_mask = np.ma.masked_less(data[0,:,:],0.001)
plt.pcolor(xx,yy,data_mask[0,:,:],cmap = plt.cm.Set1,alpha =0.75,\
           edgecolor = 'k',zorder =3)      

cover_mask = np.ma.masked_less(cov[1,:,:],0.001)       
plt.pcolor(xx,yy,cover_mask[1,:,:],cmap = plt.cm.Set2,alpha =0.75,\
           edgecolor = 'k',zorder =3)          

http://i4.tietuku.com/1d47a3410417cd4f.png

我的问题

  1. 在上面的代码中,我分别绘制了2-d数组。如果可以使用facecolor = 'cs[i]'使用cs=plt.cm.xxx(np.arange(2)/2.)设置网格颜色,我可以循环所有数据[0:10,:,]。但我只能使用cmap = xxx来区分每个数据阵列的颜色。 我不知道如何循环色彩映射。

  2. 在上图中,红色网格和绿色网格重叠。为了获得更好的可视化效果,我想标记这些重叠的网格。

  3. 创意1

    • 每个2-d网格有不同的颜色,所有重叠区域共享相同的颜色(在我的情况下,需要11种颜色)

    创意2

    用重叠网格标记' X'或类似下图的东西。

    http://i8.tietuku.com/881c1aacdddd9258.png

    添加

    基于此post,似乎' pcolor / pcolormesh'没有设置hatch = '* '

    的功能

2 个答案:

答案 0 :(得分:1)

免责声明:我之前没有使用过numpy color plot。

那说我想我知道你的问题在哪里。来自cmap文档:

  

通常,Colormap实例用于将数据值(浮点数)从区间[0,1]转换为相应Colormap表示的RGBA颜色。

我认为问题在于您将所有网格值设置为1,然后将所有重叠值设置为1。所以在cmap中它们最终会变成相同的颜色。如果你想要它们是不同的颜色,它们需要是不同的值。或者,如果你想在中间使用一个值,则使用0到1之间的浮点数。将一个数组的所有值设置为1,将另一个数组的所有值设置为0,重叠单元格设置为0.5将为您提供cmap​​另一端的颜色重叠单元格是两者的混合(假设您使用的是2色cmap)。订正:

for i in range(0,data.shape[1],1):
    for j in range(0,dat.shape[2],1):
        #assuming you've set one array to 0 and the other to 1
        overlap[0, i, j] = abs(data[0, i, j] / data[1, i, j) / 2 
        #if (data[0,i,j] == 1) & (data[1,i,j] == 1.0)
            #overlap[i,j] = 1

希望能回答你的问题,这有点令人困惑。我很欣赏您提供的所有信息,但一开始明确说明“这确实是错误的”声明肯定有助于理解问题。如果这样可以解决问题,请告诉我,因为我很感兴趣。

答案 1 :(得分:1)

如果您只想将重叠单元格设置为一种颜色,则以下代码可以正常工作:

import numpy as np
import pylab as pl
from matplotlib import colors

data = (np.random.rand(3, 5, 10) > 0.8).astype(np.int)
cdata = (data * np.arange(1, 4)[:, None, None]).sum(axis=0)
overlap = data.sum(axis=0) > 1
cdata[overlap] = 4

y, x = np.mgrid[:6, :11]

cmap = colors.ListedColormap(["w", "r", "g", "b", "k"])
pl.pcolormesh(x, y, cdata, edgecolor="black", cmap=cmap)

重点是只调用pcolormesh()一次,并使用ListedColormap cmap对象设置每个单元格的颜色,这是输出:

enter image description here

阵列的颜色是“r”,“g”,“b”,重叠颜色是黑色。以下是数据内容:

array([[[0, 0, 0, 1, 0, 1, 0, 0, 1, 0],
        [0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
        [0, 0, 1, 0, 0, 0, 1, 1, 0, 0],
        [1, 1, 0, 0, 0, 0, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 0, 0, 1, 0, 0]],

       [[0, 0, 0, 1, 1, 0, 1, 1, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
        [1, 1, 1, 0, 0, 0, 1, 0, 0, 0]],

       [[0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
        [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]])