Jak stworzyć Marimekko / mozaikę w ggplot2

Wykres Marimekko/Mosaic jest ładnym domyślnym wykresem, gdy zarówno x, jak i y są zmiennymi kategorycznymi. Jaki jest najlepszy sposób na ich tworzenie za pomocą ggplot?

przykład

Jedyną referencją, którą mogłem znaleźć, był ten 4yo blog post , ale wydaje się to nieco przestarzałe. Czy są już dostępne jakieś lepsze lub łatwiejsze wdrożenia? Pakiet GGally ma funkcję ggally_ratio ale to daje coś zupełnie innego:

ggally

 30
Author: Community, 2013-10-07

5 answers

Zrobiłem to sam jakiś czas temu, używając tylko geom_bar, przekształciłem go w funkcję ogólną, więc powinna działać na dowolnych dwóch factors. Tutaj wpisz opis obrazka

ggMMplot <- function(var1, var2){
  require(ggplot2)
  levVar1 <- length(levels(var1))
  levVar2 <- length(levels(var2))

  jointTable <- prop.table(table(var1, var2))
  plotData <- as.data.frame(jointTable)
  plotData$marginVar1 <- prop.table(table(var1))
  plotData$var2Height <- plotData$Freq / plotData$marginVar1
  plotData$var1Center <- c(0, cumsum(plotData$marginVar1)[1:levVar1 -1]) +
    plotData$marginVar1 / 2

  ggplot(plotData, aes(var1Center, var2Height)) +
    geom_bar(stat = "identity", aes(width = marginVar1, fill = var2), col = "Black") +
    geom_text(aes(label = as.character(var1), x = var1Center, y = 1.05)) 
  }

ggMMplot(diamonds$cut, diamonds$clarity)
 23
Author: Edwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 07:18:36

Pierwsza próba. Nie jestem jednak pewien, jak umieścić etykiety czynnika na osi.

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)"));
}

Przykład:

makeplot_mosaic(mtcars, vs, gear)

przykład

 9
Author: Jeroen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-08 16:02:50

Jakiś czas temu miałem ten sam problem z projektem. Moim rozwiązaniem było użycie geom_bar wraz z opcją scales="free_x", space="free_x" w facet_grid do dostosowania różnych szerokości prętów:

# 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() 

działka marimekko

 9
Author: Z.Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 07:12:54

Plotluck jest biblioteką opartą na ggplot2 , która ma na celu automatyzację wyboru typu wykresu w oparciu o cechy 1-3 zmiennych. Zawiera funkcję dla działek mozaikowych. Przykład: plotluck(mtcars,vs,gear)

Tutaj wpisz opis obrazka

 3
Author: stefan.schroedl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-17 06:03:54

Możesz użyć pakietu rozszerzeń ggplot2 o nazwie " ggmosaic "( https://github.com/haleyjeppson/ggmosaic).

Obszerny samouczek z przykładowym kodem i efektami wizualnymi znajduje się tutaj https://cran.r-project.org/web/packages/ggmosaic/vignettes/ggmosaic.html .

 3
Author: user2030503,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 15:30:25