2014-10-10 20 views
9

Gibt es eine Möglichkeit, die Farbe der violin Plots in Matplotlib zu ändern?Farbe der Matplotlib-Violettplots ändern

Die Standardfarbe ist diese "bräunliche" Farbe, die nicht zu schlecht ist, aber ich würde z. B. die ersten drei Violinen anders färben, um sie hervorzuheben. Ich finde keinen Parameter in der documentation. Irgendwelche Ideen oder Tricks, um die Violinen anders zu färben?

enter image description here

+0

Können Sie öffnen eine Feature-Anfrage, dass die Funktionalität hinzufügen? Violin zeichnet ein neues Feature in 1.4 auf und (scheinbar) muss noch verfeinert werden. – tacaswell

+0

Wie haben Sie es geschafft, Kreismarker in Ihrer Handlung zu verwenden? – xyz

Antwort

17

matplotlib.pyplot.violinplot() sagt, es gibt:

Ein Wörterbuch-Mapping jede Komponente der violinplot auf eine Liste der entsprechenden Sammlung Instanzen erstellt. Das Wörterbuch hat die folgenden Schlüssel:

  • bodies: Eine Liste der matplotlib.collections.PolyCollection Instanzen die gefüllte Fläche jeder Violine enthält.
  • [... ua ...]

Methoden der PolyCollections umfassen:

So sieht es aus wie Sie durch den Körper Liste Ergebnis nur Schleife konnte und die facecolor jedes ändern:

violin_parts = plt.violinplot(...) 

for pc in violin_parts['bodies']: 
    pc.set_facecolor('red') 
    pc.set_edgecolor('black') 

Es ist ein wenig seltsam, aber, dass Sie nicht diese einstellen bei der Erstellung wie die gängigen Plot-Typen. Ich nehme an, es ist wahrscheinlich, weil die Operation so viele Bits erzeugt (die oben genannten PolyCollection zusammen mit 5 anderen LineCollections), dass zusätzliche Argumente mehrdeutig sein würden.

+1

Danke, 'für Patch, Farbe in zip (vplot ['Körper'], Farben): patch.set_color (Farbe)' hat den Job gemacht! – Sebastian

+0

Hat das nicht für jemanden funktioniert? Lassen Sie es mich wissen ... –

+0

Oder verwenden Sie "plt.setp" kurz, z.B. 'plt.setp (violine_parts ['bodies'], facecolor = 'rot', edgecolor = 'schwarz')' –

0
import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline 

rrred = '#ff2222' 
bluuu = '#2222ff' 
x = np.arange(2, 25) 
y = np.array([xi * np.random.uniform(0, 1, 10**3) for xi in x]).T 

# Create violin plot objects: 
fig, ax = plt.subplots(1, 1, figsize = (8,8)) 
violin_parts = ax.violinplot(y, x, widths = 0.9, showmeans = True, showextrema = True, showmedians = True) 

# Make all the violin statistics marks red: 
for partname in ('cbars','cmins','cmaxes','cmeans','cmedians'): 
    vp = violin_parts[partname] 
    vp.set_edgecolor(rrred) 
    vp.set_linewidth(1) 

# Make the violin body blue with a red border: 
for vp in violin_parts['bodies']: 
    vp.set_facecolor(bluuu) 
    vp.set_edgecolor(rrred) 
    vp.set_linewidth(1) 
    vp.set_alpha(0.5) 

enter image description here