У меня есть несколько сюжетов, созданных с помощью ggplot2
, которые я компоную вместе с помощью cowplot
. Все они имеют одинаковую длину и ось X с одинаковыми разрывами в одних и тех же местах, но с разными метками.
Это МВЕ:
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()
который производит:
Чего я хочу добиться сейчас, так это сделать общую ось X для всех с общим indexes
(или, скорее, от 1 до длины последовательностей), которую я бы поместил поверх cowplot
; что-то вроде этого:
Это, вероятно, потребует создания линейки индексов по оси X как отдельной ggplot2
одинаковой ширины (с учетом горизонтального пространства по оси Y и всего остального), а затем поместит ее на cowplot
с соответствующей относительной высотой... любая помощь добро пожаловать!
Один из способов — добавить дополнительную ось X в верхней части первого графика:
for (id in names(mylist)){
...
P <- ggplot(final_df, ggplot2::aes(x=time, y=value)) +
geom_line(linewidth=0.5) +
scale_y_continuous(breaks=seq(-5, 15, 5), limits=c(-5,15)) +
theme_light()
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.title=element_blank(),
axis.text.x.top = ggtext::element_markdown(color='white', fill = "steelblue",
padding=unit(c(1, 8, 1, 8), "pt")))
}
else {
P <- P + scale_x_continuous(breaks=indexes, labels=seqsplit, expand=c(0,1)) +
theme(axis.title=element_blank(),
axis.text.x=ggtext::element_markdown(face = "bold", color=xcolors))
}
mylist[[id]][["plot"]] <- P
}
Это идеально!
sec.axis
это именно то, что мне было нужно с самого начала... Я думала, что будет сложнее. Спасибо!