【问题标题】:Plotting pcolormesh with a bunch of 2-d arrays with different color用一堆不同颜色的二维数组绘制 pcolormesh
【发布时间】:2023-04-06 10:52:01
【问题描述】:

这是我的问题

抱歉,表达混乱。

请检查我的更新。更清楚了。

1。简介

  • 3-d numpy-array "data" 形状为 (10, 31, 37)。
  • 第一个维度 10 是二维数组的个数
  • 最后 2 个数组表示二维区域的一些网格值,值为 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')       


(来源:tietuku.com

2。我的尝试

  • 在一个图中用不同颜色绘制每个二维数组
  • 如果可以用其他颜色(如维恩图)或填充类型(“影线”)绘制横截面部分,:


(来源:tietuku.com

3。我的代码

例如两个二维数组。

(来源:tietuku.com

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)      

结果

(来源:tietuku.com

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

4。我的问题

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


(来源:tietuku.com

  1. 正如我在'我的尝试 2' 中所说,有没有一种方法可以证明重叠并以某种智能方式标记这些网格。

我能想到的是生成另一个名为 'overlap' 的 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. 在上面的代码中,我分别绘制了二维数组。如果可以使用facecolor = 'cs[i]'cs=plt.cm.xxx(np.arange(2)/2.) 设置网格颜色,我可以循环我的所有数据[0:10,:,:]。但我只能使用cmap = xxx 来区分每个数组的颜色。 我不知道如何循环颜色图。

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

想法 1

  • 每个二维网格都有不同的颜色,所有重叠区域共享相同的颜色(在我的例子中,需要 11 种颜色)

想法 2

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


(来源:tietuku.com

添加

基于这个post,'pcolor/pcolormesh'好像没有设置hatch = '* '的功能。

【问题讨论】:

  • 有 10 个 2d 数组,所以需要 2**10 种颜色来表示重叠。这是你想要的吗?

标签: python arrays numpy matplotlib matplotlib-basemap


【解决方案1】:

免责声明:我之前没有使用过 numpy 颜色图。

也就是说,我想我明白你的问题出在哪里了。来自 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

希望能回答您的问题,这有点令人困惑。我感谢您提供的所有信息,但一开始明确的“这正是问题所在”声明肯定有助于理解问题。嘿,如果这能解决问题,请告诉我,因为我很感兴趣。

【讨论】:

  • 谢谢,如果我想通了。我会在这个问题上发布它并让你知道。
  • 好的,我看到你更新的问题。我认为您想将一个数组的值设置为 0,将另一个数组的值设置为 1。那么重叠应该设置为 0.5 或介于两者之间的某个值。我认为这应该使重叠混合两种颜色(取决于 cmap),原始对象是 cmap 两端的颜色。比我认为的 alpha 解决方案更好。
【解决方案2】:

如果您只想将重叠单元格设置为一种颜色,则以下代码有效:

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 对象设置每个单元格的颜色,这是输出:

数组的颜色为“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]]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多