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

如何在R语言中为马赛克图的每个区域单独着色?

问题原因

基础包的mosaicplot对二维表默认按行循环着色:color参数的长度只需匹配行数,多余的颜色会被忽略。你设置的4种颜色中,前两种会被分别应用到两行的所有单元格,因此只显示两种颜色。

解决方案

方法1:使用vcd包的mosaic函数(推荐)

vcd包专门用于可视化列联表,支持为每个单元格单独指定颜色,操作更灵活:

  1. 安装并加载包:
install.packages("vcd")
library(vcd)
  1. 用fill参数指定每个单元格的颜色,颜色顺序对应行优先的单元格顺序(先第一行所有列,再第二行所有列):
mosaictable <- matrix(c(1/4*2/3, 3/4*2/3, 1/4*1/3, 3/4*1/3), ncol = 2)
rownames(mosaictable) <- c("Gelb", "Nicht gelb")
colnames(mosaictable) <- c("Gelb", "Nicht gelb")

# 颜色对应顺序:Gelb-Gelb, Gelb-Nicht gelb, Nicht gelb-Gelb, Nicht gelb-Nicht gelb
mosaic(mosaictable, 
       fill = c("gray60", "white", "black", "white"),
       sub = "1. Zug", 
       ylab = "2. Zug", 
       las = 1, 
       main = "Einheitsquadrat")

方法2:基础包手动着色(复杂,不推荐)

如果不想安装额外包,可以先绘制无填充的马赛克图,再用rect函数手动填充单元格(需注意坐标为列优先顺序):

# 绘制无填充的马赛克图,保存坐标信息
mp <- mosaicplot(mosaictable, 
                 sub = "1. Zug", 
                 ylab = "2. Zug", 
                 las = 1, 
                 main = "Einheitsquadrat",
                 color = NA, border = "black")

# 按列优先顺序填充颜色:Gelb-Gelb, Nicht gelb-Gelb, Gelb-Nicht gelb, Nicht gelb-Nicht gelb
colors <- c("gray60", "black", "white", "white")
idx <- 1
for (j in 1:ncol(mp$counts)) {
  for (i in 1:nrow(mp$counts)) {
    rect(mp$x[i], mp$y[j], mp$x[i+1], mp$y[j+1], col = colors[idx])
    idx <- idx + 1
  }
}

内容的提问来源于stack exchange,提问作者Appletini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:32:48