2016-02-23 2 views
5

Ein Online-Jupyter Notebook den Code und zeigt die Farbunterschiede zeigen, ist bei: https://anaconda.org/walter/pandas_seaborn_color/notebookWarum funktioniert die Seaborn-Farbpalette nicht für Pandas-Balkendiagramme?

Die Farben sind falsch, wenn ich bar Plots mit Pandas Datenrahmen Methode machen. Seaborn verbessert die Farbpalette von Matplotlib. Alle Plots von Matplotlib verwenden automatisch die neue Seaborn-Palette. Balkendiagramme aus Pandas-Datenrahmen kehren jedoch zu den Nicht-Seaborn-Farben zurück. Dieses Verhalten ist nicht konsistent, da Liniendiagramme von Pandas-Datenrahmen Seaborn-Farben verwenden. Dadurch erscheinen meine Plots in verschiedenen Stilen, selbst wenn ich Pandas für alle meine Plots verwende.

Wie kann ich mit Pandas-Methoden plotten, während eine konsistente Seaborn-Farbpalette erstellt wird?

Ich führe dies in Python 2.7.11 mit einer Conda-Umgebung mit nur die notwendigen Pakete für diesen Code (Pandas, Matplotlib und Seaborn).

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

df = pd.DataFrame({'y':[5,7,3,8]}) 

# matplotlib figure correctly uses Seaborn color palette 
plt.figure() 
plt.bar(df.index, df['y']) 
plt.show() 

# pandas bar plot reverts to default matplotlib color palette 
df.plot(kind='bar') 
plt.show() 

# pandas line plots correctly use seaborn color palette 
df.plot() 
plt.show() 
+0

* 1. * Was Ihre Frage ist - haben Sie eine Lösung wissen wollen (und möglich Workaround) oder möchten Sie den Grund für dieses Verhalten wissen? * 2. * Diese Information hängt mit Ihrer Frage zusammen: 'pyplot.scatter' verwendet auch keine Seaborn-Farben (standardmäßig?). – kazemakase

+0

Danke Kazemakase. Ich habe die Frage bearbeitet, um klarzustellen, dass ich gerne wissen möchte, wie ich mithilfe von Pandas-Methoden plotten kann, während ich eine konsistente Seaborn-Farbpalette erhalte. (Natürlich kann der Grund dafür hilfreich sein.) – Walter

Antwort

5

Kredit an @mwaskom für das Zeigen auf sns.color_palette(). Ich suchte danach, aber irgendwie vermisste ich es daher das ursprüngliche Chaos mit prop_cycle.


Als Workaround können Sie die Farbe von Hand einstellen. Beachten Sie, dass sich das Schlüsselwortargument color anders verhält, wenn Sie eine oder mehrere Spalten darstellen.

df = pd.DataFrame({'x': [3, 6, 1, 2], 'y':[5, 7, 3, 8]}) 

df['y'].plot(kind='bar', color=sns.color_palette(n_colors=1)) 

One column plot

df.plot(kind='bar', color=sns.color_palette()) 

Two columns plot

Meine ursprüngliche Antwort:

prop_cycle = plt.rcParams['axes.prop_cycle'] 
df['y'].plot(kind='bar', color=next(iter(prop_cycle))['color']) 
df.plot(kind='bar', color=[x['color'] for x in prop_cycle]) 
+1

Sie können einfach 'sns.color_palette()' verwenden, um die aktuelle Farbe zu erhalten. Es ist nicht notwendig, dieses Geschäft mit dem Listenverständnis zu tun. – mwaskom

+0

Das macht den Trick! Danke euch beiden, Goyo und mwaskom. – Walter

2

Das war ein Fehler in Pandas speziell für Bar Plots (und Boxplots auch glaube ich), die in Pandas Master festgelegt ist (siehe berichtet issue und die PR es zu beheben).
Dies wird in Pandas 0.18.0 sein, die in den kommenden Wochen veröffentlicht werden.

+0

Joris, Das ist wirklich hilfreich und der Link zum Thema ist informativ. Ich wünschte, ich könnte zwei Antworten wählen, aber ich ging mit Goyos, weil es sofort nützlich war und scheint, dass es mehr Potential für Langlebigkeit in Bezug auf dieses Thema haben wird. Vielen Dank! – Walter

+0

Ja, natürlich, kein Problem! :-) – joris

+0

Ich habe diese Antwort jetzt auch bestätigt. Ich habe die Pandas-Entwicklungsversion 0.18.0rc1 + 62.g41b1d25 installiert und das behebt das Problem. – Walter