R语言双变量马赛克图绘制求助:镇区与健康评分可视化问题
解决马赛克图(Mosaic Plot)绘制问题
问题分析
你需要的是X轴为9个镇区,每个镇区对应两个健康评分类别(健康评分1、健康评分2+3)的马赛克图,但之前的尝试错误地处理了数据格式:
- 直接传入宽格式数据框时,
mosaicplot会把所有列视为独立分类变量,导致镇区被嵌套在方块内; - 直接用
table()取两个健康评分列,是把不同镇区的计数值当作交叉变量,完全不符合数据逻辑。
解决方案
核心是先把宽格式数据转换为长格式(每行对应一个镇区+健康类别的组合及计数),再构建正确的列联表用于绘制。
步骤1:转换数据格式
使用tidyr包的pivot_longer将宽格式转成长格式(未安装tidyr的话先运行install.packages("tidyr")):
library(tidyr) # 转换为长格式 long_data <- pivot_longer(THSWP1_23, cols = -`Town District`, # 排除镇区列 names_to = "HealthCategory", # 新列名:健康类别 values_to = "Freq") # 新列名:计数
如果不想用tidyr,也可以手动构建长格式数据:
long_data <- data.frame( `Town District` = rep(THSWP1_23$`Town District`, each = 2), HealthCategory = rep(c("health score 1", "Health score 2 and 3"), times = 9), Freq = c(THSWP1_23$`health score 1`, THSWP1_23$`Health score 2 and 3`) )
步骤2:绘制正确的马赛克图
方法1:基于列联表绘制
先通过xtabs构建镇区×健康类别的列联表,再传入mosaicplot:
# 构建列联表 health_table <- xtabs(Freq ~ `Town District` + HealthCategory, data = long_data) # 绘制马赛克图 mosaicplot(health_table, main = "健康评分按镇区分布", xlab = "镇区", ylab = "健康评分类别", color = c("#66c2a5", "#fc8d62"), # 为两个类别设置不同颜色 las = 1) # 让X轴标签横向显示
方法2:直接用公式+权重绘制
无需提前构建列联表,直接在mosaicplot中指定公式和权重列:
mosaicplot(HealthCategory ~ `Town District`, data = long_data, weights = Freq, main = "健康评分按镇区分布", xlab = "镇区", ylab = "健康评分类别", color = c("lightblue", "lightgreen"), las = 1)
效果说明
绘制后的图会以镇区为X轴,每个镇区对应两个矩形块:矩形宽度反映该镇区总人数的占比,高度反映该健康类别在镇区中的占比,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Eonear Black
相关产品推荐
相关产品推荐

