2015-07-26 11 views
8

Ich versuche, einige Zahlen mit dem Seaborn-Modul in Python anzupassen, aber ich hatte nicht Glück, benutzerdefinierte Beschriftungen oder Anmerkungen zu erstellen. Ich habe einige Code bekam die folgende Abbildung erzeugt:Anpassen der Anmerkung mit Seaborns FacetGrid

plot = sns.FacetGrid(data = data, col = 'bot', margin_titles = True).set_titles('Human', 'Bot') 
bins = np.linspace(0, 2000, 15) 
plot = plot.map(plt.hist, 'friends_count', color = 'black', lw = 0, bins = bins) 
plot.set_axis_labels('Number Following', 'Count') 
sns.despine(left = True, bottom = True) 

enter image description here

Ich möchte zwei Dinge tun: 1. Die Standardfaktor Etiketten ersetzen, z.B. 'bot = 0.0', mit aussagekräftigem Text, und 2. zeichne vertikale Linien auf die mittlere Zahl, die für jede Kategorie folgt.

Hier ist ein in sich geschlossenes Beispiel:

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

fake = pd.DataFrame({'val': [1, 2, 2, 3, 3, 2, 1, 1, 2, 3], 'group': [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]}) 
plot = sns.FacetGrid(data = fake, col = 'group', margin_titles = True).set_titles('zero', 'one') 
plot = plot.map(plt.hist, 'val', color = 'black', lw = 0) 
sns.despine(left = True, bottom = True) 

Wer weiß, wie FacetGrids anpassen?

+0

Check-out die 'FacetGrid.set_titles' Methode. – mwaskom

+1

Ja, versucht, aber nichts rendert. Irgendwelche Gedanken darüber, vertikale Linien an verschiedenen Punkten zu machen? –

+2

Nicht sicher, was "nichts rendert" bedeutet. Wenn du Dinge ausprobiert hast und nicht funktioniert hast, solltest du das auch zu der Frage hinzufügen. Außerdem ist es viel einfacher zu helfen, wenn Ihre Frage ein in sich geschlossenes Beispiel enthält, das jemand kopieren und einfügen kann, um darauf zu bauen. Vielleicht könnten Sie eines der Beispiel-seaborn-Datasets verwenden, die im Lernprogramm verwendet werden. – mwaskom

Antwort

12

Ein paar Dinge über set_titles.

Zuerst werden die Standardtitel im FacetGrid.map Verfahren gezogen, so dass, wenn Sie die Titel ändern möchten, müssen Sie set_titlesnach Plotten nennen, sonst werden sie überschrieben.

Zweitens, wenn Sie den Docstring für die Methode betrachten, nimmt es nicht nur eine willkürliche Liste von Titeln. Es stellt eine Art und Weise zu ändern, wie der Titel den Spalt Variablennamen und Wert gemacht wird, mit:

template : string 
    Template for all titles with the formatting keys {col_var} and 
    {col_name} (if using a `col` faceting variable) and/or {row_var} 
    and {row_name} (if using a `row` faceting variable). 

So ist der einfachste Weg, „sinnvollen Text“ haben, ist aussagekräftige Daten in Ihrem Datenrahmen zu verwenden. Nehmen Sie dieses Beispiel mit zufälligen Daten:

df = pd.DataFrame({'val': np.random.randn(100), 
        'group': np.repeat([0, 1], 50)}) 

Wenn Sie „Gruppe“ wollen zero und one sein, sollten Sie nur diese Spalte ändern, oder machen ein neues Geschäft:

df["group"] = df["group"].map({0: "zero", 1; "one"}) 

Dann sagen Sie don ‚t wollen die Variablennamen in dem Titel haben, die richtige Art und Weise FacetGrid.set_titles wäre die Verwendung

g = sns.FacetGrid(data=df, col='group') 
g.map(plt.hist, 'val', color='black', lw=0) 
g.set_titles('{col_name}') 

some bar graphs

Wenn Sie Sie Plotten nicht die Daten ändern möchten, dann werden Sie die Attribute gesetzt haben auf die matplotlib direkt Achsen, so etwas wie:

for ax, title in zip(g.axes.flat, ['zero', 'one']): 
    ax.set_title(title) 

Hinweis, dass dies weniger bevorzugt zu der obigen Methode, weil Sie sehr vorsichtig sein müssen, um sicherzustellen, dass die Reihenfolge Ihrer Liste korrekt ist und dass sie sich nicht ändern wird, während das Abrufen der Informationen aus dem Datenrahmen selbst viel robuster sein wird.

Um den Mittelwert zu plotten, müssen Sie eine kleine Funktion erstellen, die an FacetGrid.map übergeben werden kann. Es gibt multiple examples wie man das im Tutorial macht.In diesem Fall ist es ganz einfach:

def vertical_mean_line(x, **kwargs): 
    plt.axvline(x.mean(), **kwargs) 

Dann alles, was Sie brauchen, um wieder Grundstück:

g = sns.FacetGrid(data=df, col='group') 
g.map(plt.hist, 'val', color='black', lw=0) 
g.map(vertical_mean_line, 'val') 
g.set_titles('{col_name}') 

some more bar graphs

+0

Große Antwort. IMO das Problem mit der Codierung von Daten mit den Bezeichnungen, die Sie für die Visualisierung verwenden würde, ist, dass es die Anwendung von Transformationen auf die Daten später (ohne wiederholte Neucodierung) ausschließt. Zum Beispiel, wenn ich zentrieren und skalieren wollte, müsste ich diese Beschriftungen zurück in [0, 1] konvertieren. In der Hoffnung, in Zukunft eine bessere Unterstützung für Zahlenbeschriftung und Annotation zu sehen. Wäre schön, etwas Elegantes und Kraftvolles wie ggplot2 für Python zu haben. –

+4

* Kommentar von [Coby Viner] (http://stackoverflow.com/users/5339699/): * Sollte '{col_value} '' 'col_name}' gewesen sein (in den 'g.set_titles (' {col_value} ') 'Codefragment)? Es scheint keinen '{col_value}' Vorlagencode zu geben. –

+0

@erinshellman Hast du yhats ggplot-Bibliothek gesehen? http://ggplot.yhatq.com/docs/facet_grid.html –