2017-04-20 262 views
2

我想要为边缘颜色绘制散点图,但没有使用facecolors。 当我使用facecolor='None'时,它不起作用。Matplotlib:边缘颜色的散点图,但没有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 

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

任何解决方案?

回答

1

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

一个解决方案不会将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

+1

这种解决方案更优雅比我 –

+0

我认为这取决于:该解决方案使用'set_facecolor'实际上允许使用颜色映射设置facecolor。这在改变数据时会有好处,例如在动画中,没有对颜色进行重新整理。对于通常的情况,这两种解决方案都同样好,我会说。 – ImportanceOfBeingErnest

+0

谢谢你的答案! –

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

enter image description here

+0

非常感谢!它工作得很好。 –

+0

如果答案已解决您的问题,请考虑通过单击答案旁边的复选标记(无论您更喜欢哪个)来接受该问题以解决问题。 –