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

R Markdown中三组KOOS分数随时间变化可视化报错及优化咨询

KOOS评分分组可视化问题分析与解决方案

报错原因

你遇到的Error: Must request at least one colour from a hue palette错误,核心原因是数据集里的BMI_CLASS列全为NA值——虽然它被定义为包含Healthy Weight/Overweight/Obesity三个水平的因子,但没有实际赋值,ggplot无法基于空分组生成颜色映射,因此报错。

查看你提供的数据集结构:

structure(list(BMI_CLASS = structure(c(NA_integer_, NA_integer_, NA_integer_), levels = c("Healthy Weight", "Overweight", "Obesity"), class = "factor"), ...))

三个行对应的BMI_CLASS都是NA,没有匹配到任何分组标签。


第一步:修正数据集

先给BMI_CLASS赋值,对应每行的分组(假设三行依次是健康体重、超重、肥胖):

PROMS_KOOS_BMI$BMI_CLASS <- factor(
  c("Healthy Weight", "Overweight", "Obesity"),
  levels = c("Healthy Weight", "Overweight", "Obesity")
)

第二步:优化长格式转换

原代码的melt只是将宽表转成长表,但TIME列同时包含KOOS指标类型(如SYMP、PAIN)和时间点(PRE、2Y、5Y),导致后续可视化信息杂乱。需要拆分出指标类型和时间点两个独立变量:

library(reshape2)
library(tidyr)
library(ggplot2)

# 转换为基础长格式
PROMS_KOOS_BMI_long <- melt(
  PROMS_KOOS_BMI,
  id.vars = "BMI_CLASS",
  variable.name = "INDICATOR_TIME",
  value.name = "SCORE"
)

# 拆分指标与时间点
PROMS_KOOS_BMI_long <- separate(
  PROMS_KOOS_BMI_long,
  col = INDICATOR_TIME,
  into = c("KOOS_INDICATOR", "TIME_POINT"),
  sep = "_",
  extra = "merge" # 处理KOOS_TOTAL这类带下划线的指标名
)

优化可视化方案

1. 分面柱状图(适合对比分组间的评分差异)

通过分面将不同KOOS指标分开展示,避免信息重叠:

ggplot(PROMS_KOOS_BMI_long, aes(x = TIME_POINT, y = SCORE, fill = BMI_CLASS)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  facet_wrap(~KOOS_INDICATOR, scales = "free_y") + # 每个指标独立展示,Y轴自适应
  labs(
    title = "不同BMI分组的KOOS评分随时间变化对比",
    x = "时间点",
    y = "KOOS评分",
    fill = "BMI分组"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转X轴标签避免重叠

2. 折线图(适合展示时间趋势)

折线图更直观体现评分随时间的变化趋势,搭配数据点增强可读性:

ggplot(PROMS_KOOS_BMI_long, aes(x = TIME_POINT, y = SCORE, color = BMI_CLASS, group = BMI_CLASS)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  facet_wrap(~KOOS_INDICATOR, scales = "free_y") +
  labs(
    title = "不同BMI分组的KOOS评分随时间变化趋势",
    x = "时间点",
    y = "KOOS评分",
    color = "BMI分组"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

3. 单指标聚焦可视化

如果只关注特定指标(如KOOS总评分),可以单独筛选数据后可视化:

# 筛选总评分数据
total_score_data <- subset(PROMS_KOOS_BMI_long, KOOS_INDICATOR == "KOOS_TOTAL")

ggplot(total_score_data, aes(x = TIME_POINT, y = SCORE, fill = BMI_CLASS)) +
  geom_col(position = position_dodge()) +
  labs(
    title = "不同BMI分组的KOOS总评分随时间变化",
    x = "时间点",
    y = "KOOS总评分",
    fill = "BMI分组"
  ) +
  theme_minimal()

原代码问题总结

  1. 核心问题:BMI_CLASS列无实际分组值(全NA),导致ggplot无法生成颜色映射。
  2. 次要问题:长格式转换未拆分指标与时间,可视化时所有指标混在一起,可读性差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:39:53