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

时间:2017-09-07 10:53:35

标签: python matplotlib plot colors 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]])

并且它们被“分类”或标记。这意味着我有一个列表

    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中的每个点指定不同的颜色,因此这种颜色将与每个类相对应。这基本上意味着extraPoints[0]与班级0相关联,extraPoints[1]与班级1相关联,extraPoints[2]与班级2相关联。< / p>

另外,我想在points中分散绘制点。请记住,points中的每个点都与labels中的相关标签相关联。 例如,[ 7.35906037, 6.50049804]位于类2中,因此具有相同的extraPoints[2] = [ 9.79796593, 3.39432552]颜色。同样,[ 3.21883403, 3.81452312]中的points点与0中的类labels相关联,因此具有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)))

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

勇敢的额外

鉴于此背景,想象一下我还有一些值

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

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

我想做上面的情节,但颜色会有一个“渐变”,例如,对于较小的值会变亮,对于较大的值会变暗(或相反)。我怎样才能做到这一点?我读到了有关色彩映射的内容,但我无法将其与我的问题完全整合。

示例

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

如你所见,我无法控制颜色。不仅如此,我还不知道在哪个班级中哪个点(除非我回去并手动查看每个点,但显然我不想要这个)。这就是为什么(以及我在此不介绍的其他原因)我想根据values中的值为它们着色。具体来说,我想说,有一系列值[10, 20 30]可以指导我的点的颜色,以便我知道哪个类是“最强”

2 个答案:

答案 0 :(得分:1)

第一个问题:代码没有运行,因为np.random.uniform(0,10, size = 3)给出了1D数组,而你以后期望它是2D(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()

enter image description here

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

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

答案 1 :(得分:0)

感谢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中的点确定1}}正在使用{{1}}中的值的强度和顺序着色。