参数'c'和'cmap'在matplotlib散点图中的表现如何?

use*_*114 6 plot colors matplotlib python-3.x scikit-learn

对于pyplot.scatter(x,y,s,c ....)函数,

matplotlib文档指出:

c:颜色,序列或颜色序列,可选,默认值:'b'标记颜色.可能的值:

单色格式字符串.一系列长度为n的颜色规格.使用cmap和norm映射到颜色的n个数字序列.一个二维数组,其中行是RGB或RGBA.请注意,c不应该是单个数字RGB或RGBA序列,因为它与要进行颜色映射的值数组无法区分.如果要为所有点指定相同的RGB或RGBA值,请使用具有单行的二维数组.

但是我不明白我如何根据自己的意愿改变数据点的颜色.

我有这段代码:

import matplotlib.pyplot as plt
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model
import matplotlib


%matplotlib inline
matplotlib.rcParams['figure.figsize'] = (13.0, 9.0)

# Generate a dataset and plot it
np.random.seed(0)
X, y = sklearn.datasets.make_moons(200, noise=0.55)
print(y)
plt.scatter(X[:,0], X[:,1], c=y)#, cmap=plt.cm.Spectral)
Run Code Online (Sandbox Code Playgroud)

输出图

如果我愿意,我怎样才能改变颜色以设想黑色和绿色数据点?或者是其他东西 ?另外请解释一下cmap究竟是做什么的.

为什么每次使用plt.cm.Spectral时我的阴影都是洋红色和蓝色?

Imp*_*est 14

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

1.外部映射

可在外部映射值到颜色,并提供这些颜色的列表/阵列到scatterc参数.

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

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)))
Run Code Online (Sandbox Code Playgroud)

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

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

A scatter创建一个PathCollection子类ScalarMappable.A ScalarMappable由颜色映射,规范化和值数组组成.因此,上述内容是通过

plt.scatter(x,y, c=z, norm=norm, cmap=cmap)
Run Code Online (Sandbox Code Playgroud)

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

plt.scatter(x,y, c=z, cmap=cmap)
Run Code Online (Sandbox Code Playgroud)

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

回到映射数组01黑色和绿色的要求, 您现在可以查看matplotlib提供的色彩映射,并查找包含黑色和绿色的色彩映射.例如nipy_spectral色彩图

在此输入图像描述

黑色位于色彩图的开头,绿色位于中间的某个位置,比如说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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

matplotlib.colors.ListedColormap(["black", "green"])
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述