Matplotlib:带有colorcolor的散点图,用于edgecolor但没有facecolor

时间:2017-04-20 12:11:32

标签: matplotlib scatter-plot

我希望有一个带有色彩图的散点图,用于边框颜色,但没有面色。 当我使用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 个答案:

答案 0 :(得分:5)

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()

enter image description here

答案 1 :(得分:4)

问题是color=会覆盖facecolors=参数。

我想出的解决方案是获取PathCollection返回的pyplot.scatter(),然后直接更改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

答案 2 :(得分:0)

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

我更喜欢 Diziet 的方法,因为将 PathCollection 对象传递给颜色条并使其与散点图中使用的 cmap 匹配,这与您不更改面颜色的情况完全相同。

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