【问题标题】:Matplotlib: scatter plot with colormaps for edgecolor but no facecolorMatplotlib:带有颜色图的散点图,用于边缘颜色但没有面颜色
【发布时间】:2017-09-17 01:35:24
【问题描述】:

我想要一个散点图,其中包含边缘颜色的颜色图,但没有面颜色。 当我使用facecolor='None' 时,它不起作用。

import numpy as np
import matplotlib.pyplot as plt


N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2  # 0 to 15 point radii

plt.scatter(x, y, s=area,c=colors,facecolors='None',cmap="gist_rainbow", alpha=0.5)
plt.show()

有什么办法吗?

【问题讨论】:

    标签: matplotlib scatter-plot


    【解决方案1】:

    c 参数会同时影响 facecolor 和 edgecolor,facecoloredgecolor 参数因此被忽略。

    解决方案是不要将c 参数与颜色图一起使用,而是单独使用facecolorsedgecolors。在这种情况下,facecolors 可以设置为"None",并且edgecolors 可以给出要使用的颜色列表。

    要创建此列表,可以应用相同的颜色图。

    c = plt.cm.gist_rainbow(colors)
    plt.scatter(x, y, s=area,facecolors="None", edgecolors=c, lw=1,alpha=0.5)
    

    一个完整的例子:

    import numpy as np
    import matplotlib.pyplot as plt
    
    N = 50
    x = np.random.rand(N)
    y = np.random.rand(N)
    colors = np.random.rand(N)
    area = np.pi * (15 * np.random.rand(N))**2  # 0 to 15 point radii
    
    c = plt.cm.gist_rainbow(colors)
    plt.scatter(x, y, s=area,facecolors="None", edgecolors=c, lw=2,alpha=0.5)
    plt.show()
    

    【讨论】:

    • 这个解决方案比我的更优雅
    • 我认为这取决于:使用 set_facecolor 设置 facecolor 的解决方案实际上允许使用颜色图。这在更改数据时会有优势,例如在动画中,不重新命名颜色。对于通常的情况,我想说,两种解决方案都一样好。
    • 感谢您的两个回答!
    【解决方案2】:

    问题在于color= 覆盖了facecolors= 参数。

    我想出的解决办法是得到pyplot.scatter()返回的PathCollection,然后直接改facecolor。请注意,您可能需要增加线宽才能更好地看到边缘。

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    N = 50
    x = np.random.rand(N)
    y = np.random.rand(N)
    colors = np.random.rand(N)
    area = np.pi * (15 * np.random.rand(N))**2  # 0 to 15 point radii
    
    a = plt.scatter(x, y, s=area,c=colors,facecolor='none',lw=2,cmap="gist_rainbow", alpha=0.5)
    a.set_facecolor('none')
    plt.show()
    

    【讨论】:

    • 如果答案已经解决了您的问题,请考虑通过单击答案旁边的复选标记(无论您喜欢哪个)来关闭该问题。
    【解决方案3】:

    我知道这已经死了一段时间,但我想补充一下我的经验,因为我刚刚遇到了同样的问题。

    我更喜欢 Diziet 的方法,因为将 PathCollection 对象传递给颜色条并使其与散点图中使用的 cmap 匹配,其工作方式与不更改面部颜色时完全一样。

    但是,使用已接受的解决方案,我遇到了一些奇怪的行为,即使在从 ax.scatter 中删除 cmap 参数后,调用散点图边缘颜色图和颜色条颜色图也不匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2014-09-10
      • 2012-02-12
      • 2021-07-28
      • 2011-07-26
      • 2011-08-29
      • 2016-05-20
      相关资源
      最近更新 更多