如何基于car包WeightLoss数据集绘制Diet组三月体重损失箱线图
解决WeightLoss数据集Diet组三个月体重损失箱线图绘制问题
错误原因分析
你遇到的Error in group$diet : $ operator is invalid for atomic vectors错误,是因为group是WeightLoss数据集中的因子类型列(原子向量),不是数据框/列表,$操作符只能用于数据框或列表对象,不能直接用在因子向量上。要筛选Diet组,得先从数据集中提取对应行的子集。
解决方案:一张图展示Diet组三个月体重损失
下面提供三种实现方式,按需选择:
方式1:Base R原生实现(无需额外包)
直接利用boxplot的参数完成筛选和绘图,代码简洁高效:
library(car) # 绘制Diet组三个月的体重损失箱线图 boxplot(cbind(wl1, wl2, wl3) ~ group, data = WeightLoss, subset = group == "Diet", # 仅保留Diet组数据 xlab = "Month", ylab = "Weight loss", names = c("1 Month", "2 Months", "3 Months"), # 自定义x轴月份标签 main = "Diet Group Weight Loss Over 3 Months")
- 核心逻辑:用
cbind(wl1, wl2, wl3)把三个月的体重数据合并为矩阵,通过subset = group == "Diet"筛选目标组,names参数替换默认的wl1/wl2/wl3为更直观的月份名称。
方式2:先转长格式再绘图(灵活性更高)
如果需要后续对数据做更多分析处理,先把宽格式(多列体重数据)转成长格式会更方便:
library(car) # 1. 筛选Diet组数据 diet_data <- WeightLoss[WeightLoss$group == "Diet", ] # 2. 转长格式:将wl1/wl2/wl3转为"月份-体重损失"的键值对 long_diet <- stack(diet_data[, c("wl1", "wl2", "wl3")]) colnames(long_diet) <- c("weight_loss", "month") # 替换月份标签为更友好的名称 long_diet$month <- factor(long_diet$month, levels = c("wl1", "wl2", "wl3"), labels = c("1 Month", "2 Months", "3 Months")) # 3. 绘制箱线图 boxplot(weight_loss ~ month, data = long_diet, xlab = "Month", ylab = "Weight loss", main = "Diet Group Weight Loss Over 3 Months")
方式3:Tidyverse + ggplot2(可视化更美观)
如果习惯用tidyverse生态,这种方式代码可读性更强,绘图样式也更易自定义:
library(car) library(tidyverse) WeightLoss %>% filter(group == "Diet") %>% # 筛选Diet组 pivot_longer(cols = starts_with("wl"), # 匹配所有以wl开头的体重列 names_to = "month", values_to = "weight_loss") %>% mutate(month = factor(month, levels = c("wl1", "wl2", "wl3"), labels = c("1 Month", "2 Months", "3 Months"))) %>% ggplot(aes(x = month, y = weight_loss)) + geom_boxplot(fill = "#4292c6") + # 自定义箱线图填充色 labs(x = "Month", y = "Weight loss", title = "Diet Group Weight Loss Over 3 Months") + theme_minimal()
内容的提问来源于stack exchange,提问作者struggling student
相关产品推荐
相关产品推荐

