2015-04-18 4 views
5

ho un dataframe panda che sto tramando con Seaborn:trama colonne multiple sullo stesso grafico Seaborn

g = sns.FacetGrid(readCov, col='chr', col_wrap = 4, size=4) 
g.map(plt.scatter, 'pos', 'bergC9', hue = edgecolor='white') 
g.set(xlim= (0, 250000)) 

Questa grande opera e mi dà un singolo grafico per ogni 'chr' che si trova nella 'chr' colonna. Tuttavia, vorrei che ogni grafico avesse più colonne su di esso. Attualmente ne viene visualizzato solo uno, quello chiamato "bergC9". Voglio mettere più colonne sullo stesso grafico con colori diversi.

Qualche idea?

Grazie!

modifica: file dati di ingresso

chr description pos bergB7 bergC9 EvolB20 
1 1 '"ID=PBANKA_010290;Name=PBANKA_010290;descript... 108389 0.785456 0.899275 0.803017 
2 1 '"ID=PBANKA_010300;Name=PBANKA_010300;descript... 117894 1.070673 0.964203 0.989372 
3 1 '"ID=PBANKA_010310;Name=PBANKA_010310;descript... 119281 1.031106 1.042189 0.883518 
4 1 '"ID=PBANKA_010320;Name=PBANKA_010320;descript... 122082 0.880109 1.031673 1.026539 
5 1 '"ID=PBANKA_010330;Name=PBANKA_010330;descript... 126075 0.948105 0.969198 0.849213 

EDIT: Vorrei una dispersione che ha pos come l'asse xe bergB7, bergC9, EvolB20 ecc, che sono tutti 'ceppi' come l'asse y , quindi diverse tensioni sullo stesso grafico. Sono stato in grado di farlo riformattando il mio set di dati in modo che ora abbia un parametro o colonna 'strain' e concatenato tutti i dati y. Ora posso usare la sintassi della tonalità con 'strain'. Mi piacerebbe non dover riformattare tutti i miei set di dati. Ho pensato che potrebbe essere possibile creare un ciclo che farebbe riferimento a tutte le colonne che voglio tracciare, ma ho provato diverse sintassi inutilmente. Ci sono altri modi in cui ho pensato di realizzare questo, ma questi creano nuovi set di dati e so che non è il modo di andare a livello di programmazione. Sono un nuovo utente e vorrei iniziare correttamente.

Questo è ciò che l'output dovrebbe essere simile (sottoinsieme del pannello 15 grafico mostrato): (non posso postare l'immagine perché la mia 'reputazione' non è abbastanza alta)

+0

'sns.factorplot' potrebbe essere più facile. Controlla gli argomenti 'hue' e' x'. – cphlewis

+0

@cphlewis per quanto posso dire che hue può essere usata per raggruppare una variabile di colonna, ma no per più variabili di colonna. sns.factorplot è per le variabili categoriali. Ho 10 colonne con numeri interi che voglio tracciare sull'asse y. Un asse x, 'pos' con 10 set di dati y diversi da tracciare. – pinkvirus

+0

Non possiamo leggere la tua mente; pubblica la testa del tuo set di dati. – cphlewis

risposta

6

A cura i dati per avere due chr casi . Dovrebbe funzionare per qualsiasi numero di colonne "ceppi". I dati hanno bisogno di riformattare; dalla documentazione Seaborn:

Per utilizzare queste funzionalità, i dati deve essere in un Pandas dataframe e deve assumere la forma di ciò che Hadley Whickam chiama dati “ordinata”. Nel brief , ciò significa che il tuo dataframe dovrebbe essere strutturato in modo tale che ogni colonna sia una variabile e ogni riga sia un'osservazione.

ma panda lo fa facilmente:

import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 
readCov = pd.DataFrame([ (1, '\'"ID=PBANKA_010290;Name=PBANKA_010290;descript...', 108389, 0.785456, 0.899275, 0.803017), 
     (1, '\'"ID=PBANKA_010300;Name=PBANKA_010300;descript...', 117894, 1.070673, 0.964203, 0.9893719999999999), 
     (1, '\'"ID=PBANKA_010310;Name=PBANKA_010310;descript...', 119281, 1.0311059999999999, 1.042189, 0.883518), 
     (2, '\'"ID=PBANKA_010320;Name=PBANKA_010320;descript...', 122082, 0.880109, 1.031673, 1.0265389999999999), 
     (2, '\'"ID=PBANKA_010330;Name=PBANKA_010330;descript...', 126075, 0.948105, 0.969198, 0.8492129999999999)], 
     columns=[u'chr', u'description', u'pos', u'bergB7', u'bergC9', u'EvolB20'], 
     ) 

meltCov = pd.melt(readCov,id_vars=['chr','description','pos'], var_name='strain') 
g = sns.FacetGrid(meltCov, col='chr', hue='strain') 
g.map(plt.scatter, 'pos','value') 
g.set_xticklabels(rotation=45) 
g.add_legend() 

#this plots a figure per script automatically 
from os.path import realpath, basename 
s = basename(realpath(__file__)) 
fig = plt.gcf() 
fig.savefig(s.split('.')[0]) 
plt.show() 

enter image description here