4

如果我在 matplotlib 中有一个散点图,它返回一个 CircleCollection:

coll = plt.scatter(rand(5), rand(5), c="k")

如何重置特定点的颜色?我注意到这coll是不可迭代的。我只想更改已绘制点的面/边缘颜色,尽管它们已经从初始plt.scatter调用中设置了颜色。如何才能做到这一点?

例如:只需更改绘制的第二个点的颜色,例如:

coll[1].set_color("r") # this does not work, coll not indexable this way

我知道我可以将颜色向量传递给c=inscatter但我想稍后有意地重置这些点,因为在plt.scatter最初调用时,所有点的颜色都不知道。

编辑:进一步解释。我正在寻找根据不同条件为散点图着色的最简单方法。ifpoints是一个二维数组,你用 绘制它scatter(points[:, 0], points[:, 1], c-"k"),以后根据某些条件方便,例如

# replot certain points in red with alpha
selected = points[:, 0] > 0.5
plt.scatter(selected[:, 0], selected[:, 1], c="r", alpha=0.5)

在这里,我重新绘制了旧点,但这很混乱,因为新点是用 alpha 绘制的,所以它不会产生预期的效果。根据哪些点必须重新着色的各种条件可能很复杂,并且发生的时间晚于进行初始散布时,因此仅能够更改现有点的颜色而不是根据拆分点很方便根据条件并分别绘制它们。

4

3 回答 3

3

这对我有用。可能您需要plt.draw在(或代替)之前调用fig.show

coll = plt.scatter(rand(5), rand(5), c="k")
fig = plt.gcf()
fig.show()  # or fig.savefig("a.png")

coll.set_color(['b', 'g', 'r', 'y', 'k'])
fig.show()  # or fig.savefig("b.png")

更新

这是如何部分修改颜色。如果在调用时使用单一颜色,则需要colors显式扩展数组scatter

num = 5
coll = plt.scatter(rand(num), rand(num), c='k')
# coll = plt.scatter(rand(num), rand(num), c=['b', 'g', 'r', 'y', 'k'])
fig = plt.gcf()
fig.show()

colors = coll.get_facecolor()
if colors.shape[0] == 1:
    newcolors = np.tile(colors, (num, 1))
else:
    newcolors = colors
newcolors[0] = [0, 0.75, 0.75, 1]
coll.set_color(newcolors)
于 2012-08-08T15:59:00.840 回答
2

当您调用时scatter,将每个点传递一个颜色,然后您可以_facecolors直接更改 ndarray。

from matplotlib import pyplot as plt
from matplotlib.collections import PathCollection
from numpy.random import rand
x = rand(5)
y = rand(5)
coll = plt.scatter(x, y, c=["k"]*len(x)) # must set color for every point
coll._facecolors[2,:] = (1, 0, 0, 1)
plt.show()
于 2012-08-09T00:38:32.277 回答
1

您需要使用单独的列表:

plt.scatter(x1, y1, c='b')
plt.scatter(x2, y2, c='k')

看看这个

您还可以在 c 中创建一个与 x 和 y 长度相同的列表。

于 2012-08-08T14:46:18.497 回答