2016-06-13 33 views
5

Sto lottando per massaggiare un dataframe in panda nel formato corretto per heatmap di Seaborn (o matplotlib in realtà) per creare una heatmap.heatmap seaborn using pandas dataframe

mio dataframe corrente (chiamato data_yule) è:

 Unnamed: 0 SymmetricDivision   test MutProb  value 
3    3    1.0 sackin_yule 0.100 -4.180864 
8    8    1.0 sackin_yule 0.050 -9.175349 
13   13    1.0 sackin_yule 0.010 -11.408114 
18   18    1.0 sackin_yule 0.005 -10.502450 
23   23    1.0 sackin_yule 0.001 -8.027475 
28   28    0.8 sackin_yule 0.100 -0.722602 
33   33    0.8 sackin_yule 0.050 -6.996394 
38   38    0.8 sackin_yule 0.010 -10.536340 
43   43    0.8 sackin_yule 0.005 -9.544065 
48   48    0.8 sackin_yule 0.001 -7.196407 
53   53    0.6 sackin_yule 0.100 -0.392256 
58   58    0.6 sackin_yule 0.050 -6.621639 
63   63    0.6 sackin_yule 0.010 -9.551801 
68   68    0.6 sackin_yule 0.005 -9.292469 
73   73    0.6 sackin_yule 0.001 -6.760559 
78   78    0.4 sackin_yule 0.100 -0.652147 
83   83    0.4 sackin_yule 0.050 -6.885229 
88   88    0.4 sackin_yule 0.010 -9.455776 
93   93    0.4 sackin_yule 0.005 -8.936463 
98   98    0.4 sackin_yule 0.001 -6.473629 
103   103    0.2 sackin_yule 0.100 -0.964818 
108   108    0.2 sackin_yule 0.050 -6.051482 
113   113    0.2 sackin_yule 0.010 -9.784686 
118   118    0.2 sackin_yule 0.005 -8.571063 
123   123    0.2 sackin_yule 0.001 -6.146121 

ei miei tentativi utilizzando matplotlib era:

plt.pcolor(data_yule.SymmetricDivision, data_yule.MutProb, data_yule.value) 

che ha gettato l'errore:

ValueError: not enough values to unpack (expected 2, got 1) 

e il tentativo Seaborn era:

sns.heatmap(data_yule.SymmetricDivision, data_yule.MutProb, data_yule.value) 

che ha gettato:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Sembra banale come entrambe le funzioni vogliono set di dati di forma rettangolare, ma mi manca qualcosa, chiaramente.

risposta

17

i dati devono essere "pivoted" a guardare come

In [96]: result 
Out[96]: 
MutProb    0.001  0.005  0.010  0.050  0.100 
SymmetricDivision              
0.2    -6.146121 -8.571063 -9.784686 -6.051482 -0.964818 
0.4    -6.473629 -8.936463 -9.455776 -6.885229 -0.652147 
0.6    -6.760559 -9.292469 -9.551801 -6.621639 -0.392256 
0.8    -7.196407 -9.544065 -10.536340 -6.996394 -0.722602 
1.0    -8.027475 -10.502450 -11.408114 -9.175349 -4.180864 

Poi si può passare la matrice 2D (o dataframe) per seaborn.heatmap o plt.pcolor:

import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 
df = pd.DataFrame({'MutProb': [0.1, 
    0.05, 0.01, 0.005, 0.001, 0.1, 0.05, 0.01, 0.005, 0.001, 0.1, 0.05, 0.01, 0.005, 0.001, 0.1, 0.05, 0.01, 0.005, 0.001, 0.1, 0.05, 0.01, 0.005, 0.001], 'SymmetricDivision': [1.0, 1.0, 1.0, 1.0, 1.0, 0.8, 0.8, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.6, 0.6, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2], 'test': ['sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule', 'sackin_yule'], 'value': [-4.1808639999999997, -9.1753490000000006, -11.408113999999999, -10.50245, -8.0274750000000008, -0.72260200000000008, -6.9963940000000004, -10.536339999999999, -9.5440649999999998, -7.1964070000000007, -0.39225599999999999, -6.6216390000000001, -9.5518009999999993, -9.2924690000000005, -6.7605589999999998, -0.65214700000000003, -6.8852289999999989, -9.4557760000000002, -8.9364629999999998, -6.4736289999999999, -0.96481800000000006, -6.051482, -9.7846860000000007, -8.5710630000000005, -6.1461209999999999]}) 
result = df.pivot(index='SymmetricDivision', columns='MutProb', values='value') 
sns.heatmap(result, annot=True, fmt="g", cmap='viridis') 
plt.show() 

rendimenti enter image description here

+0

impressionante . grazie @ubuntu – cancerconnector