当x和y都是分类变量时,Marimekko/Mosaic图是一个很好的默认图。什么是使用ggplot创建这些的最佳方式?如何在ggplot2中创建Marimekko/Mosaic图
我能找到的唯一的参考就是这个4yo blog post但这似乎有点过时。现在是否有更好或更容易实现的实现?该GGally封装具有功能ggally_ratio
但是这会产生完全不同的东西:
当x和y都是分类变量时,Marimekko/Mosaic图是一个很好的默认图。什么是使用ggplot创建这些的最佳方式?如何在ggplot2中创建Marimekko/Mosaic图
我能找到的唯一的参考就是这个4yo blog post但这似乎有点过时。现在是否有更好或更容易实现的实现?该GGally封装具有功能ggally_ratio
但是这会产生完全不同的东西:
我做到了我自己一个很久以前,只用geom_bar
,我把它变成一个通用的函数,所以应该在任何两个factors
工作。
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)
谢谢!已经更新了这一点,以整理标签,并允许通过彩色啤酒容易规格的色阶 - 通过[这个要点]下载(https://gist.github.com/docsteveharris/4e12c86ac2dd96bfa2dd5cbf13ba3e53) – drstevok
有一个警告。 “忽略未知的美学:宽度”。也许这可能会更新。 – EngrStudent
我认为Z.Lin在当前的R/Tidyverse实现方面做得很好。 – Edwin
第一次尝试。我不知道如何在轴上放置因子标签。
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)
Plotluck是基于GGPLOT2,其目的是自动化的情节类型的基础上1-3变量的特性选择一个库。它包含一个马赛克图的功能。例如: plotluck(mtcars,vs,gear)
您可以使用GGPLOT2扩展包名为 “ggmosaic”(https://github.com/haleyjeppson/ggmosaic)。
这里给出了带有示例代码和视觉效果的详尽教程https://cran.r-project.org/web/packages/ggmosaic/vignettes/ggmosaic.html。
这可能是一个很好的答案,但ggmosaic有点复杂,也许你应该解释如何得到它的情节,或者至少提供一个可用的代码行。 –
平心而论,提出的问题没有可复制的代码。我添加了对包教程的参考,这将有助于解决问题。 – user2030503
我在某段时间后对某个项目有同样的问题。我的解决方案是结合使用geom_bar
与facet_grid
的scales="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()
您是否尝试过'显卡:: mosaicplot'? –
我想坚持'ggplot2'来扩展它与其他功能(面,等) – Jeroen
不是一个很好的答案,但请参阅http://vita.had.co.nz/papers/prodplots.html – hadley