You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建对角区块同色的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:12:36