在R的ggplot2中修改Y轴显示内容并保留分面排序
解决方案:分面内按delta排序并显示my_var2为Y轴标签
核心思路是直接让my_var2成为按delta升序排列的因子,这样既保留分面内的排序逻辑,Y轴也能直接显示my_var2的原始值,不需要额外拼接标签再提取。
修改后的完整代码:
library(ggplot2) library(dplyr) library(forcats) ## 初始化数据 -------------------------------------- set.seed(123) # 设置随机种子保证可复现 levels <- c('KAMALA-IT', 'HARRIS-HR', 'DONALD-CEO', 'TRUMP-HR', 'BARACK-IT') my_var <- sample(levels, 50, replace = TRUE) levels2 <- c('GEORGIA', 'PENNSYLVANIA', 'WINSCOSIN', 'NORTH CAROLINA', 'NEVADA','ARIZONA','MICHIGAN') my_var2 <- sample(levels2, 50, replace = TRUE) delta <- rnorm(50, mean = 0, sd = 1) df <- tibble(my_var, my_var2, delta) # 关键处理:分组后按delta升序排列,将my_var2转为对应顺序的因子 df <- df |> group_by(my_var) |> arrange(delta, .by_group = TRUE) |> mutate(my_var2 = fct_inorder(my_var2)) # 按当前行顺序设置因子水平 ggplot(df, aes(x = delta, y = my_var2)) + geom_point(colour = "red") + facet_wrap(~my_var, dir = "v", ncol = 1, scales = "free_y")
关键步骤说明
group_by(my_var):按分面变量分组,保证每个分面内独立排序arrange(delta, .by_group = TRUE):在每个分组内按delta从小到大排序fct_inorder(my_var2):将my_var2转换为因子,因子的水平顺序就是排序后的行顺序,ggplot会遵循这个顺序渲染Y轴- 去掉了原代码中拼接
labels列和scale_y_discrete的标签提取逻辑,直接用处理后的my_var2作为Y轴映射,Y轴自然显示原始的州名
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

