用一堆不同颜色的二维数组绘制 pcolormesh
Plotting pcolormesh with a bunch of 2-d arrays with different color
这是我的问题
抱歉表达混乱。
请检查我的更新。更清楚了。
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。我的问题
- How to set the pcolor grid color? In my example, using
facecolor =
didn't work. And I know using cmap = plt.cm.xxx
works(picture below). But I must plot this two 2-d array separately.
(来源:tietuku.com)
- As I said in 'My attempt 2', Is there a method to testify the overlapping and label these grid in some smart way.
我能弄清楚的是生成另一个名为 '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
我的问题
在上面的代码中,我分别绘制了二维数组。如果可以使用 facecolor = 'cs[i]'
和 cs=plt.cm.xxx(np.arange(2)/2.)
设置网格颜色,我可以循环所有数据 [0:10,:,:]。但我只能使用 cmap = xxx
来区分每个数据数组的颜色。 我不知道如何循环颜色图。
上图中,红色格子和绿色格子是重叠的。为了更好的可视化效果,我想将这些重叠的网格标记为striked。
想法 1
- 每个二维网格都有不同的颜色,所有重叠区域共享相同的颜色(在我的例子中,需要 11 种颜色)
想法 2
用 'X' 或类似下图的东西标记重叠的网格。
(来源:tietuku.com)
添加
基于这个post,似乎'pcolor/pcolormesh'没有设置hatch = '* '
的功能。
免责声明:我以前没有使用过 numpy 颜色图。
也就是说,我想我知道您的问题出在哪里。来自 cmap 文档:
Typically Colormap instances are used to convert data values (floats) from the interval [0, 1] to the RGBA color that the respective Colormap represents.
我认为问题在于您将所有网格值设置为 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
希望这能回答您的问题,它有点令人困惑。我很感谢您提供的所有信息,但在开头的清晰 "This is exactly what is wrong" 声明肯定有助于理解问题。嘿,让我知道这是否解决了问题,因为我很感兴趣。
如果您只想将重叠单元格设置为一种颜色,则可以使用以下代码:
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]]])
这是我的问题
抱歉表达混乱。
请检查我的更新。更清楚了。
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。我的问题
- How to set the pcolor grid color? In my example, using
facecolor =
didn't work. And I know usingcmap = plt.cm.xxx
works(picture below). But I must plot this two 2-d array separately.
(来源:tietuku.com)
- As I said in 'My attempt 2', Is there a method to testify the overlapping and label these grid in some smart way.
我能弄清楚的是生成另一个名为 '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
我的问题
在上面的代码中,我分别绘制了二维数组。如果可以使用
facecolor = 'cs[i]'
和cs=plt.cm.xxx(np.arange(2)/2.)
设置网格颜色,我可以循环所有数据 [0:10,:,:]。但我只能使用cmap = xxx
来区分每个数据数组的颜色。 我不知道如何循环颜色图。上图中,红色格子和绿色格子是重叠的。为了更好的可视化效果,我想将这些重叠的网格标记为striked。
想法 1
- 每个二维网格都有不同的颜色,所有重叠区域共享相同的颜色(在我的例子中,需要 11 种颜色)
想法 2
用 'X' 或类似下图的东西标记重叠的网格。
(来源:tietuku.com)
添加
基于这个post,似乎'pcolor/pcolormesh'没有设置hatch = '* '
的功能。
免责声明:我以前没有使用过 numpy 颜色图。
也就是说,我想我知道您的问题出在哪里。来自 cmap 文档:
Typically Colormap instances are used to convert data values (floats) from the interval [0, 1] to the RGBA color that the respective Colormap represents.
我认为问题在于您将所有网格值设置为 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
希望这能回答您的问题,它有点令人困惑。我很感谢您提供的所有信息,但在开头的清晰 "This is exactly what is wrong" 声明肯定有助于理解问题。嘿,让我知道这是否解决了问题,因为我很感兴趣。
如果您只想将重叠单元格设置为一种颜色,则可以使用以下代码:
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]]])