【问题标题】:Combining two 2D arrays into one image plot将两个二维数组组合成一个图像图
【发布时间】:2013-09-13 10:46:08
【问题描述】:

我有两个二维数组,每个数组代表地图上的一个属性。其中一个代表冰雹概率(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 函数,但是数据很不规则,图看起来很糟糕。

我一直在考虑将这两个特征组合到一个颜色图中,但我不太确定如何去做。假设我想为概率和严重性的每种组合使用一种颜色。

关于如何做到这一点的任何想法?

【问题讨论】:

标签: python numpy matplotlib


【解决方案1】:

我会做一个散点图,其中颜色是一个值,大小是另一个值。例如,颜色可能是概率,但大小可能是强度。

这是一些随机数据

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)

您必须调整尺寸的标准化,因为您的单位将不同于良好的像素尺寸。

或者更有趣的形状:

【讨论】:

    【解决方案2】:

    我不确定结果如何,但您可以使用不同的颜色图并将一​​个图叠加在另一个图上,并使用顶部的 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()
    

    【讨论】:

    • 我一直在想和你说的类似的事情,但不知道这是否可行。我的想法是为一个属性使用颜色图,并根据另一个属性定义 alpha。你认为这可能吗?
    • 是的,我想是的。您必须使用LinearSegmentedColormap 并使用'cmap' 的_lut 属性来设置alpha。看到这个stackoverflow.com/a/10127675/1461850
    • 我一直在检查_lut 属性,它可用于更改定义颜色图的颜色的alpha。但是,我需要用二维数组的数据分别定义图像中每个像素的 alpha。类似于基于像素的 alpha 属性,而不是适用于整个绘图的标量。
    • 我认为在数组中定义一系列 alpha 并使用 _lut 应该可以达到同样的效果。我不确定你是否可以逐个像素地定义 alphas。
    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 2021-10-29
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    相关资源
    最近更新 更多