Python:根据类,无效的RGBA参数0.0个色点

Eul*_*ter 6 python plot colors matplotlib colormap

语境

我有几点

 points = np.random.uniform(0,10, size = (10,2))
# array([[ 7.35906037,  6.50049804],
       [ 3.21883403,  3.81452312],
       [ 3.52107154,  1.68233797],
       [ 1.47699577,  6.01692348],
       [ 3.76051589,  0.25213394],
       [ 8.93701081,  5.20377479],
       [ 6.5347188 ,  2.12940006],
       [ 3.62550069,  5.80619507],
       [ 1.33393325,  5.0088937 ],
       [ 6.99034593,  7.40277623]])
Run Code Online (Sandbox Code Playgroud)

并对其进行“分类”或标记。这意味着我有一个清单

    labels = np.random.randint(0,3, size = 10)
  # array([2, 0, 1, 2, 2, 1, 1, 0, 1, 2])
Run Code Online (Sandbox Code Playgroud)

它代表中每个点的标签(按顺序)points

我也有一些要点

    extraPoints = np.random.uniform(0,10, size = (3,2))
# array([[ 1.91211141,  3.71208978],
#   [ 8.10463536,  1.88948511],
#   [ 9.79796593,  3.39432552]])
Run Code Online (Sandbox Code Playgroud)

基本上,这些要点都决定了类别标签。确定标签的方式无关紧要。但是您只需要知道,这些额外的点中的每一个都与一个且仅一个标签相关联。因此,存在相同数量的extraPoints和标签可能性。

问题

我想做一个散点图。我想为中的每个点分配不同的颜色extraPoints,因此该颜色将与每个类相对应。这基本上意味着extraPoints[0]与类相关联0extraPoints[1]与类相关联1,并extraPoints[2]与类别相关联2

另外,我想散布图中的点points。请记住,中的每个点points都与中的相应标签相关联labels。例如[ 7.35906037, 6.50049804],在类别中2,因此具有的相同颜色extraPoints[2] = [ 9.79796593, 3.39432552]。类似地,点[ 3.21883403, 3.81452312]points与类相关联0labels并因此具有相同的颜色extraPoints[0] = [ 1.91211141, 3.71208978]

我的尝试

我尝试使用该c参数,plt.scatter()但是我不太了解它是如何工作的,有时它会起作用,有时会显示“无效的RGBA参数0.0”,但似乎是任意的。

注意区分pointsextraPoints,我会做extraPoints更大的和更透明。

import matplotlib.pyplot as plt
# I scatter the points, and assign c to labels. So hopefully each
# point that ends up in the same label will have the same 
# color? I  think this part is fine, although I am not sure
plt.scatter(points[:,0], points[:,1], c = labels) 
plt.scatter(extraPoints[:,0], extraPoints[:,1], s = 100, alpha = 0.3, c = np.arange(len(extraPoints)))
Run Code Online (Sandbox Code Playgroud)

正如您可以自己尝试的那样,对于不同的执行(由于每次我们都有随机数组),我们要么正确(或几乎正确),要么标题出现错误。为什么会这样?

额外的勇敢

在这种情况下,想象一下我也有一些价值观

    values = np.random.uniform(0,50, size = 3)
# array([ 14.63459424,  37.41573654,  34.45202082])
Run Code Online (Sandbox Code Playgroud)

我具有与标签和extraPoints类型相同的值数(在本例中为3)。现在,这些都与相应的ExtraPoints相关联。因此,第一个值到第一个extraPoint,依此类推。

我想进行上述绘制,但是颜色将具有“渐变”,例如,对于较小的值,颜色变浅,对于较大的值,颜色变深(或相反)。我怎样才能做到这一点?我读过关于颜色图的信息,但是我不能完全将其与问题整合在一起。

例如,对于上述值,我们获得: 分散

如您所见,我无法控制颜色。不仅如此,我也不知道哪个课在哪个课上(除非我回过头来手动查看每个课,但是显然我不希望这样)。这就是为什么(以及我在此不介绍的其他原因)我要根据中的值为它们上色的原因values。具体来说,我想说一个值范围[10, 20 30]可以指导我的观点的色彩,以便我知道哪个班级“最强”

Imp*_*est 6

第一个问题:代码无法运行,因为np.random.uniform(0,10, size = 3)给出了一个一维数组,而您稍后期望它是二维 ( extraPoints[:,0])。

第二个问题labels可能有 1 到 3 个唯一条目,因此np.unique(labels)长度可能为 1 到 3(例如labels可能全为零,这样np.unique(labels) == [0]),这样您的点数多于颜色数。但是c需要一个单一的颜色参数或一个与输入坐标长度相同的值列表。

第三个问题:如果提供长度为 3 或 4 的列表或数组,则不清楚这应该是单个 RGB 或 RGBA 颜色还是颜色映射的值列表。如果你真的遇到这个问题,在你解决第一和第二个问题之前不能肯定地说。

更新:解决前两个问题后,您可能只是在寻找颜色条和有用的颜色图。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

points = np.random.uniform(0,10, size = (10,2))

labels = np.random.randint(0,3, size = 10)

extraPoints = np.random.uniform(0,10, size = (3,2))

sc = plt.scatter(points[:,0], points[:,1], c = labels) 
sc2 = plt.scatter(extraPoints[:,0], extraPoints[:,1], s = 144, alpha = 0.7, 
            c = np.arange(len(extraPoints)))

plt.colorbar(sc)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

或者,如果您想拥有单独的颜色:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

points = np.random.uniform(0,10, size = (10,2))

labels = np.random.randint(0,3, size = 10)

extraPoints = np.random.uniform(0,10, size = (3,2))

colors=["red", "gold", "limegreen"]
cmap = matplotlib.colors.ListedColormap(colors)

sc = plt.scatter(points[:,0], points[:,1], c = labels, cmap=cmap, vmin=-0.5,vmax=2.5 ) 
sc2 = plt.scatter(extraPoints[:,0], extraPoints[:,1], s = 144, alpha = 0.7, 
            c = np.arange(len(extraPoints)), cmap=cmap, vmin=-0.5,vmax=2.5)

plt.colorbar(sc, ticks=np.arange(len(extraPoints)))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明