Matplotlib colormap bug,长度为4的数组

时间:2015-10-27 23:11:25

标签: python numpy matplotlib colormap

我有一些数组需要在一个带有某个色彩映射的循环中绘制。但是,我的一个数组是length-4,我遇到了这个问题:

import numpy as np
import matplotlib as plt

ns = range(2,8)
cm = plt.cm.get_cmap('spectral')
cmap = [cm(1.*i/len(ns)) for i in range(len(ns))]
for i,n in enumerate(ns):
    x = np.linspace(0, 10, num=n)
    y = np.zeros(n) + i
    plt.scatter(x, y, c=cmap[i], edgecolor='none', s=50, label=n)
plt.legend(loc='lower left')
plt.show()

Imgur

对于n=4,看起来Matplotlib正在将cmap RGBA-tuple的每个元素应用于数组的每个值。对于其他长度数组,行为是预期的。

现在,我实际上有一个更复杂的代码,并且不想花时间重写循环。有解决方法吗?

1 个答案:

答案 0 :(得分:3)

看起来你在处理c参数时遇到了一个不幸的API设计。解决此问题的一种方法是使c数组的形状(len(x), 4)包含所需颜色的len(x)个副本。 E.g。

ns = range(2,8)
cm = plt.cm.get_cmap('spectral')
cmap = [cm(1.*i/len(ns)) for i in range(len(ns))]
for i,n in enumerate(ns):
    x = np.linspace(0, 10, num=n)
    y = np.zeros(n) + i
    c = np.tile(cmap[i], (len(x), 1))
    plt.scatter(x, y, c=c, edgecolor='none', s=50, label=n)
plt.legend(loc='lower left')
plt.show()

另一种方法是将RBG值转换为十六进制字符串,并使用alpha参数传递颜色的alpha通道。正如@ali_m在评论中指出的那样,函数matplotlib.colors.rgb2hex使这很容易。如果您知道颜色的Alpha通道始终为1.0,则可以删除创建alpha参数的代码。

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

ns = range(2,8)
cm = plt.cm.get_cmap('spectral')
cmap = [cm(1.*i/len(ns)) for i in range(len(ns))]
for i,n in enumerate(ns):
    x = np.linspace(0, 10, num=n)
    y = np.zeros(n) + i
    c = mpl.colors.rgb2hex(cmap[i])
    alpha = cmap[i][3]
    plt.scatter(x, y, c=c, edgecolor='none', s=50, label=n, alpha=alpha)
plt.legend(loc='lower left')
plt.show()