Mapa de calor de datos binarios utilizando R o Python

Tengo un conjunto de datos binarios de 0 y 1, donde 0 es una ausencia y 1 es la presencia de un evento.

Una muestra del conjunto de datos se ve así:

events germany Italy Rain 0 1 hail 1 0 sunny 0 0 

Me gustaría obtener una imagen en rojo y blanco de estos datos en forma de mapa de calor leyendo los datos de un archivo.

Con remodelación y ggplot2 en R

 library(reshape) library(ggplot2) dat <- data.frame(weather=c("Rain","Hail","Sunny"), Germany = c(0,1,0), Italy = c(1,0,0)) melt.data<-melt(dat, id.vars="weather", variable_name="country") qplot(data=melt.data, x=country, y=weather, fill=factor(value), geom="tile")+scale_fill_manual(values=c("0"="white", "1"="red")) 

introduzca la descripción de la imagen aquí

Edición : en respuesta a los comentarios a continuación, aquí hay un archivo de datos de muestra (guardado en el disco como “data.txt”):

 Rain 0 0 0 0 1 0 1 0 0 1 Hail 0 1 0 0 0 0 0 1 0 0 Sunny 1 1 1 0 1 0 1 0 1 1 

En Python, podemos leer las tags y trazar este “mapa de calor” de la siguiente manera:

 from numpy import loadtxt import pylab as plt labels = loadtxt("data.txt", usecols=[0,],dtype=str) A = loadtxt("data.txt", usecols=range(1,10)) plt.imshow(A, interpolation='nearest', cmap=plt.cm.Reds) plt.yticks(range(A.shape[0]), labels) plt.show() import pylab as plt 

introduzca la descripción de la imagen aquí

Ver ?image . Con tus datos

 dat <- data.matrix(data.frame(Germany = c(0,1,0), Italy = c(1,0,0))) rownames(dat) <- c("Rain","Hail","Sunny") 

Esto nos acerca a nosotros:

 image(z = dat, col = c("white","red")) 

pero un mejor manejo de las tags de los ejes sería bueno ... Intente:

 op <- par(mar = c(5,5,4,2) + 0.1) image(z = dat, col = c("white","red"), axes = FALSE) axis(side = 1, labels = rownames(dat), at = seq(0, by = 0.5, length.out = nrow(dat))) axis(side = 2, labels = colnames(dat), at = c(0,1), las = 1) box() par(op) 

Lo que da

mapa de calor binario

Para tener el mapa de calor a la inversa, transponga dat ( image(z = t(dat), ....) ) y realice llamadas en el axis() , cambie de side a 2 en la primera y 1 en la segunda llamada ( y mueva las las = 1 a la otra llamada.

 op <- par(mar = c(5,5,4,2) + 0.1) image(z = t(dat2), col = c("white","red"), axes = FALSE) axis(side = 2, labels = rownames(dat2), at = seq(0, by = 0.5, length.out = nrow(dat2)), las = 1) axis(side = 1, labels = colnames(dat2), at = c(0,1)) box() par(op) 

en R prueba:

 library(bipartite) mat<-matrix(c(0,1,1,0,1,1),byrow=TRUE,nrow=3) rownames(mat)<-c("Rain","hail","sunny") colnames(mat)<-c("Germany","Italy") visweb(mat,type="None") 

Para cuadrados rojos y control de tamaño de etiqueta:

 visweb(mat,type="None",labsize=2,square="b",box.col="red") 

Probablemente la solución más simple en la base R es:

 rownames(dat) = dat$weather heatmap(as.matrix(dat[,2:3]), scale='none') 

… asumiendo que su dataframe se llama dat . El mapa de calor no es bonito pero es rápido y fácil. La primera línea no es necesaria. Solo sirve para hacer que las tags del clima se muestren en el mapa de calor.