2016-02-23 15 views
5

Un notebook Jupyter on-line a dimostrazione del codice e che mostra le differenze di colore e ': https://anaconda.org/walter/pandas_seaborn_color/notebookPerché la tavolozza dei colori Seaborn non funziona con i grafici a barre di Pandas?

I colori sono sbagliati quando faccio trame a barre utilizzando il metodo dataframe Panda. Seaborn migliora la tavolozza dei colori di matplotlib. Tutti i grafici di matplotlib utilizzano automaticamente la nuova tavolozza Seaborn. Tuttavia, i grafici a barre dei frame di Pandas ritornano ai colori non Seaborn. Questo comportamento non è coerente, in quanto i grafici a linee di Pandas dataframes do utilizzano i colori Seaborn. Questo rende le mie trame apparire in stili diversi, anche se uso Panda per tutti i miei grafici.

Come si può tracciare usando i metodi Panda mentre si ottiene una tavolozza di colori Seaborn coerente?

Sto eseguendo questo in python 2.7.11 utilizzando un ambiente conda con solo i pacchetti necessari per questo codice (panda, matplotlib e 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. * Qual è la tua domanda specifica - vuoi sapere una soluzione (e possibile soluzione) o vuoi conoscere il motivo di questo comportamento? * 2. * Questa informazione potrebbe essere correlata alla tua domanda: 'pyplot.scatter' non usa i colori del mare (di default?). – kazemakase

+0

Grazie kazemakase. Ho modificato la domanda per chiarire che mi piacerebbe sapere come posso tracciare usando i metodi Panda mentre ottengo una tavolozza di colori Seaborn coerente. (Naturalmente, conoscendo il motivo può essere utile a quanto sopra.) – Walter

risposta

5

Credito a @mwaskom per indicare a sns.color_palette(). Stavo cercando quello, ma in qualche modo mi mancava da qui il pasticcio originale con prop_cycle.


Come soluzione alternativa è possibile impostare il colore a mano. Si noti come l'argomento della parola chiave color si comporta in modo diverso se si sta stampando una o più colonne.

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

La mia risposta originale:

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

Si può semplicemente fare 'sns.color_palette()' per ottenere il colore corrente; non è necessario fare affari con la comprensione delle liste. – mwaskom

+0

Questo è il trucco! Grazie a entrambi, Goyo e mwaskom. – Walter

2

Questo è stato un bug nel panda specificamente per i grafici a barre (e grafici a scatole così credo), che è fissato in master panda (vedi riportato issue e il PR per risolvere il problema).
Questo sarà in panda 0.18.0 che sarà rilasciato nelle prossime settimane.

+0

Joris, Questo è veramente utile e il collegamento al problema è informativo. Vorrei poter scegliere due risposte, ma sono andato con Goyo perché è stato immediatamente utile e sembra che abbia più potenziale per la longevità in relazione a questo argomento. Grazie! – Walter

+0

Sì, certo, nessun problema! :-) – joris

+0

Ho anche confermato questa risposta ora. Ho installato la versione di sviluppo di Pandas 0.18.0rc1 + 62.g41b1d25 e questo risolve il problema. – Walter

Problemi correlati