在Matplotlib中重置已绘制散点图的点。

4
如果我在matplotlib中有一个散点图,返回一个CircleCollection:
coll = plt.scatter(rand(5), rand(5), c="k")
如何重置特定点的颜色?我注意到coll不可迭代。我想修改已绘制点的面/边缘颜色,尽管它们已经从最初的plt.scatter调用中设置了颜色。这该怎么做?
例如:只需更改第二个绘制的点的颜色,例如:
coll[1].set_color("r") # 这样不起作用,coll无法按照索引进行访问
我知道我可以在scatter中传递颜色向量给c=,但是我想故意稍后重置点,因为在最初调用plt.scatter时,并不知道所有点的颜色。
编辑:进一步解释。 我正在寻找根据不同条件对散点进行着色的最简单方法。 如果points是一个二维数组,并且您使用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绘制,所以不会产生预期的效果。根据需要对点进行重新着色的各种条件可能很复杂,并且比初始散点图制作时晚发生,因此更方便的方法是只能更改现有点的颜色,而不是根据条件将点分开并单独绘制它们。

3个回答

3
这对我有效。也许你需要在调用fig.show之前(或者替换为)plt.draw
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")

更新

这是部分修改颜色的方法。如果在调用scatter时只使用单一颜色,那么您需要显式地扩展colors数组。

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)

为什么先获取点的颜色向量,然后再设置它,如:colors = coll.get_facecolors()[0],然后修改 colors 并将其传递给 set_color 不起作用? - user248237
жҲ‘жӣҙж–°дәҶзӯ”жЎҲгҖӮйҳ…иҜ»plt.scatterж–ҮжЎЈпјҢд»ҘдәҶи§Јset_colorеҸӮж•°еҰӮдҪ•ж №жҚ®е…¶еҪўзҠ¶иҝӣиЎҢеӨ„зҗҶгҖӮ - tkf

2
当你调用scatter函数时,请为每个点传递一种颜色,然后可以直接更改_facecolors多维数组。
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()

1

您需要使用单独的列表:

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

看看this

你也可以在C语言中拥有与x和y相同长度的列表。


有没有不用分开列表的方法来做到这一点?在绘制所有点的时候,我并不一定知道哪些点会被着色。 - user248237
你可以使用一个列表来代替一个字母,在重新绘制图形之前逐一更改它们。 - f p
对,但这意味着在调用scatter之前必须完成所有颜色的计算,是吗? - user248237
你可以在一组更改后重新绘制图形。我还没有尝试用不同的颜色重新绘制一个点。 - f p

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