python - 在 Matplotlib 中使用透明度离散化颜色图

标签 python arrays numpy matplotlib color-mapping

我想在另一个颜色网格之上绘制一个 matplotlib 颜色网格。底部图只是灰度图。

然而,当传递的数组的值为 0 时,位于顶部的那个应该绘制一个透明的正方形,并且传递的数组中的每个其他数字的颜色不同。这些是二维 numpy 数组。

目前我有:

plt.pcolormesh(array1, vmin = -32, vmax = 32, cmap = plt.cm.binary)
plt.pcolormesh(array2, cmap = plt.cm.spectral)

显然这不会产生我正在寻找的东西,我假设这样做的方法是生成我自己的颜色图,我已经阅读了本指南:http://wiki.scipy.org/Cookbook/Matplotlib/ColormapTransformations但这似乎并没有解决透明度问题,也没有解决如何将特定值映射到特定颜色的问题。

作为我想要的一个简短示例,一个数组:

[[0, 1]
 [2, 3]]

应该生成如下所示的网格:

[[transparent, red
 [green, yellow]]

我该怎么做呢?将数组合并在一起不是一种选择,因为底部数据集是高度图,并且它的值可能总是跨越第二个数组的值(这些是代理 ID)。

最佳答案

此代码应该执行类似于您需要的操作:

使用 masked_array 编辑:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as colors
import numpy.ma as ma

#See http://stackoverflow.com/questions/18926031/how-to-extract-a-subset-of-a-colormap-as-a-new-colormap-in-matplotlib
def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=100):
    new_cmap = colors.LinearSegmentedColormap.from_list(
        'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval, b=maxval),
        cmap(np.linspace(minval, maxval, n)))
    return new_cmap

#truncate the colourmap
n_colours = 4
new_cmap = truncate_colormap(cm.get_cmap('spectral_r'), 0, 0.4, n=n_colours)

#discretise the colourmap
bounds = np.linspace(0,n_colors,n_colours+1)
norm = colors.BoundaryNorm(bounds, new_cmap.N)

#build array one
array1 = np.random.rand(10,10)

#build array two
array2 = np.random.randint(0,5,100).reshape(10,10)

#mask the array
array2 = ma.masked_array(array2, array2==0)

#plot it
plt.pcolormesh(array1,cmap = plt.cm.binary)
plt.pcolormesh(array2,cmap = new_cmap, norm=norm)
cbar = plt.colorbar()
plt.show()

这是使用掩码数组的新输出:

enter image description here

关于python - 在 Matplotlib 中使用透明度离散化颜色图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890041/

相关文章:

c++ - 获取二维数组中数字的平均值、最小值和最大值

java - nxn 棋盘上 n 个玩家的 Tic tac Toe - 检查获胜者

python - IPython 无法导入 Geopandas

java - 为什么Python不能通过子进程执行java.exe?

python - 查找列表中相差不超过 x 的所有数字对的最快方法

python - Django/Python - 检查用户是否上传文件 - 如果没有,显示图像

c++ - vector 、字符串还是数组?

python 仅适用于 sudo

python - 为极坐标创建网格

python - 将两个 matplotlib figure.Figure 或 axes.Axes 对象合并为一个新对象