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

7

背景

我有一些要点。

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

他们被“分类”或标记。这意味着我有一个列表。
    labels = np.random.randint(0,3, size = 10)
  # array([2, 0, 1, 2, 2, 1, 1, 0, 1, 2])

这代表了points中每个点的标签(按顺序)。

我还有一些额外的点。

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

基本上,这些点中的每一个都确定了类标签。它如何确定标签并不重要。但你需要知道的是,每个额外的点都与一个且仅一个标签相关联。因此,额外的点的数量与标签的可能性相等。
问题:
我想做一个散点图。我想为extraPoints中的每个点分配不同的颜色,因此这种颜色将对应于每个类。这基本上意味着extraPoints [0]与类0相关联,extraPoints [1]与类1相关联,extraPoints [2]与类2相关联。
此外,我想在points中散点绘制点。请记住,points中的每个点都与labels中的相应标签相关联。例如,[7.35906037,6.50049804]在类2中,因此具有与extraPoints [2] = [9.79796593,3.39432552]相同的颜色。同样,points中的点[3.21883403,3.81452312]与labels中的类0相关联,因此具有与extraPoints [0] = [1.91211141,3.71208978]相同的颜色。
我的尝试:
我尝试使用plt.scatter()中的c参数,但我不太理解它的工作原理,有时它似乎有效,有时它会说“无效的RGBA参数0.0”,但似乎是任意的。
请注意,为了区分points和extraPoints,我将使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)))

正如你可以自己尝试的那样,对于不同的执行(因为每次我们都有随机数组),我们可能会做到正确(或几乎正确),或者得到标题中的错误。为什么会发生这种情况?

额外-对于勇敢的人

在这种情况下,想象一下我还有一些值。

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

我有与标签和额外点类型相同数量的值(即在这种情况下为3)。现在每个值都与相应的额外点相关联。因此,第一个值对应第一个额外点,以此类推。

我想制作上面的图,但颜色将具有“渐变”,例如,较小的值会变得更浅,较大的值则变得更暗(或反之亦然)。我该怎么做?我了解过颜色映射,但无法将其与我的问题完全整合。

示例

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

正如您所看到的,我无法控制颜色。不仅如此,而且我不知道哪个点属于哪个类别(除非我返回并手动查看每个点,但显然我不想这样做)。这就是为什么(以及其他原因,我不会在此处涉及)我希望根据values中的值对它们进行着色。具体来说,我想要一个值范围[10, 20, 30],以指导我的点的颜色,以便我知道哪个类别“最强”。

2个回答

6
< p > 第一个问题:代码无法运行,因为 np.random.uniform(0,10,size = 3)给出了1D数组,而您后来期望它是2D(extraPoints [:,0] )。

第二个问题标签可以有1到3个唯一的条目,因此np.unique(labels)的长度可能为1到3(例如标签可能全部为零,使得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()

在此输入图片描述

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

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()

enter image description here


对于第二个问题,我可以使用 c = np.arange(len(extraPoints)) - Euler_Salter
1
我猜唯一剩下的问题是得到一个颜色映射和一个颜色条?如果是这样,请参见更新的答案。 - ImportanceOfBeingErnest
您可以完全省略 colorscmap。然后会选择默认的颜色映射,我已经更新了答案,包括这种更简单的情况。 - ImportanceOfBeingErnest
1
我认为“颜色顺序混乱”不是一个充分的问题描述,至少我无法理解。我可以想象此时最好停止讨论。您应该在脑海中整理关于colormap和c参数的所有学习内容,然后用[mcve]提出一个新的明确问题。可能实际问题只是将[5,1,4]映射到[4,5,1,4,4,1,1,5,1,4],根据[2,0,1,2,2,1,1,0,1,2]进行排序,但这也值得一个新问题,因为它与matplotlib无关。 - ImportanceOfBeingErnest
使用负标签没有问题。问题更多的是是否有意义使用单个标签。 - ImportanceOfBeingErnest
显示剩余19条评论

0
感谢ImportanceOfBeingErnest的帮助,我成功解决了这个问题。我知道我的解释很差,但是我把它发布在这里,以便未来可能遇到同样问题的人看到:

ImportanceOfBeingErnest的解决方案

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()

我的插件可以做我想要的事情

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))
# CREATE VALUES
values = np.random.uniform(0,50, size=3)

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

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

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

plt.show()

不同之处在于,sc 中的颜色现在由 values 中的值按照 labels 的顺序确定,同时,extraPoints 中的点也会根据 values 中的强度和顺序进行着色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接