2017-04-23 6 views
1

Ich möchte über Listen iterieren und einen Boxplot jeder Liste plotten. Da die Daten nicht alle in den Speicher passen, kann ich keine vordefinierte Anzahl von Boxplots zuweisen. Daher verwende ich die Subplot-Funktion, um Plots iterativ hinzuzufügen.matplotlib subplot boxplot versteckt einige Achsenbeschriftungen

Mein Problem ist, dass die Achsenbeschriftungen nicht mit dem Boxplot zum Plot hinzugefügt werden, und nur das letzte Etikett wird angezeigt. Wie ist es möglich, Boxplots iterativ mit Subplot zu beschriften?

Ein vereinfachtes Beispiel von dem, was ich tun möchte, ist unten. Obwohl ich in Wirklichkeit die gleiche Liste in einer Schleife rezykliere, anstatt über eine Liste von Listen zu iterieren, dient sie zur Veranschaulichung des Problems. Wie zu sehen ist, wird nur 'lb' in der yaxis gesetzt und die Grafik zeigt nicht 'la' für den ersten unteren Boxplot,

Danke.

%matplotlib inline 
import matplotlib.pyplot as plt 

la = [24, 28, 31, 34, 38, 40, 41, 42, 43, 44] 
lb = [5, 8, 10, 12, 15, 18, 21, 25, 30, 39] 
names = ['la', 'lb'] 
myList = [la] + [lb] 
myList 

# set fig for boxplots 
fig, ax = plt.subplots(sharex=True) 
# Add a horizontal grid to the plot 
ax.xaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5) 
ax.set_axisbelow(True) 
ax.set_title('Some Title') 

for i,l in enumerate(myList): 
    ax.boxplot(l, vert=False, positions = [i]) 
    ax.set_yticklabels([names[i]]) 

ax.set_ylim(-0.5, len(myList)-0.5) 

/Users/pmca/Desktop/Screen_Shot_2017-04-23_at_16.24.25.png

Antwort

2

das Etikett innerhalb der Schleife Einstellung wird die vorherige ticklabel überschreiben. Also sollten die Etiketten außerhalb der Schleife gesetzt werden. Sie müssen auch sicherstellen, dass beide Etiketten tatsächlich Ticks haben.

Eine Lösung ist daher

ax.set_yticks(range(len(myList))) 
ax.set_yticklabels(names) 

außerhalb der Schleife hinzuzufügen.

komplette Code:

import matplotlib.pyplot as plt 

la = [24, 28, 31, 34, 38, 40, 41, 42, 43, 44] 
lb = [5, 8, 10, 12, 15, 18, 21, 25, 30, 39] 
names = ['la', 'lb'] 
myList = [la] + [lb] 
myList 

# set fig for boxplots 
fig, ax = plt.subplots(sharex=True) 
# Add a horizontal grid to the plot 
ax.xaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5) 
ax.set_axisbelow(True) 
ax.set_title('Some Title') 

for i,l in enumerate(myList): 
    ax.boxplot(l, vert=False, positions = [i]) 

ax.set_yticks(range(len(myList))) 
ax.set_yticklabels(names) 

ax.set_ylim(-0.5, len(myList)-0.5) 

plt.show() 

enter image description here

+0

Großen. Ich hatte vorher schon etwas ähnliches versucht, aber ohne auch die Ticks zu setzen, war das Ergebnis dasselbe wie in meiner Frage. Ich zitiere also Ihren Satz "Sie müssen auch sicherstellen, dass beide Etiketten tatsächlich Ticks haben." wie nötig, um den Trick zu machen. – PedroA

+0

tat es tatsächlich. Erledigt. – PedroA

Verwandte Themen