在R的ggplot2中按delta值从差到优分面排序绘图
R分面图实现分面内delta值排序
数据构造
我有一个名为df的数据框,构造代码如下:
set.seed(123) # 设置随机种子保证可复现 levels <- c('a', 'b', 'c', 'd', 'e') my_var <- sample(levels, 50, replace = TRUE) levels2 <- c('a', 'b', 'c', 'd', 'e','f','h') my_var2 <- sample(levels2, 50, replace = TRUE) delta <- rnorm(50, mean = 0, sd = 1) df = tibble(my_var, my_var2, delta)
需求
希望绘制分面图,要求每个分面内的delta值按从小到大(最差到最优)排序,最差值位于分面左下,最优值位于右上。
当前绘图代码
df %>% mutate(BandRange = factor(my_var2, levels=levels2)) %>% ggplot(aes(x = delta, y = (my_var2), color = "black")) + geom_point(size = 3) + facet_grid(my_var ~., scales="free") + labs(y="my_var2") + geom_vline(xintercept=0) + theme_bw() + theme(legend.position = "none", # 移除图例 axis.text.x = element_text(angle = 0 , hjust = 1), # 设置x轴标签对齐 strip.text.y = element_text(size = 8 , angle = 0, vjust = 0.5), axis.text.y = element_text(size = 7), strip.text = element_text(size = 14), # 增大分面标签尺寸 axis.title = element_text(size = 14), # 增大轴标题尺寸 axis.text = element_text(size = 10))+ # 增大轴文本尺寸 theme(strip.background = element_rect(color="black", size=1.5, linetype="solid"))+ labs(title = "",x = "")
简化测试用数据
为方便测试,可将delta改为1到50的序列,只需实现分面内delta从低到高排序,无需考虑my_var2原有层级:
levels <- c('a', 'b', 'c', 'd', 'e') my_var <- sample(levels, 50, replace = TRUE) levels2 <- c('a', 'b', 'c', 'd', 'e','f','h') my_var2 <- sample(levels2, 50, replace = TRUE) delta <- seq(1,50,1) df = tibble(my_var, my_var2, delta)
解决方案
核心是按分面变量my_var分组,在每个组内根据delta值对my_var2重新排序,并将其转为指定层级的因子,这样ggplot会按排序后的顺序绘制y轴,实现分面内delta从左下到右上递增的效果。
修改后的完整绘图代码:
# 测试用数据构造(如果已生成df可跳过) set.seed(123) levels <- c('a', 'b', 'c', 'd', 'e') my_var <- sample(levels, 50, replace = TRUE) levels2 <- c('a', 'b', 'c', 'd', 'e','f','h') my_var2 <- sample(levels2, 50, replace = TRUE) delta <- seq(1,50,1) df = tibble(my_var, my_var2, delta) # 实现分面内排序的绘图代码 df %>% group_by(my_var) %>% # 按分面变量分组 arrange(delta, .by_group = TRUE) %>% # 每组内按delta升序排序 mutate(my_var2 = factor(my_var2, levels = unique(my_var2))) %>% # 将my_var2转为排序后的因子 ungroup() %>% ggplot(aes(x = delta, y = my_var2, color = "black")) + geom_point(size = 3) + facet_grid(my_var ~., scales="free") + labs(y="my_var2", x = "") + geom_vline(xintercept=0) + theme_bw() + theme(legend.position = "none", axis.text.x = element_text(angle = 0, hjust = 1), strip.text.y = element_text(size = 8, angle = 0, vjust = 0.5), axis.text.y = element_text(size = 7), strip.text = element_text(size = 14), axis.title = element_text(size = 14), axis.text = element_text(size = 10)) + theme(strip.background = element_rect(color="black", size=1.5, linetype="solid"))
关键步骤说明
group_by(my_var):确保每个分面(即每个my_var分组)内单独处理排序arrange(delta, .by_group = TRUE):在每个分组内按delta从小到大排序,保证后续因子层级的顺序正确mutate(my_var2 = factor(my_var2, levels = unique(my_var2))):利用排序后的my_var2的唯一值作为因子层级,这样ggplot绘制y轴时会按这个顺序排列,实现左下为最小delta、右上为最大delta的效果
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

