每个面板中facet_grid中的唯一y轴(行和列)

问题描述 投票:0回答:1

我正在努力为

facet_grid
中的每个面板提供自己的y轴。

所以基本上我希望该图的所有子图都有自己的 y 轴(以便您实际上可以看到数据)。同时,我希望每列都有一个固定的 x 轴,就像现在一样。条带标签也应该像现在一样。

enter image description here


我尝试使用

facet_wrap
来代替,这确实会给每个面板自己的 y 轴。但后来我很难修复每列的 x 轴。
scales="free_y"
修复所有面板中的 x 轴,而不是像
facet_grid
中那样每列。另外,我对每个子图都得到
strip labels
,这也是我不想要的。

.

enter image description here


这是我使用的代码的相关部分以及一些示例数据,这些数据应该足以构建非常相似的图:

BAAM = data.frame(Subject = rep(c("S1", "S2", "S3", "S4"), each=4),
                      Feature = rep(c("Maximum negative\namplitude [µV]", "Duration [sec]", "Descending\nslope [µV/sec]", "Ascending\nslope [µV/sec]"), times=4),
                      mean    = c(-200, 1, 1500, 1600, -210, 1.1, 1300, 1500, -250, 3, 1400, 1600, -50, 0.5, 1000, 1000),
                      dif     = c(20, 0.1, 200, 300, 10, -0.3, -100, 400, 30, 0.4, -200, -200, -20, 0.6, 300, 400))

library(ggplot2)
ggplot(BAAM, aes(x=mean, y=dif)) + 
  geom_point() + 
  # facet_grid(rows=vars(Subject), cols=vars(Feature), scales = "free", switch="both") +
  facet_wrap(Subject+Feature~ ., scales="free_y", ncol = 4, strip.position = "bottom") +  
  theme_minimal() +
  ggtitle("Slow Wave Characteristics - Bland Altman plot") +
  annotate("segment", x=-Inf, xend=Inf, y=-Inf, yend=-Inf)+
  annotate("segment", x=-Inf, xend=-Inf, y=-Inf, yend=Inf)+  
  theme(text = element_text(size = 20),
        axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, hjust=1),
        panel.spacing = unit(2, "lines"),
        strip.placement = "outside",
        strip.switch.pad.wrap = unit(0, "lines"))

如果这篇文章是重复的文章,我很高兴被推荐到相应的帖子。不过,我已经做了广泛的研究。我发现了非常相关的问题,但没有一个完全尝试解决我遇到的完全相同的问题。我非常感谢你的帮助。


更新2019年8月31日

感谢@s_t,我发现了带有

lemon
函数的
facet_rep_grid
包。这仍然不是我想要的,但更近了一步。现在所有子图的轴都可见,但每行的 y 限制仍然相同。我希望每个面板/子图的 y 限制都是单独的。

library(lemon)
facet_rep_grid(rows=vars(Subject), cols=vars(Feature), scales = "free", switch="both", repeat.tick.labels = 'y')

enter image description here

r ggplot2 facet-wrap facet-grid
1个回答
0
投票

聚会有点晚了,但这里有一个选项,它使用

facet_wrap
patchwork
来实现您想要的结果,即我为每个
Subject
或行创建单独的图,然后使用
patchwork
组合它们。

library(ggplot2)
library(patchwork)

BAAM |>
  split(~Subject) |>
  lapply(function(.data) {
    x_title <- unique(.data$Subject)

    remove_strip_x <- if (x_title != "S4") theme(strip.text.x = element_blank())

    ggplot(.data, aes(x = mean, y = dif)) +
      geom_point() +
      labs(y = x_title) +
      facet_wrap(
        facets = vars(Feature),
        scales = "free_y",
        nrow = 1,
        strip.position = "bottom"
      ) +
      annotate("segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf) +
      annotate("segment", x = -Inf, xend = -Inf, y = -Inf, yend = Inf) +
      theme_minimal() +
      remove_strip_x
  }) |>
  wrap_plots(
    ncol = 1
  ) &
  plot_annotation(title = "Slow Wave Characteristics - Bland Altman plot") &
  theme(
    text = element_text(size = 12),
    axis.title.x = element_blank(),
    legend.title = element_blank(),
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.spacing = unit(2, "lines"),
    strip.placement = "outside",
    strip.switch.pad.wrap = unit(0, "lines")
  )

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.