ggplot несколько фигур gridExtra - PullRequest
0 голосов
/ 06 мая 2020

Я знаю, что на этот топ c уже есть много ответов. Однако для новичка есть еще несколько шагов, которые я не могу обойти. Итак, здесь мы go. Надеюсь, ты сможешь мне помочь.

Я хочу расположить четыре разных графика 2 на 2. Я использую ggplot, поэтому не могу использовать par(mfrow=c(2,2)) Но по сути это то же самое, что я хочу сделать. Из того, что я прочитал, мне следует использовать gridExtra. Итак, вот мой код:

Plot_Graph <- function(DF, na.rm = TRUE){
  nm = names(DF)[-1]
  for (i in nm) {
   p <- ggplot(DF, aes(x = Date, y = get(i))) +
           geom_line() + 
           scale_x_date(minor_breaks = "1 year") +
           xlab("Year") + 
           ylab("Stock price US$") +
           ggtitle(paste(i)) +
           theme_bw()
   grid.arrange(p)
  }
}

Образец данных:

structure(list(Date = structure(c(10960, 10961, 10962, 10963, 
10966), class = "Date"), AAPL = c(1, 1.01463414634146, 0.926829268292683, 
0.970731707317073, 0.953658536585366), GE = c(1, 0.998263888888889, 
1.01159722222222, 1.05076388888889, 1.05034722222222), SPY = c(1, 
1.00178890876565, 0.985688729874776, 1.04293381037567, 1.04651162790698
), WMT = c(1, 0.976675478152698, 0.990359197636448, 1.06515316436013, 
1.04571606282071)), row.names = c(NA, 5L), class = "data.frame")

Думаю, моя проблема действительно в том, что я не знаю, где хранятся мои графики, при выполнении l oop, чтобы я мог снова получить к ним доступ.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы можете использовать отличный пэчворк пакет:

library(ggplot2)
library(patchwork)

nm <-  names(DF)[-1]

plots <- lapply(nm, function(x) {
  ggplot(DF, aes(x = Date, y = get(x))) +
    geom_line() + 
    scale_x_date(minor_breaks = "1 year") +
    xlab("Year") + 
    ylab("Stock price US$") +
    ggtitle(x) +
    theme_bw()
})

Reduce(`+`, plots) + plot_layout(nrow = 2)

enter image description here

В качестве альтернативы вы можете использовать tidyr::pivot_longer и фасет :

library(ggplot2)
library(tidyr)

DF %>% 
  pivot_longer(-Date) %>% 
  ggplot(aes(Date, value)) +
  geom_line() + 
  scale_x_date(minor_breaks = "1 year") +
  xlab("Year") + 
  ylab("Stock price US$") +
  theme_bw() +
  facet_wrap(~name)

enter image description here

0 голосов
/ 06 мая 2020

Вам нужно поместить их в список, а затем grid.arrange, и постараться не использовать get (), иногда это может вызвать некоторый хаос (на мой взгляд), я использовал !! sym () ниже:

Plot_Graph <- function(DF, na.rm = TRUE){
nm = names(DF)[-1]
plts = lapply(nm,function(i){
   p <- ggplot(DF, aes(x = Date, y = !!sym(i))) +
           geom_line() + 
           scale_x_date(minor_breaks = "1 year") +
           xlab("Year") + 
           ylab("Stock price US$") +
           ggtitle(paste(i)) +
           theme_bw()
    return(p)
   })
grid.arrange(grobs=plts,ncol=2)   
}

enter image description here

...