将两个二维数组合并成一个图像绘图

3
我有两个二维数组,分别代表地图上的一种属性。其中一个表示冰雹的概率(0%-100%),另一个表示冰雹的严重程度(0-无冰雹,1-低,2-中,3-高)。
我可以使用matplotlib的imshow和预定义的颜色映射单独绘制这些数组:
import matplotlib.pyplot as plt
import matplotlib.colors as cl

cmap = cl.ListedColormap(['#00FF00', '#FFFF00', '#FF0000'])
bounds = [0, 30, 60, 100]
norm = cl.BoundaryNorm(bounds, cmap.N)

plt.subplot(121)
plt.imshow(hail_prob, cmap=cmap, norm=norm)

cmap = cl.ListedColormap(['#00FF00', '#FFFF00', '#FF0000'])
bounds = [0.5, 1.5, 2.5, 3.5]
norm = cl.BoundaryNorm(bounds, cmap.N)

plt.subplot(122)
plt.imshow(hail_sev, cmap=cmap, norm=norm)

如上所述,这很容易。

然而,我希望有一个独特的情节,结合了两个特征。我已经测试过contour函数,但是数据相当不规则,绘图效果很差。

我一直在考虑将两种特性合并成一个颜色映射,但我不太确定如何做到这一点。假设我想要每个概率和严重程度的组合颜色。

有什么想法吗?


有关其他想法,请参见著名的matplotlib图库 - askewchan
2个回答

2
我会制作散点图,其中颜色是一个值,大小是另一个值。例如,颜色可以是概率,而大小可以是强度。
以下是一些随机数据。
hail_prob = np.random.rand(48, 64)
hail_sev = np.random.randint(0,4,hail_sev.shape)

在这里,您可以使用np.meshgrid从现有数据中获取x-y点,并在散点图中使用它们:

x = np.arange(hail_prob.shape[1])
y = np.arange(hail_prob.shape[0])
xy = np.meshgrid(x,y)
scatter(*xy, c=hail_prob, s=hail_sev)

你需要调整尺寸的规范化,因为你的单位可能与像素大小不同。以下是更有趣的形状示例:

1
我不确定结果如何,但您可以使用不同的颜色映射将一个图形覆盖在另一个图形上,并调整顶部图形的透明度(alpha)。
例如,
cmap1='Reds'
cmap2='Blues'
plt.imshow(hail_prob, cmap=cmap1, norm=norm)
plt.imshow(hail_sev, cmap=cmap2, norm=norm, alpha=0.5)
plt.colorbar()

我一直在思考与你所说的类似的事情,但我不知道这是否可能。我的想法是使用一种颜色映射来表示一个属性,并根据另一个属性定义透明度。你觉得这可行吗? - Iñigo Hernáez Corres
是的,我认为是这样。您需要使用LinearSegmentedColormap并使用'cmap'的_lut属性来设置阿尔法值。请参见此https://dev59.com/zWkw5IYBdhLWcg3wHW3n#10127675 - Lee
我一直在检查 _lut 属性,它可以用来改变定义颜色映射的颜色的 alpha 值。然而,我需要的是使用二维数组的数据单独定义图像中每个像素的 alpha 值。类似于基于像素的 alpha 属性,而不是适用于整个图形的标量。 - Iñigo Hernáez Corres
我认为在数组中定义一系列的alpha值,并使用“_lut”应该可以达到相同的效果。我不确定是否可以逐像素定义alpha值。 - Lee
这是与此讨论相关的问题链接:https://dev59.com/HWUp5IYBdhLWcg3wh4BW#15435734 - tacaswell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接