为自定义色彩映射实现alpha

时间:2017-01-14 21:50:25

标签: python matplotlib

我需要使用自定义色彩图绘制一组补丁。我已经得到了这个工作正常,但我不能正确地使用我的自定义色彩映射。正如你在图像和附加代码中看到的那样,alpha被应用于补丁,但是颜色条仍然显示alpha = 1使得地图"错误"。为了检查,我测试了带喷射,并且颜色条反映了正确的alpha。我假设在我定义我的颜色条的方式中缺少某些东西,但文档在找出什么内容时没有帮助......

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

x = np.random.rand(50,1)*500; y = np.random.rand(50,1)*500;
radius = np.random.rand(50,1)*50
patches = []
for i in range(len(radius)):
    circle = matplotlib.patches.Circle((x[i], y[i]), radius[i])
    patches.append(circle)
fig, ax = plt.subplots()
colors = 100*np.random.rand(len(patches))
p = matplotlib.collections.PatchCollection(patches)
p.set(array = colors, cmap = 'Spectral', alpha=0.5)
ax.add_collection(p)
plt.colorbar(p, alpha=0.5)
plt.xlim(0,500);plt.ylim(0,500);
plt.gca().set_aspect(1)
plt.show()

############
r = np.hstack((np.zeros(425),np.linspace(0,255,430), np.linspace(254,0,425)))
g = np.hstack((np.linspace(0,255,430), np.linspace(254,0,425), np.zeros(425)))
b = np.hstack((np.linspace(255,0,430), np.zeros(425),np.linspace(0,254,425)))
c = np.array([r,g,b]).T
mycm = matplotlib.colors.ListedColormap(c/255.0)
###########
x = np.random.rand(50,1)*500; y = np.random.rand(50,1)*500;
radius = np.random.rand(50,1)*50
patches = []
for i in range(len(radius)):
    circle = matplotlib.patches.Circle((x[i], y[i]), radius[i])
    patches.append(circle)
fig, ax = plt.subplots()
colors = 100*np.random.rand(len(patches))
p = matplotlib.collections.PatchCollection(patches)
p.set(array = colors, cmap = mycm, alpha=0.5)
ax.add_collection(p)
plt.colorbar(p, alpha=0.5)
plt.xlim(0,500);plt.ylim(0,500);
plt.gca().set_aspect(1)
plt.show()

plot made using jet plot made using my colormap

1 个答案:

答案 0 :(得分:0)

从第一个案例图片中可以看出,matplotlib在颜色条中的颜色之间添加了一些小线条。这些行来自用于生成颜色条的pcolormesh。我不知道为什么他们在那里,我也不知道如何摆脱它们,但这些线是没有正确显示alpha值问题的原因。 因为它们看起来比所示的真实颜色更暗,所以很明显,如果向颜色条添加越来越多的线条,则完整的颜色条将由这些线条组成,因此看起来更暗或更不透明。 这正是在第二种情况下所做的,其中使用具有430 + 425 + 425 = 1280值的ListedColormap

因此,解决方案是ListedColormap 中的颜色数量减少到255以下的值。在下面的示例代码中,我使用了90。

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
############
n= 30
r = np.hstack((np.zeros(n),np.linspace(0,255,n), np.linspace(254,0,n)))
g = np.hstack((np.linspace(0,255,n), np.linspace(254,0,n), np.zeros(n)))
b = np.hstack((np.linspace(255,0,n), np.zeros(n),np.linspace(0,254,n)))
c = np.array([r,g,b]).T
mycm = matplotlib.colors.ListedColormap(c/255.0)
###########
x = np.random.rand(50,1)*500; y = np.random.rand(50,1)*500;
radius = np.random.rand(50,1)*50
patches = []
for i in range(len(radius)):
    circle = matplotlib.patches.Circle((x[i], y[i]), radius[i])
    patches.append(circle)
fig, ax = plt.subplots()
colors = 100*np.random.rand(len(patches))
p = matplotlib.collections.PatchCollection(patches)
p.set(array = colors, cmap = mycm, alpha=0.5)
ax.add_collection(p)
plt.colorbar(p, alpha=0.5)
plt.xlim(0,500);plt.ylim(0,500);
plt.gca().set_aspect(1)
plt.savefig(__file__+".png")
plt.show()

enter image description here