Trazado de datos 2D: mapa de calor con diferentes mapas de colores

Quiero visualizar los datos 2D que tengo. Por ejemplo, a continuación se muestran los datos con cuatro atributos:

att1 att2 att3 fun1 10 0 2 fun2 0 1 3 fun3 1 10 5 fun4 2 3 10 

Quiero asignar a cada punto de datos un color diferente. La intensidad del color dependerá del valor del atributo en esa columna, y cada columna debe tener un color diferente.

A continuación se muestra la imagen deseada:

introduzca la descripción de la imagen aquí

¿Alguien tiene alguna idea de cómo puedo hacerlo en Python o R?

Con Python:

Encontré una mejor manera:

 import pandas as pd import matplotlib.pyplot as plt import matplotlib.cm as cm # data loading df = pd.read_csv("file.csv", index_col=0) # plotting fig,ax = plt.subplots() ax.matshow(df.mask(((df == df) | df.isnull()) & (df.columns != "att1")), cmap=cm.Reds) # You can change the colormap here ax.matshow(df.mask(((df == df) | df.isnull()) & (df.columns != "att2")), cmap=cm.Greens) ax.matshow(df.mask(((df == df) | df.isnull()) & (df.columns != "att3")), cmap=cm.Blues) plt.xticks(range(3), df.columns) plt.yticks(range(4), df.index) plt.show() 

hm

Algunos detalles :

 df.mask(((df == df) | df.isnull()) & (df.columns != "att1")) att1 att2 att3 fun1 10 NaN NaN fun2 0 NaN NaN fun3 1 NaN NaN fun4 2 NaN NaN 

Versión anterior, con matriz enmascarada numpy:

 import pandas as pd import matplotlib.pyplot as plt import matplotlib.cm as cm from numpy.ma import masked_array import numpy as np df = pd.read_clipboard() # just copied your example # define masked arrays to mask all but the given column c1 = masked_array(df, mask=(np.ones_like(df)*(df.values[0]!=df.values[0][0]))) c2 = masked_array(df, mask=(np.ones_like(df)*(df.values[0]!=df.values[0][1]))) c3 = masked_array(df, mask=(np.ones_like(df)*(df.values[0]!=df.values[0][2]))) fig,ax = plt.subplots() ax.matshow(c1,cmap=cm.Reds) # You can change the colormap here ax.matshow(c2,cmap=cm.Greens) ax.matshow(c3,cmap=cm.Blues) plt.xticks(range(3), df.columns) plt.yticks(range(4), df.index) 

Algunos detalles :

df es un dataframe:

  att1 att2 att3 fun1 10 0 2 fun2 0 1 3 fun3 1 10 5 fun4 2 3 10 

c1, c2, c3 son matrices enmascaradas (para las columnas 1, 2 y 3):

 >>> c1 masked_array(data = [[10 -- --] [0 -- --] [1 -- --] [2 -- --]], mask = [[False True True] [False True True] [False True True] [False True True]], fill_value = 999999) 

alternativamente, puede comenzar desde una matriz 2D numpy:

 >> data array([[10, 0, 2], [ 0, 1, 3], [ 1, 10, 5], [ 2, 3, 10]]) 

y reemplace todos los df.values df y df con data (la matriz 2D), excepto en la parte de etiquetado.

Tratar:

 ddf = structure(list(fn = structure(1:4, .Label = c("fun1", "fun2", "fun3", "fun4"), class = "factor"), att1 = c(10L, 0L, 1L, 2L), att2 = c(0L, 1L, 10L, 3L), att3 = c(2L, 3L, 5L, 10L)), .Names = c("fn", "att1", "att2", "att3"), class = "data.frame", row.names = c(NA, -4L)) ddf fn att1 att2 att3 1 fun1 10 0 2 2 fun2 0 1 3 3 fun3 1 10 5 4 fun4 2 3 10 ddfm = melt(ddf) ddfm fn variable value 1 fun1 att1 10 2 fun2 att1 0 3 fun3 att1 1 4 fun4 att1 2 5 fun1 att2 0 6 fun2 att2 1 7 fun3 att2 10 8 fun4 att2 3 9 fun1 att3 2 10 fun2 att3 3 11 fun3 att3 5 12 fun4 att3 10 > ggplot(ddfm)+ geom_tile(aes(x=variable, y=fn, fill=value)) 

introduzca la descripción de la imagen aquí