2017-01-03 4 views
3

Ich möchte 3 horizontale Balken-Plots, mit den Beschriftungen als y-Achse die Daten als die x-Achse, und ich möchte, dass jedes Diagramm zu einem anderen sein Farbe und irgendeine Art von Anmerkung haben wie ein Sternchen, die auf dem signficiance hängt von einer Spalte in den Daten bezeichnet, zum Beispiel:Wie Farbe und Sternchen pro Diagramm mit Seaborn Pairgird und Seaborn Barplot

dat = pd.DataFrame({ 
    'Labels':['v1','v2','c1','c2'], 
    'Ave': [.2, .3, .5, .9], 
    'SD': [0.02, 0.1, 0.04, 0.06], 
    'Tot': [3, 4, 6, 8], 
    'Sig': [0.05, 0.001, 0.0001, 0.05] 
}) 

sns.set_style('white') 

g = sns.PairGrid(dat, x_vars=['Ave', 'SD', 'Tot'], y_vars=['Labels']) 
g.map(sns.barplot) 

erhalten mir etwas wie folgt aus:

enter image description here

Wie bekomme ich jedes Diagramm, "Ave" "SD" und "ToT "ihre eigene Farbe zu sein? und wie könnte ich Anmerkungen hinzufügen, um die Signifikanz anzugeben, die in der Spalte "Sig" angegeben ist?

Antwort

0

Haben Sie das nicht gedacht, wie das mit Seaborn getan zu bekommen, aber mit diesem wird

import pandas as pd 

dat = pd.DataFrame({ 
    'Labels':['v1','v2','c1','c2'], 
    'Ave': [.2, .3, .5, .9], 
    'SD': [0.02, 0.1, 0.04, 0.06], 
    'Tot': [3, 4, 6, 8], 
    'Sig':[0.05, 0.005, 0.0001, 0.05], 
    'Sig_mask': [1,2,3,1], 
}) 

import matplotlib.pyplot as plt 
fig = plt.figure() 

# multiple plots 
ax1 = fig.add_subplot(131) 

# horizontal bar plot and set color 
ax1.barh(dat.index.values, dat['SD'], color='r', align='center') 

# SET SPINES VISIBLE 
ax1.spines['right'].set_visible(False) 
ax1.spines['top'].set_visible(False) 

# SET X, Y LABELS 
ax1.set(yticks=dat.index.values, yticklabels=dat.Labels.values) 
ax1.set(xlabel='SD') 

# ADD SIG NOTATION 
for idx, val in enumerate(dat.SD.values): 
    ax1.text(x=val+.003, y=idx, s='*'*dat.Sig_mask[idx], va='center') 

# ADD SECOND PLOT 
ax2 = fig.add_subplot(132) 
# everything else much in the same manner, change color and data column 


# ADD THIRD PLOT 
ax3 = fig.add_subplot(133) 
# same as above 
1

Sie können matplotlib die Arbeit schließen und factorplot Ihre Daten an einem langen (ordentlich) Format durch Umformen.

Umgestalten:

dat = (
    pandas.DataFrame({ 
     'Labels':['v1','v2','c1','c2'], 
     'Ave': [.2, .3, .5, .9], 
     'SD': [0.02, 0.1, 0.04, 0.06], 
     'Tot': [3, 4, 6, 8], 
     'Sig': [0.05, 0.001, 0.0001, 0.05] 
    }).set_index('Labels') 
    .unstack() 
    .reset_index() 
    .rename(columns={ 
     'level_0': 'stat', 
     0: 'result' 
    }) 
) 

print(dat.head(8)) 

    stat Labels result 
0 Ave  v1 0.20 
1 Ave  v2 0.30 
2 Ave  c1 0.50 
3 Ave  c2 0.90 
4 SD  v1 0.02 
5 SD  v2 0.10 
6 SD  c1 0.04 
7 SD  c2 0.06 

Und factorplot:

seaborn.factorplot('result', 'Labels', data=dat, 
        kind='bar', sharex=False, 
        hue='stat', hue_order=stats, 
        col='stat', col_order=stats) 

enter image description here

Das Problem ist, dass die Stäbe versetzt sind, da die Verwendung hue Seaborn Raum an jedem y für verschiedene Kategorien zu machen erzählt -Position. In der nächsten Version können Sie dodge=False sagen, um diesen Offset zu vermeiden.