为牛图中的多个图创建公共 x 轴

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

我有多个用

ggplot2
制作的图,我使用
cowplot
排列在一起。它们都具有相同的长度,并且 x 轴在相同位置具有相同的断点,但具有不同的标签。

这是 MWE:

mylist <- list()
mylist[["ID1"]][["sequence"]] <- "AGAATATTATACATTCATCT"
mylist[["ID2"]][["sequence"]] <- "GCTAGCGTTTAGTTTAGCTG"
mylist[["ID3"]][["sequence"]] <- "AACCCTTTAAACTCGAAGTA"
set.seed(123)
mylist[["ID1"]][["data"]] <- data.frame(time=1:100, value=rnorm(100, mean=10, sd=2))
mylist[["ID2"]][["data"]] <- data.frame(time=1:100, value=rnorm(100, mean=2, sd=1))
mylist[["ID3"]][["data"]] <- data.frame(time=1:100, value=rnorm(100, mean=5, sd=3))
indexes <- seq(5, 100, length.out=20)
all_df <- NULL
for (id in names(mylist)){
  seqsplit <- unlist(strsplit(mylist[[id]][["sequence"]], ""))
  ind_df <- data.frame(call=seqsplit, time=indexes)
  final_df <- dplyr::left_join(mylist[[id]][["data"]], ind_df, by="time")
  xcolors <- ifelse(seqsplit=="A", "green", ifelse(seqsplit=="C", "blue", ifelse(seqsplit=="G", "black", "red")))
  P <- ggplot2::ggplot(final_df, ggplot2::aes(x=time, y=value)) +
    ggplot2::geom_line(linewidth=0.5) +
    ggplot2::scale_x_continuous(breaks=indexes, labels=seqsplit, expand=c(0,1)) +
    ggplot2::scale_y_continuous(breaks=seq(-5, 15, 5), limits=c(-5,15)) +
    ggplot2::theme_light() +
    ggplot2::theme(axis.title=ggplot2::element_blank(),
                   axis.text.x=ggtext::element_markdown(face="bold", color=xcolors))
  mylist[[id]][["plot"]] <- P
}
plot_list <- sapply(mylist, "[", "plot")
grDevices::pdf(file="test.pdf", height=4, width=10)
print(
  cowplot::plot_grid(plotlist=plot_list, ncol=1)
)
grDevices::dev.off()

产生:

fig1

我现在想要完成的是,为所有人创建一个共同的x轴,具有共同的

indexes
(或者更确切地说从1到序列的长度),我将其放置在
cowplot
之上;像这样的:

fig2

这可能涉及将 x 轴索引标尺制作为具有相同宽度的单独

ggplot2
(占 y 轴水平空间等),然后将其以适当的相对高度放置在
cowplot
上。 ..欢迎任何帮助!

r ggplot2 axis cowplot
1个回答
0
投票

一种方法是在第一个图的顶部添加辅助 x 轴:

for (id in names(mylist)){
...

  if(id=="ID1") {
    P <- P + scale_x_continuous(breaks=indexes, labels=seqsplit, expand=c(0,1),
         sec.axis = sec_axis(~., breaks=indexes, labels=seq_along(indexes))) + 
         theme(axis.text.x.top = ggtext::element_markdown(
                                 color='white', 
                                 fill="steelblue", 
                                 padding=unit(c(1, 10, 1, 10), "pt")))
  }
  else
    P <- P + scale_x_continuous(breaks=indexes, labels=seqsplit, expand=c(0,1))

  mylist[[id]][["plot"]] <- P
}

enter image description here

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