для красивого (хорошо, это просто пример!) результата:
даю графический интерфейс, в котором есть живые данные «по времени» для нескольких записей («вещей») и полей. записи сравнимы по полям, но поля не обязательно связаны (по крайней мере, в том же масштабе). Для моего возможного графического интерфейса я хочу, чтобы главной страницей была тепловая карта (на самом деле это набор 1-D тепловых карт, основанных на столбцах (полях), тогда, если вы нажмете одну из них, она даст историю временных рядов и некоторые другие диаграммы.
Во всяком случае, то, что я преследую здесь, пытается получить начальную тепловую карту, чтобы показать, как я хочу. На данный момент я могу получить pcolormesh от Matplotlib, чтобы по существу показать отдельные 1-D тепловые карты, основанные на поле, взломав его и тепловое отображение, основанное на процентиле столбца, а затем добавив текст фактического значения сверху.
Но, как я уже сказал, поля не обязательно связаны между собой, и я хотел бы иметь возможность иметь отдельные цветовые карты для каждого поля. Например: скажем, поля 3 и 4 качественно связаны друг с другом, но не с полями 0-3 - так что было бы неплохо, чтобы те, кто отображен, могли сказать «зелёная» цветовая сетка, а не «прохладный теплый».
Вот мой код и полученный pcolormesh / heatmap:
import pandas as pd
import matplotlib.pyplot as plt
def DFPercentiles(df,bycols=True):
p=pd.DataFrame(index=df.index,columns=df.columns)
if bycols!=True:
for j in df.index:
for i in df.columns:
p.loc[j,i]=(df.loc[j,i]-min(df.loc[j,:]))/(max(df.loc[j,:])-min(df.loc[j,:]))
else:
for i in df.index:
for j in df.columns:
p.loc[i,j]=(df.loc[i,j]-min(df.loc[:,j]))/(max(df.loc[:,j])-min(df.loc[:,j]))
return p
def Heatmap(df,figsize='auto'):
if figsize=='auto':
figsize=[shape(df)[1],shape(df)[0]/2]
fig=figure(figsize=figsize)
pdf=array(DFPercentiles(df,bycols=True)).astype(float)[::-1]
plt.pcolormesh(pdf,cmap=cm.coolwarm,alpha=0.8)
plt.yticks(arange(0.5,len(df)),df.index[::-1])
plt.xticks(arange(0.5,len(df.columns)),df.columns)
for y in range(df.shape[0]):
for x in range(df.shape[1]):
plt.text(x + 0.5, y + 0.5, '%.3f' % df[::-1].iloc[y, x],
horizontalalignment='center',
verticalalignment='center',
)
return plt
hmap=Heatmap(mydf)
hmap.show()
И результат:
Мне не повезло, пытаясь получить несколько цветовых карт для отдельных полей.