如何在ggplot点图中按Q2类别的Delay值重排序y轴分类
解决方案
你的核心需求是y轴的星期分类仅按第二季度(Q2)的Delay值升序排列,最小值在y轴底部、最大值在顶部。原有代码的问题是fct_reorder(Weekday, Delay)默认使用所有季度的Delay值的中位数排序,才会出现按Q1排序的情况。
修改后的完整可运行代码如下:
library(tidyverse) # 示例数据,set.seed用于复现结果,可自行删除 set.seed(123) df <- data.frame( Weekday = c("Fri", "Tues", "Mon", "Thurs","Mon", "Tues", "Wed", "Fri","Wed", "Thurs", "Fri"), Quarter = c(rep("Q1", 3), rep("Q2", 5), rep("Q3",3)), Delay = runif(11, -2,5), pval = runif(11, 0,1)) df$Quarter <- factor(df$Quarter, levels = c("Q1", "Q2", "Q3")) # 关键步骤:按Q2的Delay升序设置Weekday的因子水平 q2_sort <- df %>% filter(Quarter == "Q2") %>% arrange(Delay) %>% pull(Weekday) df$Weekday <- factor(df$Weekday, levels = q2_sort) # 绘图代码,删除了原有冗余的group_by语句 df %>% ggplot(aes(x = Quarter, y = Weekday)) + geom_point(aes(size = -log10(pval), color = Delay), alpha = 0.8) + scale_size_binned(range = c(-2, 12)) + scale_color_gradient(low = "mediumblue", high = "red2", space = "Lab") + theme_bw() + theme(axis.text.x = element_text(angle = 25, hjust = 1, size = 10)) + ylab(NULL) + xlab(NULL)
补充说明:
- 如果部分星期在Q2没有对应观测,可以在设置levels时补充
levels = c(q2_sort, 其他缺失的星期值)自定义缺失值的位置 - 如果Q2中同一个星期有多个Delay值,可以在
arrange前先按Weekday分组取Delay的均值/中位数再排序,避免重复值影响顺序
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

