PColormesh único com mais de um mapa de cores usando o Matplotlib
Estou criando uma GUI em que existem dados em tempo real para vários registros ("coisas") e campos. os registros são comparáveis com base no campo, mas os campos não são necessariamente relacionados (pelo menos não na mesma escala). Para minha eventual GUI, quero que a página principal seja um mapa de calor (na verdade, um monte de mapas de calor 1-D com base em colunas (campos)); se você clicar em um, ele fornecerá um histórico de séries temporais e alguns outros gráficos.
Enfim, o que eu estou procurando aqui, está tentando obter o mapa de calor inicial para mostrar da maneira que eu quero. A partir de agora, eu posso fazer com que o pcolormesh do Matplotlib mostre essencialmente mapas de calor 1-D individuais com base no campo, hackeando-o e com o mapa de calor com base no percentil da coluna e adicionando texto do valor real na parte superior.
Mas, como eu disse, os campos não estão necessariamente relacionados e eu gostaria de poder ter mapas de cores individuais para cada campo. Por exemplo: digamos que os campos 3 e 4 estão qualitativamente relacionados um ao outro, mas não aos campos 0-3 - seria bom ter aqueles mapeados para dizer a malha de cores 'verdes' em vez de 'calor frio'.
Aqui está o meu código até agora e o pcolormesh / heatmap resultante:
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()
E o resultado:
Não tive sorte em tentar obter vários mapas de cores para campos separados.