2016-06-13 14 views
5

Ich bemühe mich, einen Datenrahmen in Pandas in das richtige Format für Seaborns Heatmap (oder Matplotlib wirklich) zu massieren, um eine Heatmap zu erstellen.seaborn heatmap mit pandas dataframe

Mein aktueller Datenrahmen (genannt data_yule) ist:

 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 

und meine Versuche matplotlib Verwendung war:

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

, die den Fehler warf:

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

und die Seaborn Versuch war:

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

die warf:

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

Es scheint trivial, da beide Funktionen rechteckigen Dataset wollen, aber ich bin etwas fehlt, deutlich.

Antwort

17

Die Daten müssen "pivoted" sein, um wie

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 

Dann können Sie das 2D-Array (oder Dataframe) zu seaborn.heatmap oder plt.pcolor passieren:

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() 

Ausbeuten enter image description here

+0

ehrfürchtige . Danke @ubuntu – cancerconnector