2014-09-14 14 views
5

Ich habe einen Pandas-Datenrahmen von "factors", floats und integers. Ich möchte "R Lattice" wie Plots darauf machen, indem ich die kategorialen Variablen konditioniere und gruppiere. Ich habe R ausgiebig verwendet und benutzerdefinierte Panel-Funktionen geschrieben, um die Plots genau so zu formatieren, wie ich sie haben wollte, aber ich kämpfe mit Matplotlib, um die gleichen Arten von Plots prägnant zu machen. Ich spiele mit Layouts und subplot2grid herum, aber ich finde es einfach nicht richtig.R Lattice like plots mit Python, Pandas und Matplotlib

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

nRows = 500 
df = pd.DataFrame({'c1' : np.random.choice(['A','B','C','D'], size=nRows), 
       'c2' : np.random.choice(['P','Q','R'], size=nRows), 
       'i1' : np.random.randint(20,50, nRows), 
       'i2' : np.random.randint(0,10, nRows), 
       'x1' : 3 * np.random.randn(nRows) + 90, 
       'x2' : 2 * np.random.randn(nRows) + 89}) 

Ich mag würde Dinge wie die folgenden (R Gittercodebeispiele)

für jede Ebene von c1 (Gittercode)

x1 gegen x2 plotten vs.

xyplot(x1 ~ x2 | c1, data = df) 

x1 x2 für jede Ebene von c1 mit "global" Legende c2 (Symbolen oder Farben)

xyplot(x1 ~ x2 | c1, groups = c2, data = df) 

Histogramme von x1 für jeden c2

hist (~x1 | c1, data = df) 

Ich bin auch wie die hier produziert zu machen "konditioniert" Konturplots versuchen (1.4.4.4)

https://scipy-lectures.github.io/intro/matplotlib/matplotlib.html

Ich habe durch diese Beispiele lesen: http://nbviewer.ipython.org/github/fonnesbeck/Bios366/blob/master/notebooks/Section2_4-Matplotlib.ipynb

Ich möchte jedoch, dass das Layout aus der Anzahl der Ebenen in der kategorialen Konditionierungsvariable (oder "by") generiert wird. d. h., sie geben eine Anzahl von Spalten an, und die Zeilen werden basierend auf den Nummernebenen berechnet.

Schätzen Sie alle guten Ratschläge oder Schritte in die richtige Richtung. Ich würde es vorziehen, nicht rpy2 oder python ggplot zu verwenden (ich habe mit ihnen herumgespielt - fand sie auch frustrierend und einschränkend).

Danke! Randall

+0

Es gibt einige experimentelle Code in Pandas für Trellis-Plots: http://pandas.pydata.org/pandas-docs/stable/rplot.html. Würde das helfen? Siehe auch http://ggplot.yhathq.com/, das wie ggplot in R ist, unterstützt Facettengitter. – joris

+0

Können Sie einige Beispiele für die Konturplot-Fragen hinzufügen. Seaborn verfügt über Funktionen für Hexbins und 2D-Kde-Plots, die Ihrer Meinung nach das erfüllen, was Sie suchen. – b10n

Antwort

8

Seaborn ist die effektivste Bibliothek, die ich für facettierte Diagramme in Python gefunden habe. Es ist ein pandasbewusster Wrapper um Matplotlib, der sich um alle Subplotting kümmert und das Matplotlib-Styling aktualisiert, um moderner auszusehen. Es produziert einige wirklich schöne Ausgabe.

Die Facettierung erfolgt über den grid-Teil der Bibliothek.

Es funktioniert ein wenig anders von R in dem Sie das Gitter zuerst erstellen und die Daten hineingeben, zusammen mit den gewünschten Facetten, Zeilen, Spalten, Farben, etc. Sie mappen dann Plotfunktionen auf dieses Gitter, Übergeben aller erforderlichen Argumente an die zugeordneten Plotfunktionen.

#scatter plot one factor 
import seaborn as sns 
grid1 = sns.FacetGrid(df, col='c1') 
grid1.map(plt.scatter, 'x1', 'x2') 


#scatter plot with column and hue factor 
grid2 = sns.FacetGrid(df, col='c1', hue='c2') 
grid2.map(plt.scatter, 'x1', 'x2') 


#histogram with one factor 
grid3 = sns.FacetGrid(df, col='c1') 
grid3.map(plt.hist, 'x1', alpha=.7) 
+0

habe meine Antwort mit Beispielen aktualisiert – b10n

+1

Das ist großartig, aber ich wollte nur darauf hinweisen, dass einige dieser Plots mit der "lmplot" -Funktion etwas einfacher zu erreichen sind.Du könntest den ersten mit 'sns.lmplot (" x1 "," x2 ", col =" c2 ", data = df)' machen. Dies passt auch zu einer Regressionslinie, die nützlich sein kann oder auch nicht, kann aber durch Hinzufügen von 'fit_reg = False' deaktiviert werden. – mwaskom

+0

Schön! Ich habe das in der Dokumentation – b10n