sheet - r graphics with ggplot2




Come creare un grafico Marimekko/Mosaico in ggplot2 (4)

Il grafico Marimekko / Mosaico è una bella trama di default quando sia x che y sono variabili categoriali. Qual è il modo migliore per crearli usando ggplot?

L'unico riferimento che ho trovato è stato questo post sul blog 4o, ma sembra un po 'sorpassato. Sono disponibili implementazioni migliori o più semplici? Il pacchetto GGally ha una funzione ggally_ratio ma questo produce qualcosa di molto diverso:



Ho avuto lo stesso problema per un progetto qualche tempo fa. La mia soluzione era usare geom_bar insieme con le scales="free_x", space="free_x" in facet_grid per facet_grid a larghezze di barre diverse:

# using diamonds dataset for illustration
df <- diamonds %>%
  group_by(cut, clarity) %>%
  summarise(count = n()) %>%
  mutate(cut.count = sum(count),
         prop = count/sum(count)) %>%
  ungroup()

ggplot(df,
       aes(x = cut, y = prop, width = cut.count, fill = clarity)) +
  geom_bar(stat = "identity", position = "fill", colour = "black") +
  # geom_text(aes(label = scales::percent(prop)), position = position_stack(vjust = 0.5)) + # if labels are desired
  facet_grid(~cut, scales = "free_x", space = "free_x") +
  scale_fill_brewer(palette = "RdYlGn") +
  # theme(panel.spacing.x = unit(0, "npc")) + # if no spacing preferred between bars
  theme_void() 


Un primo tentativo. Non sono sicuro di come mettere le etichette dei fattori sull'asse.

makeplot_mosaic <- function(data, x, y, ...){
  xvar <- deparse(substitute(x))
  yvar <- deparse(substitute(y))
  mydata <- data[c(xvar, yvar)];
  mytable <- table(mydata);
  widths <- c(0, cumsum(apply(mytable, 1, sum)));
  heights <- apply(mytable, 1, function(x){c(0, cumsum(x/sum(x)))});

  alldata <- data.frame();
  allnames <- data.frame();
  for(i in 1:nrow(mytable)){
    for(j in 1:ncol(mytable)){
      alldata <- rbind(alldata, c(widths[i], widths[i+1], heights[j, i], heights[j+1, i]));
    }
  }
  colnames(alldata) <- c("xmin", "xmax", "ymin", "ymax")

  alldata[[xvar]] <- rep(dimnames(mytable)[[1]],rep(ncol(mytable), nrow(mytable)));
  alldata[[yvar]] <- rep(dimnames(mytable)[[2]],nrow(mytable));

  ggplot(alldata, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax)) + 
    geom_rect(color="black", aes_string(fill=yvar)) +
    xlab(paste(xvar, "(count)")) + ylab(paste(yvar, "(proportion)"));
}

Esempio:

makeplot_mosaic(mtcars, vs, gear)


Plotluck è una libreria basata su ggplot2 che mira ad automatizzare la scelta del tipo di trama basata sulle caratteristiche delle variabili 1-3. Contiene una funzione per i grafici a mosaico. Esempio: plotluck(mtcars,vs,gear)





ggplot2