我有一些数组需要在一个带有某个色彩映射的循环中绘制。但是,我的一个数组是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()
对于n=4
,看起来Matplotlib正在将cmap
RGBA-tuple的每个元素应用于数组的每个值。对于其他长度数组,行为是预期的。
现在,我实际上有一个更复杂的代码,并且不想花时间重写循环。有解决方法吗?
答案 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()