You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:27:08