2017-09-28 2 views
2

Ich Abbilden der Seaborn stripplot auf einen Seaborn PairGrid unter dem Code:Order of categoricals in Seaborn PairGrid

import pandas as pd 
import seaborn as sns 

df = (pd.read_csv(filepath_or_buffer='http://vincentarelbundock.github.io/' + 
       'Rdatasets/csv/ggplot2/diamonds.csv') 
    .drop(labels='Unnamed: 0', axis=1) 
    .astype(dtype={'cut': 'category', 'color': 'category', 
        'clarity': 'category'})) 
agged = df.groupby(by=['cut', 'color']).mean().sort_index().reset_index() 
g = sns.PairGrid(data=agged, x_vars=agged.columns[2:], y_vars=['cut', 'color'], 
      size=5, aspect=.65) 
g.map(func=sns.stripplot, orient='h', size=10, palette='Blues_d') 

Standardmäßig sind die Kategorien in den 'Schnitt' Facetten werden in alphabetischer Reihenfolge angezeigt werden. Allerdings möchte ich die Reihenfolge festlegen:

['Fair', 'Good', 'Very Good', 'Premium', 'Ideal'] 

Ich habe versucht, das Bestehen der ‚Ordnung‘ Parameter für stripplot wie folgt:

g.map(func=sns.stripplot, orient='h', size=10, palette='Blues_d', 
    order=['Fair', 'Good', 'Very Good', 'Premium', 'Ideal']) 

zwar richtig, die Kategorien in ‚schneiden‘ sortiert, es Dies führt dazu, dass in den "Farb" -Facetten überhaupt nichts geplottet wird. Ich habe auch versucht, die ‚Farbe‘ Facette Ordnung in der gleichen Parameter angeben, wie folgt:

g.map(func=sns.stripplot, orient='h', size=10, palette='Blues_d', 
    order=['Fair', 'Good', 'Very Good', 'Premium', 'Ideal', 'D', 'E', 'F', 
     'G', 'H', I']) 

jedoch hier das Problem ist, dass alle Werte in der Reihenfolge Parameter in erscheinen sowohl in der ‚Farbe‘ und " schneiden 'Facetten.

Ist es möglich, eine Reihenfolge in der Mapping-Funktion anzugeben, die zu einer korrekten Reihenfolge in beiden Facettensätzen führt, ohne Duplikate?

['Fair', 'Good', 'Very Good', 'Premium', 'Ideal'] 
['D', 'E', 'F', 'G', 'H', I'] 
+0

Ich habe versucht, meine ursprüngliche Post zu ändern, es minimal, vollständig und überprüfbar zu machen, indem Sie den Code enthält, die meine ursprüngliche df liest (was die Probe Diamanten Datensatz von ggplot2). Hoffentlich wird das helfen. Entschuldigung - ich bin neu darin, hier Fragen zu stellen, also bitte ertragen Sie mich, während ich versuche, klar zu sein! – lifescholar

Antwort

0

Das Problem besteht darin, dass Sie für jede Zeile im Raster unterschiedliche Kategorien haben. Daher würden Sie für die Teilplots aus jeder Zeile einen anderen order benötigen.

Ich glaube nicht, dass es eine automatische Art und Weise ist es, die verschiedenen Aufträge zu liefern, aber Sie können Ihr eigenes Wörterbuch von Aufträgen abhängig von Zeilenvariablen

order = {'cut' :['Fair', 'Good', 'Very Good', 'Premium', 'Ideal'], 
     'color':['D', 'E', 'F', 'G', 'H', 'I']} 

Dann definieren Sie eine benutzerdefinierte Funktion, um die Karte Raster, das abhängig von der Zeilenvariable die richtige Reihenfolge auswählt.

def ordered_stripplot(*args, **kwargs): 
    order = kwargs.pop("order") 
    sns.stripplot(args[0],args[1], order=order[args[1].name], **kwargs) 

g.map(ordered_stripplot, order=order, orient='h', size=10, palette='Blues_d') 

Statt Mapping direkt an sns.stripplot Karte Sie auf eine benutzerdefinierte Funktion, die den Auftrag Wörterbuch als Eingabe und wählt nimmt, auf das Argument abhängig, die richtige Reihenfolge. Dies wird an sns.stripplot geliefert und innerhalb dieser Funktion aufgerufen.

komplette Code:

import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 

df = (pd.read_csv(filepath_or_buffer='http://vincentarelbundock.github.io/' + 
       'Rdatasets/csv/ggplot2/diamonds.csv') 
    .drop(labels='Unnamed: 0', axis=1) 
    .astype(dtype={'cut': 'category', 'color': 'category', 
        'clarity': 'category'})) 
agged = df.groupby(by=['cut', 'color']).mean().sort_index().reset_index() 

order = {'cut' :['Fair', 'Good', 'Very Good', 'Premium', 'Ideal'], 
     'color':['D', 'E', 'F', 'G', 'H', 'I']} 

g = sns.PairGrid(data=agged, x_vars=agged.columns[2:], y_vars=['cut', 'color'], 
      size=3, aspect=.65) 

def ordered_stripplot(*args, **kwargs): 
    order = kwargs.pop("order") 
    sns.stripplot(args[0],args[1], order=order[args[1].name], **kwargs) 

g.map(ordered_stripplot, order=order, orient='h', size=10, palette='Blues_d') 

plt.tight_layout() 
plt.show() 

enter image description here

+0

Das ist eine wirklich nützliche Technik, und ich kann sehen, wie sie ein Designmuster für ähnliche Anforderungen bilden könnte. Ich war zu der gleichen Schlussfolgerung wie Sie gekommen, dass es unwahrscheinlich war, verschiedene Bestellungen zu liefern, aber ich hatte Mühe, die Lösung zu finden, das Stripplot mit einer benutzerdefinierten Funktion zu umhüllen und ein Wörterbuch für die Bestellungen zu verwenden. Sehr elegant.Ich habe deine Antwort abgestimmt, aber da ich noch nicht genug Reputation habe, wird sie immer noch als 0 angezeigt. – lifescholar