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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:15:01