对于pyplot.scatter(x,y,s,c ....)函数,
matplotlib文档指出:
c:颜色,颜色序列或颜色序列,可选,默认值:'b' 标记颜色。可能的值:
单一颜色格式的字符串。一系列的颜色规格 长度使用cmap映射到颜色的n个数字序列 和规范。二维数组,其中行是RGB或RGBA。注意,c 不应为单个数字RGB或RGBA序列,因为这是 与要映射颜色的值数组无法区分。如果你 想要为所有点指定相同的RGB或RGBA值,请使用2-D 单行的数组。
但是我不明白如何根据需要更改数据点的颜色 。
我有这段代码:
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时我的图都是洋红色和蓝色的?
答案 0 :(得分:7)
关于如何为散射点着色,基本上有两个选择。
您可以在外部将值映射到颜色,并将这些颜色的列表/数组提供给scatter
的{{1}}参数。
c
除显式颜色外,还可以提供值的列表/数组,这些值应根据规范化和颜色图映射到颜色。
z = np.array([1,0,1,0,1])
colors = np.array(["black", "green"])
plt.scatter(x,y, c=colors[z])
是可调用的,它以colormap
和0.
之间的浮点值作为输入并返回RGB颜色。1.
的通常情况是提供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
的数组映射到黑色和绿色的要求之后,现在可以看一下colormaps provided by matplotlib并查找包含黑色和绿色的色图。 。例如。 1
色彩图
这里黑色是在颜色图的开头,绿色是在中间的某个地方,例如nipy_spectral
。因此,需要将0.5
设置为0,然后将vmin
设置为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"])
答案 1 :(得分:1)
首先,要根据y
中的值设置颜色,您可以执行以下操作:
color = ['red' if i==0 else 'green' for i in y]
plt.scatter(X[:,0], X[:,1], c=color)
现在谈论scatter()
和cmap
。
ColorMap用于从浮点值提供颜色。参见this documentation for reference on colormaps。
对于介于0到1之间的值,从这些颜色图中选择一种颜色。
例如:
plt.cm.Spectral(0.0)
# (0.6196078431372549, 0.00392156862745098, 0.25882352941176473, 1.0) #<== magenta
plt.cm.Spectral(1.0)
# (0.3686274509803922, 0.30980392156862746, 0.6352941176470588, 1.0) #<== blue
plt.cm.Spectral(1)
# (0.6280661284121491, 0.013302575932333718, 0.26082276047673975, 1.0)
请注意,上述代码中1.0和1的结果不同,因为int和float的处理方式与__call__()
here的文档中所述相同:
对于浮点数,X应该在
[0.0, 1.0]
区间内以返回 RGBA沿颜色图线的百分比为X*100
。对于整数,X应该在
[0, Colormap.N)
到 从索引为X
的Colormap返回已索引的RGBA值。
请查看此答案以获取有关颜色图的更好解释:-
在您的y中,您有0和1,因此使用了上面代码中显示的RGBA值(它们代表“光谱”颜色图的两端)。
现在,这是c
中的cmap
和plt.scatter()
参数如何相互作用的方法。
_______________________________________________________________________
|No | type of x, y | c type | values in c | result |
|___|______________|__________|_____________|___________________________|
|1 | single | scalar | numbers | cmap(0.0), no matter |
| | point | | | what the value in c |
|___|______________|__________|_____________|___________________________|
|2 | array of | array | numbers | normalize the values in c,|
| | points | | | cmap(normalized val in c) |
|___|______________|__________|_____________|___________________________|
|3 | scalar or | scalar or| RGBA Values,| no use of cmap, |
| | array | array |Color Strings| use colors from c |
|___|______________|__________|_____________|___________________________|
现在,一旦确定了实际的颜色,就可以在x, y
中的每个点之间循环选择颜色。如果x,y的大小等于或小于c中颜色的大小,则可以得到完美的映射,否则将再次使用较旧的颜色。
下面是一个说明这一点的例子:
# Case 1 from above table
# All three points get the same color = plt.cm.Spectral(0)
plt.scatter(x=0.0, y=0.2, c=0, cmap=plt.cm.Spectral)
plt.scatter(x=0.0, y=0.3, c=1, cmap=plt.cm.Spectral)
plt.scatter(x=0.0, y=0.4, c=1.0, cmap=plt.cm.Spectral)
# Case 2 from above table
# The values in c are normalized
# highest value in c gets plt.cm.Spectral(1.0)
# lowest value in c gets plt.cm.Spectral(0.0)
# Others in between as per normalizing
# Size of arrays in x, y, and c must match here, else error is thrown
plt.scatter([0.1, 0.1, 0.1, 0.1, 0.1], [0.2, 0.3, 0.4, 0.5, 0.6],
c=[1, 2, 3, 4, 5], cmap=plt.cm.Spectral)
# Case 3 from above table => No use of cmap here,
# blue is assigned to the point
plt.scatter(x=0.2, y=0.3, c='b')
# You can also provide rgba tuple
plt.scatter(x=0.2, y=0.4, c=plt.cm.Spectral(0.0))
# Since a single point is present, the first color (green) is given
plt.scatter(x=0.2, y=0.5, c=['g', 'r'])
# Same color 'cyan' is assigned to all values
plt.scatter([0.3, 0.3, 0.3, 0.3, 0.3], [0.2, 0.3, 0.4, 0.5, 0.6],
c='c')
# Colors are cycled through points
# 4th point will get again first color
plt.scatter([0.4, 0.4, 0.4, 0.4, 0.4], [0.2, 0.3, 0.4, 0.5, 0.6],
c=['m', 'y', 'k'])
# Same way for rgba values
# Third point will get first color again
plt.scatter([0.5, 0.5, 0.5, 0.5, 0.5], [0.2, 0.3, 0.4, 0.5, 0.6],
c=[plt.cm.Spectral(0.0), plt.cm.Spectral(1.0)])
输出:
仔细检查代码中的注释和点的位置以及颜色,以彻底理解。
您还可以在案例3的代码中用c
替换参数color
,结果仍然相同。