对于 pyplot.scatter(x,y,s,c....) 函数,
matplotlib 文档指出:
c : color, sequence, or sequence of color, optional, default: 'b' The marker color. Possible values:
A single color format string. A sequence of color specifications of length n. A sequence of n numbers to be mapped to colors using cmap and norm. A 2-D array in which the rows are RGB or RGBA. Note that c should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped. If you want to specify the same RGB or RGBA value for all points, use a 2-D array with a single row.
但是,我不明白如何按照我的意愿更改数据点的颜色 .
我有这段代码:
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)
the output plot
如果我愿意,如何更改颜色以假设黑色和绿色数据点?或者是其他东西 ?还请解释一下 cmap 到底是做什么的。
为什么每次使用 plt.cm.Spectral 时我的图都是洋红色和蓝色?
最佳答案
关于如何对散点进行着色,基本上有两种选择。
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
.一个
scatter
创建一个 PathCollection
, 子类 ScalarMappable
.一个 ScalarMappable
由颜色图、归一化和值数组组成。因此,上述内容通过内化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
颜色图这里黑色在颜色图的开头,绿色在中间的某个地方,比如
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()
关于python-3.x - 参数 'c' 和 'cmap' 在 matplotlib 散点图中的表现如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52108558/