创建对角区块同色的2x2 mosaicplot并消除条纹问题
解决马赛克图条纹问题的方法
出现条纹的核心原因是geom_mosaic默认按原始数据的每一行生成独立小单元,同一类别下的多个重复数据点会被拆成细碎方块堆叠,最终形成视觉条纹。解决思路是先对数据按分组变量汇总频数,再基于汇总后的数据绘图,指定权重为频数,让每个类别生成完整区块。
步骤1:加载必要的包
install.packages(c("ggplot2", "ggmosaic", "dplyr")) library(ggplot2) library(ggmosaic) library(dplyr)
步骤2:汇总数据并定义配色分组
先统计G1和G2每个组合的频数,再基于对角条件定义配色分组C1:
# 原始数据 data <- data.frame(G1 = c("A", "B", "B", "A", "B", "B", "B", "B", "B", "B", "B"), G2 = c("A", "A", "A", "B", "A", "A", "A","A", "B", "B", "B")) # 汇总频数+定义配色分组 data_summary <- data %>% count(G1, G2, name = "freq") %>% mutate(C1 = ifelse((G1 == "A" & G2 == "A") | (G1 == "B" & G2 == "B"), "1", "0"))
步骤3:绘制无条纹的马赛克图
通过weight = freq参数告诉函数用汇总后的频数计算区块大小,避免拆分单个数据点:
ggplot(data_summary) + geom_mosaic(aes(x = product(G1, G2), fill = C1, weight = freq)) + # 自定义配色(可替换为你需要的指定样式) scale_fill_manual(values = c("0" = "#6BAED6", "1" = "#313695"))
替代方案(无需dplyr)
如果不想用dplyr,也可以用table函数直接生成频数表:
data_table <- as.data.frame(table(data$G1, data$G2)) colnames(data_table) <- c("G1", "G2", "freq") data_table$C1 <- ifelse((data_table$G1 == "A" & data_table$G2 == "A") | (data_table$G1 == "B" & data_table$G2 == "B"), "1", "0") ggplot(data_table) + geom_mosaic(aes(x = product(G1, G2), fill = C1, weight = freq)) + scale_fill_manual(values = c("0" = "#6BAED6", "1" = "#313695"))
内容的提问来源于stack exchange,提问作者francis
相关产品推荐
相关产品推荐

