2017-02-22 17 views
0

У меня есть следующий набор данные в панде DataFrame, который я убирала и сохраненную в "filename1.csv":TypeError при построении Heatmap с Сиборном

import pandas as pd 
df = pd.read_csv("filename1.csv") 
print(df) 

    samples a  b  c  percent_a percent_c ratio_a:b ratio_c:b 
0 sample1 185852 6509042 253303 0.028553 0.038916 35.022717 25.696664 
1 sample2 218178 6456571 273448 0.033792 0.042352 29.593135 23.611696 
2 sample3 251492 6353453 343252 0.039584 0.054026 25.263042 18.509588 
3 sample4 232299 6431376 284522 0.036120 0.044240 27.685767 22.604143 
.............................. 

Я хотел бы построить этот DataFrame как Тепловая карта с использованием Сиборна. Во-первых, было бы интересно посмотреть на образцы (один образец в ряду) в отношении двух колонн, percent_a и percent_c:

import numpy as np 
import seaborn as sns 
import matplotlib.pyplot as plt 
# drop unnecessary columns 
df = df.drop(["a", "b", "c", "ratio_a:b", "ratio_c:b"], axis = 1) 
sns.heatmap(df) 
plt.show() 

Однако это выдает ошибку:

TypeError: ufunc 'isnan' not supported for the input types, and the inputs 
could not be safely coerced to any supported types according to the casting rule ''safe'' 

Первоначально я думал, что это означало, что в этом DataFrame были значения NaN. Однако представляется ошибочным, поскольку

df.isnull().values.any() 

выходы False. Поэтому я подозреваю, что это потому, что samples - это столбец не численных значений.

Как я могу построить морскую теплоизоляцию таким образом, чтобы были показаны эти категориальные значения?

ответ

2

Если вы просто положите столбец "samples", не так ли, что вы ищете ?! Затем вы можете поместить имена образцов позже, используя функцию matplotlib ax.set_yticklabels. Обратите внимание, что вам нужно отменить список имен образцов, так как matplotlib начинает маркировку снизу.

import seaborn as sns 
import matplotlib.pyplot as plt 
import pandas as pd 

df = pd.read_csv("SO_pandassnsheatmap.txt", delim_whitespace=True) 
df2 = df.drop(["samples", "a", "b", "c", "ratio_a:b", "ratio_c:b"], axis = 1) 
ax = sns.heatmap(df2) 
ax.set_yticklabels(df.samples.values[::-1]) 

plt.show() 

enter image description here

+0

Да. Тем не менее, я хотел бы, чтобы ось y отображала имена для «образцов», а не только индексы 0, 1, 2, 3 Как это сделать? – ShanZhengYang

+1

Отредактирован ответ. Это то, что вы имели ввиду? – ImportanceOfBeingErnest

+0

Да, вот что меня смутило. Спасибо! – ShanZhengYang

Смежные вопросы