Учитывая следующие данные:
DC,Mode,Mod,Ven,TY1,TY2,TY3,TY4,TY5,TY6,TY7,TY8
Intra,S,Dir,C1,False,False,False,False,False,True,True,False
Intra,S,Co,C1,False,False,False,False,False,False,False,False
Intra,M,Dir,C1,False,False,False,False,False,False,True,False
Inter,S,Co,C1,False,False,False,False,False,False,False,False
Intra,S,Dir,C2,False,True,True,True,True,True,True,False
Intra,S,Co,C2,False,False,False,False,False,False,False,False
Intra,M,Dir,C2,False,False,False,False,False,False,False,False
Inter,S,Co,C2,False,False,False,False,False,False,False,False
Intra,S,Dir,C3,False,False,False,False,True,True,False,False
Intra,S,Co,C3,False,False,False,False,False,False,False,False
Intra,M,Dir,C3,False,False,False,False,False,False,False,False
Inter,S,Co,C3,False,False,False,False,False,False,False,False
Intra,S,Dir,C4,False,False,False,False,False,True,False,True
Intra,S,Co,C4,True,True,True,True,False,True,False,True
Intra,M,Dir,C4,False,False,False,False,False,True,False,True
Inter,S,Co,C4,True,True,True,False,False,True,False,True
Intra,S,Dir,C5,True,True,False,False,False,False,False,False
Intra,S,Co,C5,False,False,False,False,False,False,False,False
Intra,M,Dir,C5,True,True,False,False,False,False,False,False
Inter,S,Co,C5,False,False,False,False,False,False,False,False
Импорт:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
Чтобы воспроизвести мои DataFrame
, скопируйте данные, затем используйте:
df = pd.read_clipboard(sep=',')
Я хотел бы создать сюжет, передающий ту же информацию, что и мой пример, но не обязательно с той же формой (я открыт для предложений).Я также хотел бы навести курсор на цвет и отобразить соответствующий Ven
(например, C1, а не 1).:
Редактировать 2018-10-17:
Два решения, представленные на данный момент, являются полезными, и каждое из них выполняет свой аспект того, что я ищу.Тем не менее, ключевой вопрос, который я хотел бы решить, который не был явно указан до этого редактирования, заключается в следующем:
Я хотел бы выполнить построение без преобразования Ven
вint
;это числовое преобразование не практично с реальными данными.Таким образом, реальная задача вопроса - построить все категориальные данные с двумя категориальными осями.
Проблема, с которой я сталкиваюсь, заключается вданные являются категориальными, а ось Y является многоиндексированной.
Я сделал следующее для преобразования DataFrame
:
# replace False witn nan
df = df.replace(False, np.nan)
# replace True with a number representing Ven (e.g. C1 = 1)
def rep_ven(row):
return row.iloc[4:].replace(True, int(row.Ven[1]))
df.iloc[:, 4:] = df.apply(rep_ven, axis=1)
# drop the Ven column
df = df.drop(columns=['Ven'])
# set multi-index
df_m = df.set_index(['DC', 'Mode', 'Mod'])
Построение преобразованного DataFrame
производит:
plt.figure(figsize=(20,10))
heatmap = plt.imshow(df_m)
plt.xticks(range(len(df_m.columns.values)), df_m.columns.values)
plt.yticks(range(len(df_m.index)), df_m.index)
plt.show()
Этот график не очень обтекаемый, для каждого Ven
есть четыре значения оси.Это подмножество данных, поэтому график будет очень длинным со всеми данными.