我想使用Facet_WRAP在x轴上为不同的组绘制不同的值.但是,当使用scale = "free_x"时,它在每个组中显示唯一的值.请参见下面的示例:

library(ggplot2)
set.seed(1234)
nb = rep(LETTERS[1:3],4)
expand.grid(LETTERS[1:3], 1:3)
df = data.frame(ps = paste(rep(c("ps1","gc1"),6)),
                cr = rep(LETTERS[1:3],4),
                id = rep(x = month.abb[1:4], each = 3));df
df = df[order(df$ps),]
df[df$ps == "ps1","cr"] <- sample(LETTERS[4:6], size = 6, replace = TRUE)
df.all = rbind(df,df,df,df,df,df)
df.all$val = rnorm(n = nrow(df.all))

ggplot(df.all, 
       aes(x = cr,
           y = val)) + 
  geom_violin() +
  facet_wrap(vars(ps, id), 
             scales = "free_x",
             ncol = 4) +
  geom_point(position = position_jitter(width = 0.1, height = 0.1), 
             alpha= .3)

在这里的图像中(这是上面代码的输出),我添加了缺少的级别.基本上,我希望"gc1"组的水平不会下降.但我也不希望"PS1"中的级别出现在"gc1"中.因此,最终gc1应该只显示级别A、B、C和PS1应该只显示D、E和F.有什么方法可以做到这一点吗?

enter image description here

推荐答案

您可以通过使用ggh4x程序包来获得您想要的结果,该程序包允许您 for each 面单独设置刻度,例如,您可以这样做:

library(ggplot2)
library(ggh4x)

ggplot(
  df.all,
  aes(
    x = cr,
    y = val
  )
) +
  geom_violin() +
  geom_point(
    position = position_jitter(width = 0.1, height = 0.1),
    alpha = .3
  ) +
  facet_wrap(vars(ps, id),
    scales = "free_x",
    ncol = 4
  ) +
  facetted_pos_scales(
    x = list(
      ps == "gc1" ~ scale_x_discrete(limits = c("A", "B", "C")),
      ps == "ps1" ~ scale_x_discrete(limits = c("D", "E", "F"))
    )
  )

enter image description here

EDIT这里是根据在ps个组上循环的数据动态创建比例的一种方法,并使用reformulatefacetted_pos_scales创建formula:

library(ggplot2)
library(ggh4x)

scale_x <- lapply(unique(df.all$ps), \(x) {
  reformulate(
    paste0("scale_x_discrete(limits=sort(unique(df.all$cr[df.all$ps =='", x, "'])))"),
    paste0("ps == '", x, "'")
  )  
})

ggplot(
  df.all,
  aes(
    x = cr,
    y = val
  )
) +
  geom_violin() +
  geom_point(
    position = position_jitter(width = 0.1, height = 0.1),
    alpha = .3
  ) +
  facet_wrap(vars(ps, id),
    scales = "free_x",
    ncol = 4
  ) +
  facetted_pos_scales(
    x = scale_x
  )

R相关问答推荐

使用na.locf在长格式数据集中输入具有多个时间点的数据集

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

在垂直轴中包含多个ggplot2图中的平均值

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

隐藏e_mark_line的工具提示

如何编辑ggplot的图例字使用自定义对象(gtable)?'

如何动态更新selectizeInput?

如何在ggplot图中找到第二轴的比例

在保留列表元素属性的同时替换列表元素

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

悬崖三角洲超大型群数计算导致整数溢出

在带有`R`中的`ggmosaic`的马赛克图中使用图案而不是 colored颜色

R+reprex:在呈现R标记文件时创建可重现的示例

减go R中列表的所有唯一元素对

观察器中的inaliateLater的位置

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

如何筛选截止年份之前最后一个测量年度的所有观测值以及截止年份之后所有年份的所有观测值

在ggplot2图表中通过端点连接点

将CSV转换为R中的自定义JSON格式

我怎么才能把一盘棋变成一盘棋呢?