2014-04-17 14 views
6

ich den folgenden Datenrahmen in Python hat (der tatsächliche Datenrahmen ist viel größer, nur eine kleine Probe präsentiert):Python boxplot

 A  B  C  D  E  F 
0 0.43 0.52 0.96 1.17 1.17 2.85 
1 0.43 0.52 1.17 2.72 2.75 2.94 
2 0.43 0.53 1.48 2.85 2.83 
3 0.47 0.59 1.58  3.14 
4 0.49 0.80   

ich wandle die Datenrahmen numpy df.values ​​mit und dann das zu boxplot übergeben.

Wenn ich versuche, einen Boxplot aus diesem Pandas-Datenrahmen zu machen, ist die Anzahl der Werte, die aus jeder Spalte ausgewählt werden, auf die geringste Anzahl von Werten in einer Spalte beschränkt (in diesem Fall Spalte F). Gibt es eine Möglichkeit, alle Werte aus jeder Spalte zu plotten?

HINWEIS: Ich benutze df.dropna, um die Zeilen in jeder Spalte mit fehlenden Werten zu löschen. Dies ändert jedoch die Größe des Datenrahmens auf den kleinsten gemeinsamen Nenner der Spaltenlänge und führt zu einer Unordnung der Darstellung.

import prettyplotlib as ppl 
import numpy as np 
import pandas 
import matplotlib as mpl 
from matplotlib import pyplot 

df = pandas.DataFrame.from_csv(csv_data,index_col=False) 
df = df.dropna() 
labels = ['A', 'B', 'C', 'D', 'E', 'F'] 
fig, ax = pyplot.subplots() 
ppl.boxplot(ax, df.values, xticklabels=labels) 
pyplot.show() 
+0

sollten Sie die numpy/Pandas Code – mrKelley

+0

Added Code schreiben. Ok, ich sehe, was passiert. Ich benutze df.dropna, um die Zeilen in jeder Spalte mit fehlenden Werten zu löschen. Dies ändert jedoch die Größe des Datenrahmens auf den kleinsten gemeinsamen Nenner der Spaltenlänge und führt zu einer Unordnung der Darstellung. Irgendwelche Lösungen? – user308827

+1

Wie wäre es mit dem NaN? Ich denke, 'Boxplot' wird NaN-Werte selbst behandeln. – HYRY

Antwort

6

Der richtige Weg, es zu tun, von der das Rad neu erfinden zu speichern, wäre die .boxplot() in pandas zu verwenden, wobei die nan korrekt behandelt:

In [31]: 

print df 
     A  B  C  D  E  F 
0 0.43 0.52 0.96 1.17 1.17 2.85 
1 0.43 0.52 1.17 2.72 2.75 2.94 
2 0.43 0.53 1.48 2.85 2.83 NaN 
3 0.47 0.59 1.58 NaN 3.14 NaN 
4 0.49 0.80 NaN NaN NaN NaN 

[5 rows x 6 columns] 
In [32]: 

_=plt.boxplot(df.values) 
_=plt.xticks(range(1,7),labels) 
plt.savefig('1.png') #keeping the nan's and plot by plt 

enter image description here

In [33]: 

_=df.boxplot() 
plt.savefig('2.png') #keeping the nan's and plot by pandas 

enter image description here

In [34]: 

_=plt.boxplot(df.dropna().values) 
_=plt.xticks(range(1,7),labels) 
plt.savefig('3.png') #dropping the nan's and plot by plt 

enter image description here

+0

danke, ich werde das ausprobieren. Was ist das - = was hast du vor dem Code? – user308827

+0

Das unterdrückt sinnlose Ausgabe im Terminal. Sie sehen, 'plt.boxplot' gibt eine Liste von 3 Elementen zurück. 'plt.xticks' wird eine Menge von Tick-Objekten zurückgeben. –

+0

ausgezeichnet, das funktioniert, danke! – user308827

Verwandte Themen