python - 长度为 4 的数组的 Matplotlib 颜色映射错误

标签 python numpy matplotlib colormap

我有一些数组需要用特定的颜色图在循环中绘制。但是,我的一个数组长度为 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 元组的每个元素应用于数组的每个值。对于其他长度数组,行为是预期的。

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

最佳答案

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

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 channel 。正如@ali_m 在评论中指出的那样,matplotlib.colors.rgb2hex 函数让这一切变得简单。如果您知道颜色的 alpha channel 始终为 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()

关于python - 长度为 4 的数组的 Matplotlib 颜色映射错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33380119/

相关文章:

python - del 语句会打开内存吗?

python - 我应该如何将包注册到 PyPI?

python - 如何在直方图 bin 中获取数据

python - Cartopy 范围问题 (free() : invalid size)

python - Gunicorn 无法连接到套接字错误 [在 vagrant 中运行]

python - 从列表和字典创建新元组

python - 给定 x,y 平面中的 MxN 网格,计算 f(x,y) 并将其存储到矩阵中(python)

python - 二维多边形的交集

numpy - 如何只显示meshgrid的网格

python - 如何将 Flask 端口从容器发布到主机