将 alpha 添加到现有的 matplotlib 颜色图中

新手上路,请多包涵

我想叠加几个 hexbin 图,但是使用内置颜色图只有最后一个是可见的。我不想从头构建颜色图。如何在事先不知道颜色图的内部结构的情况下将线性 alpha 添加到颜色图?

原文由 Hennadii Madan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 625
2 个回答

我不太确定这是否符合“不知道颜色图的内部结构”,但也许像这样的东西可以将线性 alpha 添加到现有颜色图?

 import numpy as np
import matplotlib.pylab as pl
from matplotlib.colors import ListedColormap

# Random data
data1 = np.random.random((4,4))

# Choose colormap
cmap = pl.cm.RdBu

# Get the colormap colors
my_cmap = cmap(np.arange(cmap.N))

# Set alpha
my_cmap[:,-1] = np.linspace(0, 1, cmap.N)

# Create new colormap
my_cmap = ListedColormap(my_cmap)

pl.figure()
pl.subplot(121)
pl.pcolormesh(data1, cmap=pl.cm.RdBu)
pl.colorbar()

pl.subplot(122)
pl.pcolormesh(data1, cmap=my_cmap)
pl.colorbar()

在此处输入图像描述

原文由 Bart 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想通过修复扩展 Bart 的答案,消除颜色条中的线条伪影。一些历史:截至今天,这些线条伪影仍然存在,并且没有得到很好的解决(请参阅 Matplotlib:添加一个从全透明到全彩色的自定义颜色条(删除伪影)为什么我的颜色条中有线条? )。然而,每种带有 alpha 通道的颜色只不过是颜色与其背景的混合。因此,如果知道背景,就可以计算出相应的非 alpha 颜色(参见 https://www.viget.com/articles/equating-color-and-transparency/ )。

下面的解决方案假设,实际的透明度对于这个数字来说不是必需的。如果一个人在图中使用真正的 alpha 和一个自己的颜色图,如果需要的话,可以计算出非 alpha 颜色值。

 import numpy as np
import matplotlib.pylab as pl
from matplotlib.colors import ListedColormap

# Random data
data1 = np.random.random((4,4))

# Choose colormap which will be mixed with the alpha values
cmap = pl.cm.RdBu

# Get the colormap colors
my_cmap = cmap(np.arange(cmap.N))
# Define the alphas in the range from 0 to 1
alphas = np.linspace(0, 1, cmap.N)
# Define the background as white
BG = np.asarray([1., 1., 1.,])
# Mix the colors with the background
for i in range(cmap.N):
    my_cmap[i,:-1] = my_cmap[i,:-1] * alphas[i] + BG * (1.-alphas[i])
# Create new colormap which mimics the alpha values
my_cmap = ListedColormap(my_cmap)

# Plot
f, axs = pl.subplots(1,2, figsize=(8,3))
h = axs[0].pcolormesh(data1, cmap=pl.cm.RdBu)
cb = f.colorbar(h, ax=axs[0])

h = axs[1].pcolormesh(data1, cmap=my_cmap)
cb = pl.colorbar(h, ax=axs[1])
f.show()

图像无伪影

原文由 Tik0 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题