2013-10-07 47 views
27

當x和y都是分類變量時,Marimekko/Mosaic圖是一個很好的默認圖。什麼是使用ggplot創建這些的最佳方式?如何在ggplot2中創建Marimekko/Mosaic圖

example

我能找到的唯一的參考就是這個4yo blog post但這似乎有點過時。現在是否有更好或更容易實現的實現?該GGally封裝具有功能ggally_ratio但是這會產生完全不同的東西:

ggally

+1

您是否嘗試過'顯卡:: mosaicplot'? –

+5

我想堅持'ggplot2'來擴展它與其他功能(面,等) – Jeroen

+0

不是一個很好的答案,但請參閱http://vita.had.co.nz/papers/prodplots.html – hadley

回答

22

我做到了我自己一個很久以前,只用geom_bar,我把它變成一個通用的函數,所以應該在任何兩個factors工作。 enter image description here

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) 
+1

謝謝!已經更新了這一點,以整理標籤,並允許通過彩色啤酒容易規格的色階 - 通過[這個要點]下載(https://gist.github.com/docsteveharris/4e12c86ac2dd96bfa2dd5cbf13ba3e53) – drstevok

+0

有一個警告。 「忽略未知的美學:寬度」。也許這可能會更新。 – EngrStudent

+0

我認爲Z.Lin在當前的R/Tidyverse實現方面做得很好。 – Edwin

9

第一次嘗試。我不知道如何在軸上放置因子標籤。

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

例子:

makeplot_mosaic(mtcars, vs, gear) 

example

2

Plotluck是基於GGPLOT2,其目的是自動化的情節類型的基礎上1-3變量的特性選擇一個庫。它包含一個馬賽克圖的功能。例如: plotluck(mtcars,vs,gear)

enter image description here

3

您可以使用GGPLOT2擴展包名爲 「ggmosaic」(https://github.com/haleyjeppson/ggmosaic)。

這裏給出了帶有示例代碼和視覺效果的詳盡教程https://cran.r-project.org/web/packages/ggmosaic/vignettes/ggmosaic.html

+1

這可能是一個很好的答案,但ggmosaic有點複雜,也許你應該解釋如何得到它的情節,或者至少提供一個可用的代碼行。 –

+0

平心而論,提出的問題沒有可複製的代碼。我添加了對包教程的參考,這將有助於解決問題。 – user2030503

4

我在某段時間後對某個項目有同樣的問題。我的解決方案是結合使用geom_barfacet_gridscales="free_x", space="free_x"選項,以適應不同的酒吧寬度:

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

marimekko plot