Построение 4 сюжетов на 1 странице с общей легендой в R - PullRequest
1 голос
/ 29 января 2020

У меня есть следующий график:

dat <- data.frame(
  FunctionClass = factor(c("A", "B", "C", "D", "E", "F", "G", "H", "I",     "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "Y", "Z"), levels=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "Y", "Z")),
  legend = c("A: RNA processing and modification", "B: Chromatin structure and dynamics", "C: Energy production and conversion", "D: Cell cycle control, cell division, chromosome partitioning", "E: Amino acid transport and metabolism", "F: Nucleotide transport and metabolism", "G: Carbohydrate transport and metabolism", "H: Coenzyme transport and metabolism", "I: Lipid transport and metabolism", "J: Translation, ribosomal structure and biogenesis", "K: Transcription", "L: Replication, recombination and repair", "M: Cell wall/membrane/envelope biogenesis", "N: Cell motility", "O: Posttranslational modification, protein turnover, chaperones", "P: Inorganic ion transport and metabolism", "Q: Secondary metabolites biosynthesis, transport and catabolism", "R: General function prediction only", "S: Function unknown", "T: Signal transduction mechanisms", "U: Intracellular trafficking, secretion, and vesicular transport", "V: Defense mechanisms", "W: Extracellular structures", "Y: Nuclear structure", "Z: Cytoskeleton"),
  Differential_Abundance=c(2.1,2.2,3.4,3.3,2,1.1,0.1,0.1,-0.3,-0.9,3,2.1,-0.3,-0.9,-2,-1.2,-0.4,-0.5,-3,-2,-0.3,-2.1,-1.3,-2.2,-3),
  Differential_Abundance2=c(2.1,2.2,3.4,3.3,2,1.1,0.1,0.1,-0.3,-0.9,3,2.1,-0.3,-0.9,-2,-1.2,-0.4,-0.5,-3,-2,-0.3,-2.1,-1.3,-2.2,-3),
  Differential_Abundance3=c(2.1,2.2,3.4,3.3,2,1.1,0.1,0.1,-0.3,-0.9,3,2.1,-0.3,-0.9,-2,-1.2,-0.4,-0.5,-3,-2,-0.3,-2.1,-1.3,-2.2,-3),
  Differential_Abundance4=c(2.1,2.2,3.4,3.3,2,1.1,0.1,0.1,-0.3,-0.9,3,2.1,-0.3,-0.9,-2,-1.2,-0.4,-0.5,-3,-2,-0.3,-2.1,-1.3,-2.2,-3)
)
library(ggplot2)

p <- ggplot(data=dat, aes(x=FunctionClass, y=Differential_Abundance, fill=legend))+
  geom_bar(stat="identity", position=position_dodge(), colour="seashell")
p + guides (fill = guide_legend(ncol = 1))+
  coord_flip() +
  scale_x_discrete(limits = rev(levels(dat$FunctionClass))) +
  xlab("COG Class") +
  ylab("Differential Abundance (Treated/Untreated)")

Теперь я хочу 4 одинаковых графика (но с 4 значениями «diffrential_Abundance», но с одной и той же осью Y) на одной странице с 4 отдельными метками ( A, B, C и D). Наверное, мне нужно переместить легенду вниз, так как это заняло бы слишком много места на сайте.

В любом случае?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 29 января 2020

Faceting - это хороший способ включить несколько графиков, имеющих общую легенду.

Сначала я увеличу данные до label. (Я буду использовать случайные данные, чтобы показать, что они отличны на граненом графике.)

set.seed(42)
dataug <- do.call(rbind.data.frame, lapply(c("A", "B", "C", "D"), function(lbl) {
  transform(dat, label = lbl,
            Differential_Abundance = Differential_Abundance + runif(nrow(dat), -2, 1))
}))
# or blindly and less-interestingly
dataug <- rbind(transform(data, label="A"), # first frame
                transform(data, label="B"), # second frame
                transform(data, label="C"), # ...
                transform(data, label="D"))

В вашем случае вы, возможно, уже имеете его, но как отдельные кадры, и в этом случае вам, вероятно, потребуется добавить label= вручную для каждого кадра, а затем объединить их в один кадр, используя rbind. (ggplot2 действительно предпочитает вещи в «длинном» формате, попробуйте повторить c, что я сделал с dataaug.)

Отсюда, просто facet_wrap или facet_grid:

p <- ggplot(data=dataug, aes(x=FunctionClass, y=Differential_Abundance, fill=legend))+
  geom_bar(stat="identity", position=position_dodge(), colour="seashell")
p + guides (fill = guide_legend(ncol = 1))+
  coord_flip() +
  scale_x_discrete(limits = rev(levels(dat$FunctionClass))) +
  xlab("COG Class") +
  ylab("Differential Abundance (Treated/Untreated)") +
  facet_wrap(~ label)                                               # the only addition

faceted plot

Некоторые примечания:

  • facet_*(..., scales=) позволяет оси X и / или оси Y быть «свободным», в противном случае предполагается, что все оси будут одинаковыми между гранями. (Если у вас есть в значительной степени несопоставимые данные, вы можете использовать это, в противном случае, как правило, лучше не изменять их по умолчанию.
  • facet_wrap(..., nrow=, ncol=) позволяет вам определять ширину / высоту (количество ячеек)
  • facet_grid(xfacet ~ yfacet, ...) позволяет вам фасетировать две переменные, по одной на каждую ось фасета. Вероятно, не игрок, учитывая ваши данные и объяснения.

Редактировать : учитывая ваш формат данных, лучше всего конвертировать из "широкого" в "длинный" формат. В StackOverflow есть много ресурсов для этой топи c, но вкратце я рекомендую tidyr::gather для этой задачи:

dataug <- tidyr::gather(dat, label, Differential_Abundance, -FunctionClass, -legend)

Это будет работать с моим кодом расширенного сюжета выше.

1 голос
/ 29 января 2020

Вы можете использовать "ggarrange" из пакета "ggpubr", чтобы объединить несколько вспомогательных участков в одном графике.

library(ggplot2)
library(ggpubr)
dat <- data.frame(
  FunctionClass = factor(c("A", "B", "C", "D", "E", "F", "G", "H", "I",     "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "Y", "Z"), levels=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "Y", "Z")),
  legend = c("A: RNA processing and modification", "B: Chromatin structure and dynamics", "C: Energy production and conversion", "D: Cell cycle control, cell division, chromosome partitioning", "E: Amino acid transport and metabolism", "F: Nucleotide transport and metabolism", "G: Carbohydrate transport and metabolism", "H: Coenzyme transport and metabolism", "I: Lipid transport and metabolism", "J: Translation, ribosomal structure and biogenesis", "K: Transcription", "L: Replication, recombination and repair", "M: Cell wall/membrane/envelope biogenesis", "N: Cell motility", "O: Posttranslational modification, protein turnover, chaperones", "P: Inorganic ion transport and metabolism", "Q: Secondary metabolites biosynthesis, transport and catabolism", "R: General function prediction only", "S: Function unknown", "T: Signal transduction mechanisms", "U: Intracellular trafficking, secretion, and vesicular transport", "V: Defense mechanisms", "W: Extracellular structures", "Y: Nuclear structure", "Z: Cytoskeleton"),
  Differential_Abundance=c(2.1,2.2,3.4,3.3,2,1.1,0.1,0.1,-0.3,-0.9,3,2.1,-0.3,-0.9,-2,-1.2,-0.4,-0.5,-3,-2,-0.3,-2.1,-1.3,-2.2,-3)
)



p <- ggplot(data=dat, aes(x=FunctionClass, y=Differential_Abundance, fill=legend))+
  geom_bar(stat="identity", position=position_dodge(), colour="seashell")

p <- p + 
  coord_flip() +
  scale_x_discrete(limits = rev(levels(dat$FunctionClass))) +
  xlab("COG Class") +
  ylab("Differential Abundance (Treated/Untreated)") + labs(color = '')

p1 <- p
p2 <- p
p3 <- p
p4 <- p

ggarrange(p1,p2,p3,p4, nrow = 1, common.legend = T, legend.position = 'top')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...