对于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)
输出图
如果我愿意,我怎样才能改变颜色以设想黑色和绿色数据点?或者是其他东西 ?另外请解释一下cmap究竟是做什么的.
为什么每次使用plt.cm.Spectral时我的阴影都是洋红色和蓝色?
1> ImportanceOf..:
关于如何着色散点的基本上有两种选择.
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
,使得色彩图提供两种最外面的颜色.
scatter
如果提供了数值数组,则此过程在内部发生c
.
A scatter
创建一个PathCollection
子类ScalarMappable
.A ScalarMappable
由颜色映射,规范化和值数组组成.因此,上述内容是通过
plt.scatter(x,y, c=z, norm=norm, cmap=cmap)
如果要将最小和最大数据用作规范化的限制,则可以保留该参数.
plt.scatter(x,y, c=z, cmap=cmap)
这就是问题中的输出始终是紫色和黄色点的原因,与提供的值无关c
.
回到映射数组0
和1
黑色和绿色的要求, 您现在可以查看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()
由于可能并不总是存在具有所需颜色的色彩图,并且因为从现有色彩图获得色彩位置可能不是直接的,所以替代方案是专门为所需目的创建新的色彩图.
在这里,我们可以简单地创建一个黑色和绿色两种颜色的色彩映射.
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()