Matplotlib:带有边缘颜色颜色图但没有面部颜色的散点图
Matplotlib: scatter plot with colormaps for edgecolor but no facecolor
我想要一个散点图,其中包含边缘颜色的颜色图,但没有面颜色。
当我使用 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()
有什么解决办法吗?
参数c
会同时影响facecolor和edgecolor,参数facecolor
和edgecolor
因此被忽略。
一个解决方案是不要将 c
参数与颜色图一起使用,而是单独使用 facecolors
和 edgecolors
。在这种情况下 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()
问题是 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()
我知道这已经死了一段时间了,但我想补充一下我的经验,因为我刚遇到同样的问题。
我更喜欢 Diziet 的方法,因为将 PathCollection 对象传递给颜色栏并使其与散点图中使用的 cmap 匹配,就像您不更改面色一样。
然而,对于公认的解决方案,我遇到了一些奇怪的行为,即使在从 ax.scatter 调用中删除 cmap 参数后,散点图边缘颜色图和颜色条颜色图也不匹配。
我想要一个散点图,其中包含边缘颜色的颜色图,但没有面颜色。
当我使用 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()
有什么解决办法吗?
参数c
会同时影响facecolor和edgecolor,参数facecolor
和edgecolor
因此被忽略。
一个解决方案是不要将 c
参数与颜色图一起使用,而是单独使用 facecolors
和 edgecolors
。在这种情况下 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()
问题是 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()
我知道这已经死了一段时间了,但我想补充一下我的经验,因为我刚遇到同样的问题。
我更喜欢 Diziet 的方法,因为将 PathCollection 对象传递给颜色栏并使其与散点图中使用的 cmap 匹配,就像您不更改面色一样。
然而,对于公认的解决方案,我遇到了一些奇怪的行为,即使在从 ax.scatter 调用中删除 cmap 参数后,散点图边缘颜色图和颜色条颜色图也不匹配。