ggplot2如何在同一图中展示多分类变量效应 可否用pivot_longer实现
R ggplot单图整合多分类变量效应绘图问题
基础数据
我的数据结构如下:
| ID | Time | Score | Var1 | Var 2 | Var 3 |
|---|---|---|---|---|---|
| 1 | 1 | 100 | 1 | 2 | 1 |
| 1 | 2 | 150 | 1 | 2 | 1 |
| 2 | 1 | 200 | 2 | 3 | 4 |
| 2 | 2 | -10 | 2 | 3 | 4 |
| 2 | 3 | -70 | 2 | 3 | 4 |
| 3 | 1 | 100 | 1 | 2 | 2 |
| 3 | 2 | 200 | 1 | 2 | 2 |
绘图需求
- Y轴映射
Score变量,X轴映射Time变量 - 需要在同一个绘图面板中,分别展示
Var1、Var 2两个分类变量各水平对应的Score随Time变化的趋势 - 不接受通过
ggarrange拼接多个独立子图的实现方式 - 咨询是否可以通过
pivot_longer函数完成该需求
现有不符合需求的代码
目前通过拼接两个独立分面图实现的代码如下:
var1_graph=ggplot (DB, aes(Time, Score, group_by = ID))+ facet_wrap(~var1)+ geom_smooth()+ theme_bw() #####Var2 var2_graph = ggplot (DB, aes(Time,Score, group_by=ID))+ facet_wrap(~var2)+ geom_smooth()+ theme_bw() ################ ggarrange(var1_graph, var2_graph, labels = c("A","B"), ncol = 1, nrow = 2)
解决方案
完全可以通过pivot_longer实现该需求,核心逻辑是先把需要展示的两个分类变量转换为长格式,用单独的列标记变量名称和变量水平,之后单次调用ggplot分面即可,无需拼接多个独立绘图对象。
具体实现代码
library(tidyverse) # 1. 宽转长,整合Var1、Var 2两个分类变量 DB_long <- DB %>% pivot_longer( cols = c(Var1, `Var 2`), # 列名带空格需要用反引号包裹 names_to = "var_category", # 存储原变量名(Var1/Var 2) values_to = "var_level" # 存储对应变量的水平值 ) # 2. 单图分面绘图 final_plot <- ggplot(DB_long, aes(x = Time, y = Score, group = ID)) + geom_smooth() + # 按变量类别+水平分面,label_both会同时显示变量名和水平值,可读性更强 facet_wrap(~var_category + var_level, labeller = label_both) + theme_bw() # 输出图形 print(final_plot)
注意:原代码存在参数错误,
group_by是dplyr包的数据分组函数,ggplot2的美学映射中指定分组需要使用group参数,上述代码已修正该问题,否则分组逻辑会出错。
如果希望分类维度更清晰,可以把facet_wrap替换为facet_grid(var_category ~ var_level),实现效果为每一行对应一个分类变量,每一列对应该变量的不同水平,展示逻辑更直观。
内容的提问来源于stack exchange,提问作者Sari Katish
相关产品推荐
相关产品推荐

