2017-04-20 1 views
2

Ich möchte ein Streudiagramm mit Colormap für Edgecolors, aber keine Facelicons haben. Wenn ich facecolor='None' verwende, funktioniert es nicht.Matplotlib: Scatter-Plot mit Colormaps für Edgecolor aber keine 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() 

Irgendeine Lösung?

Antwort

1

Das Argument c wirkt sich gleichzeitig auf die Gesichts- und die Kantenfarbe aus, die Argumente facecolor und edgecolor werden daher ignoriert.

würde eine Lösung zusammen mit einem colormap, sondern facecolors und edgecolors allein nicht zu verwenden, um das c Argument verwenden. In diesem Fall kann facecolors auf "None" eingestellt werden und edgecolors kann eine Liste der Farben gegeben werden, um zu verwenden.

Um diese Liste zu erstellen, kann die gleiche Farbpalette angewendet werden.

c = plt.cm.gist_rainbow(colors) 
plt.scatter(x, y, s=area,facecolors="None", edgecolors=c, lw=1,alpha=0.5) 

Ein vollständigeres Beispiel:

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

Diese Lösung ist eleganter als meine –

+0

Ich denke, es hängt davon ab: Die Lösung der facecolor Einstellung mit 'set_facecolor' erlaubt tatsächlich die colormap zu verwenden. Dies hätte Vorteile beim Ändern der Daten, z. in einer Animation, ohne die Farben zu renomieren. Für den üblichen Fall sind beide Lösungen gleich gut, würde ich sagen. – ImportanceOfBeingErnest

+0

Danke für beide Antworten! –

2

Das Problem ist, dass die color=facecolors= Argument überschreibt.

Die Lösung, die ich kam, ist die PathCollection von pyplot.scatter() zurückgegeben und dann die facecolor direkt ändern. Beachten Sie, dass Sie wahrscheinlich die Linienbreite erhöhen müssen, um die Kanten besser sehen zu können.

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

Vielen Dank! Es funktioniert sehr gut. –

+0

Wenn die Antwort Ihr Problem gelöst hat, können Sie es akzeptieren, indem Sie auf das Häkchen neben der Antwort klicken (je nachdem, welche Sie bevorzugen), um diese Frage zu schließen. –

Verwandte Themen