如何在R语言中为马赛克图的每个区域单独着色?
问题原因
基础包的mosaicplot对二维表默认按行循环着色:color参数的长度只需匹配行数,多余的颜色会被忽略。你设置的4种颜色中,前两种会被分别应用到两行的所有单元格,因此只显示两种颜色。
解决方案
方法1:使用vcd包的mosaic函数(推荐)
vcd包专门用于可视化列联表,支持为每个单元格单独指定颜色,操作更灵活:
- 安装并加载包:
install.packages("vcd") library(vcd)
- 用
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
相关产品推荐
相关产品推荐

