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

时间:2018-08-31 04:43:38

标签: python-3.x matplotlib plot colors scikit-learn

对于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)

the output plot

如果愿意,如何更改颜色以设置黑色和绿色数据点?或者是其他东西 ?另外,请解释一下cmap的功能。

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

2 个答案:

答案 0 :(得分:7)

关于如何为散射点着色,基本上有两个选择。

1。外部映射

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

c

2。内部映射

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

  • z = np.array([1,0,1,0,1]) colors = np.array(["black", "green"]) plt.scatter(x,y, c=colors[z]) 是可调用的,它以colormap0.之间的浮点值作为输入并返回RGB颜色。
  • 归一化是可调用的,可以根据一些先前设置的限制将任何数字用作输入并输出另一个数字。 1.的通常情况是提供Normalizevmin之间的值到vmax0.之间的范围的线性映射。

从某些数据获取颜色的自然方法是将两者链接在一起,

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,该子类PathCollectionScalarMappable由一个颜色图,一个规范化和一个值数组组成。因此,以上通过

ScalarMappable

如果将最小和最大数据用作规范化的限制,则可以忽略该参数。

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

这是问题中的输出将始终为紫色和黄色点的原因,而与提供给plt.scatter(x,y, c=z, cmap=cmap) 的值无关。

回到将c0的数组映射到黑色和绿色的要求之后,现在可以看一下colormaps provided by matplotlib并查找包含黑色和绿色的色图。 。例如。 1色彩图

enter image description here

这里黑色是在颜色图的开头,绿色是在中间的某个地方,例如nipy_spectral。因此,需要将0.5设置为0,然后将vmin设置为vmax(将vmax*0.5 = 1的值映射为绿色),即1

vmax = 1./0.5 == 2

enter image description here

由于可能并不总是存在具有所需颜色可用的颜色图,并且由于可能无法直接从现有颜色图中获取颜色位置,因此一种替代方法是专门为所需目的创建新的颜色图。

在这里,我们可以简单地创建黑色和绿色两种颜色的颜色图。

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"])

enter image description here

答案 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

enter image description here

对于介于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中的cmapplt.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)])

输出:

enter image description here

仔细检查代码中的注释和点的位置以及颜色,以彻底理解。

您还可以在案例3的代码中用c替换参数color,结果仍然相同。