2014-12-10 4 views
6

Sto cercando un modo per fare una visualizzazione (in realtà abbastanza comune), in cui la divisione di una popolazione di, ad esempio, unità N in diverse categorie viene mostrata tramite un set di N pittogrammi - preferirei quadrati pieni; in un giornale, ecc., si possono vedere piccole forme umanoidi - con ogni pittogramma colorato in base alla categoria di n'unità. N fissato a 1 o 100 e il grafico che visualizza le frazioni o le percentuali anziché i conteggi, sarebbe OK. Le "strisce" colorate dovrebbero avvolgere su più righe. Qualcuno è a conoscenza di questo grafico disponibile in un pacchetto R?Ricercato: visualizzazione pittogramma ripetuto della divisione della popolazione

Per fare un esempio specifico,

x = campione (c ("A", "B"), 100, sostituire = T)

desidero vedere un 10x10 (o 5x20, o qualsiasi altra cosa) griglia di quadrati colorati, alcuni - corrispondenti a "A" - colorati in verde, altri in rosso. I quadrati verdi (e similmente rossi) potrebbero essere "raggruppati" o lasciati nell'ordine originale.

Grazie.

risposta

7

Qui sotto vi mostriamo 3 versioni. Il primo usa i quadrati, il successivo usa i cerchi, il successivo usa l'icona di un uomo e finalmente usiamo facce sorridenti.

Squares

# input data 
set.seed(123) 
x <- sample(c("A","B"),100,replace = T) 

# input parameters - nr * nc should equal length(x) 
cols <- c("green", "red") 
nr <- 10 
nc <- 10 

# create data.frame of positions and colors 
m <- matrix(cols[factor(x)], nr, nc) 
DF <- data.frame(row = c(row(m)), col = c(col(m)[, nc:1]), value = c(m), 
     stringsAsFactors = FALSE) 

# plot squares - modify cex to get different sized squares 
plot(col ~ row, DF, col = DF$value, pch = 15, cex = 4, asp = 1, 
    xlim = c(0, nr), ylim = c(0, nc), 
    axes = FALSE, xlab = "", ylab = "") 

enter image description here

cerchi

# plot circles 
plot(col ~ row, DF, col = DF$value, pch = 20, cex = 6, asp = 1, 
    xlim = c(0, nr), ylim = c(0, nc), 
    axes = FALSE, xlab = "", ylab = "") 

enter image description here

png Icone Questa soluzione utilizza un bianco/nero icon of a man che si presume sia stato salvato nella directory corrente come man.png. Coloriamo di rosso e verde e utilizzare tali due versioni al posto dei quadrati o cerchi:

# blank graph to insert man icons into 
plot(col ~ row, DF, col = DF$value, asp = 1, 
    xlim = c(0, nr), ylim = c(0, nc), 
    axes = FALSE, xlab = "", ylab = "", type = "n") 

library(png) 
man <- readPNG("man.png") 

red.man <- man 
red.man[,,1] <- man[,,4] # fill in red dimension 
R <- subset(DF, value == "red") 
with(R, rasterImage(red.man, 
    row-.5, col-.5, row+.5, col+.5, 
    xlim = c(0, nr), ylim = c(0, nc), 
    xlab = "", ylab = "")) 

green.man <- man 
green.man[,,2] <- man[,,4] # fill in green dimension 
G <- subset(DF, value == "green") 
with(G, rasterImage(green.man, 
    row-.5, col-.5, row+.5, col+.5, 
    xlim = c(0, nr), ylim = c(0, nc), 
    xlab = "", ylab = "")) 

enter image description here

Smiley Icone Questa soluzione utilizza un green smiley face icon e un red frowning face icon cui siamo assunti sono stati salvato nella directory corrente come smiley_green.jpg e smiley_red.jpg.

# blank graph to insert man icons into 
xp <- 1.25 
plot(col ~ row, DF, col = DF$value, asp = 1, 
    xlim = c(0, xp * nr), ylim = c(0, xp * nc), 
    axes = FALSE, xlab = "", ylab = "", type = "n") 

library(jpeg) 
smiley_green <- readJPEG("smiley_green.jpg") 
smiley_red <- readJPEG("smiley_red.jpg")  

R <- subset(transform(DF, row = xp * row, col = xp * col), value == "red") 
with(R, rasterImage(smiley_red, 
    row - .5, col - .5, row + .5, col + .5, 
    xlim = c(0, xp * nr), ylim = c(0, xp * nc), 
    xlab = "", ylab = "")) 

G <- subset(transform(DF, row = xp * row, col = xp * col), value == "green") 
with(G, rasterImage(smiley_green, 
    row - .5, col - .5, row + .5, col + .5, 
    xlim = c(0, xp * nr), ylim = c(0, xp * nc), 
    xlab = "", ylab = "")) 

enter image description here

Revised Per 10x10 versione verde/rosso e ha aggiunto usando l'icona dell'uomo.

2

Il PO ha richiesto una soluzione ggplot2 sul ggplot2 gruppo Google, quindi sto postando anche qui:

ggplot(DF, aes(row, col, fill=value)) + 
    geom_tile(colour="white", lwd=2) + 
    scale_fill_manual(values=c("green","red")) + 
    theme(panel.background=element_blank(), 
     axis.text=element_blank(), 
     axis.ticks=element_blank(), 
     axis.title=element_blank()) + 
    guides(fill=FALSE) 

enter image description here

2

Ho anche fatto un pacchetto per questo (pressoché simultaneamente con quell'altro :-). Ha tre approcci, usando geom_tile, geom_text (usa ad esempio FontAwesome per le icone) e geom_point. Gli ultimi due possono fare ombre, ma a volte devi armeggiare con le impostazioni. Ci sono alcuni more examples here.

devtools::install_github("rubenarslan/formr") 
library(formr) 
qplot_waffle(rep(1:3,each=40,length.out=90)) 
library(ggplot2) 
qplot_waffle_text(rep(1, each = 30), symbol = "", rows = 3) + ggtitle("Number of travellers in 2008") 

simple counts

counts of travellers