2016-06-30 20 views
3

Mein Datenrahmen (Pandas Struktur) sieht aus wie oben enter image description herePandas Box-Plot für mehrere Spalt

Jetzt mag ich boxplot für jede Funktion auf separate Leinwand machen. Die Trennbedingung ist die erste Spalte. Ich habe ein ähnliches Diagramm für das Histogramm (Code unten), aber ich kann keine Arbeitsversion für den Boxplot erstellen.

hist_params = {'normed': True, 'bins': 60, 'alpha': 0.4} 
# create the figure 
fig = plt.figure(figsize=(16, 25)) 
for n, feature in enumerate(features): 
    # add sub plot on our figure 
    ax = fig.add_subplot(features.shape[1] // 5 + 1, 6, n + 1) 
    # define range for histograms by cutting 1% of data from both ends 
    min_value, max_value = numpy.percentile(data[feature], [1, 99]) 
    ax.hist(data.ix[data.is_true_seed.values == 0, feature].values, range=(min_value, max_value), 
      label='ghost', **hist_params) 
    ax.hist(data.ix[data.is_true_seed.values == 1, feature].values, range=(min_value, max_value), 
      label='true', **hist_params) 
    ax.legend(loc='best') 

    ax.set_title(feature) 

Above Code erzeugen solche Ausgabe als (im Anhang nur ein Teil davon): enter image description here

Antwort

5

DataFrame.boxplot() dies recht gut automatisiert:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame({'is_true_seed': np.random.choice([True, False], 10), 
        'col1': np.random.normal(size=10), 
        'col2': np.random.normal(size=10), 
        'col3': np.random.normal(size=10)}) 

fig, ax = plt.subplots(figsize=(10, 10)) 
df.boxplot(['col1', 'col2', 'col3'], 'is_true_seed', ax) 

Das erste Argument Pandas erzählt, die plotten Spalten, die zweite Spalte, nach der gruppiert werden soll (was Sie die Trennbedingung nennen), und die dritte, auf der die Achsen gezeichnet werden sollen.

Das Auflisten aller Spalten, aber die Spalte, die Sie gruppieren möchten, kann mühsam werden, aber Sie können es vermeiden, indem Sie dieses erste Argument weglassen. Sie müssen dann die anderen zwei explizit benennen:

df.boxplot(by='is_true_seed', ax=ax)