关于如何着色散点的基本上有两种选择.

1.外部映射

您可以在外部将值映射到颜色,并将这些颜色的列表/数组提供给scatter的c参数.

z = np.array([1,0,1,0,1])
colors = np.array(["black", "green"])
plt.scatter(x,y, c=colors[z])

2.内部映射

除了显式颜色外,还可以提供值列表/数组,这些值应根据规范化和色彩映射映射到颜色.

> colormap是一个可调用的,它将浮点值介于0和1之间作为输入并返回RGB颜色.

>规范化是一种可调用的,它根据一些先前设置的限制将任意数字作为输入并输出另一个数字. Normalize的通常情况是提供vmin和vmax之间的值到0和1之间的线性映射.

从某些数据中获取颜色的自然方法是将两者联系起来,

cmap = plt.cm.Spectral
norm = plt.Normalize(vmin=4, vmax=5)
z = np.array([4,4,5,4,5])
plt.scatter(x,y, c = cmap(norm(z)))

这里,4的值将通过归一化映射到0,并且5的值被映射到1,使得色彩图提供两种最外面的颜色.

如果向c提供了数值的数组,则此过程在散布内部发生.

散点图创建一个PathCollection,它是ScalarMappable的子类. ScalarMappable由一个colormap,一个规范化和一个值数组组成.因此,上述内容是通过

plt.scatter(x,y, c=z, norm=norm, cmap=cmap)

如果要将最小和最大数据用作规范化的限制,则可以保留该参数.

plt.scatter(x,y, c=z, cmap=cmap)

这就是问题中输出始终为紫色和黄色点的原因,与提供给c的值无关.

回到将0和1数组映射到黑色和绿色的要求,您现在可以查看colormaps provided by matplotlib并查找包含黑色和绿色的色彩映射.例如. nipy_spectral colormap


这里的黑色位于色彩图的开头,绿色位于中间的某个位置,比如0.5.因此,需要将vmin设置为0和vmax,使得vmax * 0.5 = 1(将值映射为绿色为1),即vmax = 1./0.5 == 2.

import matplotlib.pyplot as plt
import numpy as np
x,y = np.random.rand(2,6)
z = np.array([0,0,1,1,0,1])
plt.scatter(x,y, c = z,
norm = plt.Normalize(vmin=0, vmax=2),
cmap = "nipy_spectral")
plt.show()


由于可能并不总是存在具有所需颜色的色彩图,并且因为从现有色彩图获得色彩位置可能不是直接的,所以替代方案是专门为所需目的创建新的色彩图.

在这里,我们可以简单地创建一个黑色和绿色两种颜色的色彩映射.

matplotlib.colors.ListedColormap(["black", "green"])

我们这里不需要任何规范化,因为我们只有两个值,因此可以依赖于自动规范化.

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
x,y = np.random.rand(2,6)
z = np.array([0,0,1,1,0,1])
plt.scatter(x,y, c = z, cmap = mcolors.ListedColormap(["black", "green"]))
plt.show()