【问题标题】:resetting points of an already plotted scatter in matplotlib在 matplotlib 中重置已绘制散点的点
【发布时间】:2012-08-08 14:35:31
【问题描述】:

如果我在 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

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

edit:进一步解释。我正在寻找基于不同条件为散点图着色的最简单方法。如果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 绘制的,所以它不会产生预期的效果。根据哪些点必须重新着色的各种条件可能很复杂,并且发生的时间晚于进行初始散布时,因此仅能够更改现有点的颜色而不是根据拆分点很方便根据条件并分别绘制它们。

【问题讨论】:

    标签: python numpy matplotlib scipy


    【解决方案1】:

    这对我有用。可能您需要在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
    • 我更新了答案。阅读plt.scatter 的文档,了解set_color 的参数如何根据其形状进行处理。
    【解决方案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()
    

    【讨论】:

      【解决方案3】:

      您需要使用单独的列表:

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

      this

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

      【讨论】:

      • 没有单独的列表就没有办法做到这一点吗?在绘制所有点时我不一定知道哪些点会被着色
      • 您可以使用 c 的列表代替字母,并在重做图表之前一一更改。
      • 对,但这意味着我必须在初始调用 scatter 之前完成所有颜色的计算,不是吗?
      • 您可以在组更改后重做图表。我没有尝试用不同的颜色重新绘制一个点。
      猜你喜欢
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2021-10-14
      • 2023-03-13
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多