Matplotlib:带有边缘颜色颜色图但没有面颜色的散点图

问题描述 投票:0回答:4

我想要一个带有边缘颜色颜色图但没有面部颜色的散点图。 当我使用

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
4个回答
12
投票

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

enter image description here


7
投票

问题在于

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


0
投票

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

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

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


0
投票

我想回答 nasgold,因为我已经找到并回答了颜色条。我混合了不同主题的答案来创建边缘颜色并为颜色栏检索它。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcb
import matplotlib.cm as cm

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
z = np.sqrt(x*y)

#we choose a colorblind palette
cmap = cm.plasma
#here we define the colors of edgecolors for the scatter plot with the min and max
norm = mcb.Normalize(z.min(),z.max())
edgecols = cmap(norm(z))

#we get the color from the edgecolors values
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array(edgecols)

plt.scatter(x,y,edgecolors=edgecols,
    c='none',marker='o',lw=1,s=10)

#we plot the colorbar with the colors from edgecolor                       
cbar = plt.colorbar(sm)
© www.soinside.com 2019 - 2024. All rights reserved.