Matplotlib:散点图使用colormaps来设置edgecolor但不设置facecolor

11

我想要绘制散点图,使用colormap来设置边缘颜色但不使用面部填充。当我使用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()

有什么解决办法吗?

3个回答

12
c 参数将同时影响面颜色和边框颜色,因此参数 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()

这里输入图片描述


2
这个解决方案比我的更优雅。 - Diziet Asahi
我认为这要看情况而定:使用 set_facecolor 设置面颜色的解决方案实际上允许使用颜色图。当更改数据时,例如在动画中,而不必重新标准化颜色时,这将具有优势。对于通常的情况,我认为这两个解决方案都同样好。 - ImportanceOfBeingErnest
感谢两位的回答! - Mohamad Moosavi

7
问题在于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()

enter image description here


如果答案解决了您的问题,请考虑点击答案旁边的复选标记(无论哪个答案都可以)以关闭该问题。 - Diziet Asahi
提议的解决方案对我没有起作用,但是进行了一些小修改:默认散点图似乎没有边缘颜色,所以我必须执行以下操作:a.set_edgecolors(sc.get_facecolors()); a.set_facecolor('none')即首先将边缘颜色设置为面颜色。 - keflavich

0

我知道这个问题已经死了一段时间了,但是我想分享我的经验,因为我刚遇到了同样的问题。

我更喜欢Diziet的方法,将PathCollection对象传递给colorbar,并使其与散点图中使用的cmap匹配,这样做的效果与不修改facecolors时完全相同。

然而,对于接受的解决方案,我遇到了一些奇怪的行为,在从ax.scatter调用中删除cmap参数后,散点图边缘的colormap和colorbar的colormap仍然不匹配。


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