ggplot 多个图形 gridExtra
ggplot multiple figures gridExtra
我知道关于这个话题已经有很多答案了。但是,对于新手来说,还有一些步骤我无法绕过。所以我们开始吧。希望你能帮帮我。
我想 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")
我想我的问题确实是,在执行循环时我不知道我的绘图存储在哪里,所以我可以再次访问它们。
你可以使用优秀的patchwork包:
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)
或者您可以使用 tidyr::pivot_longer
和 facet:
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)
你需要把它们放在一个列表中然后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)
}
我知道关于这个话题已经有很多答案了。但是,对于新手来说,还有一些步骤我无法绕过。所以我们开始吧。希望你能帮帮我。
我想 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")
我想我的问题确实是,在执行循环时我不知道我的绘图存储在哪里,所以我可以再次访问它们。
你可以使用优秀的patchwork包:
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)
或者您可以使用 tidyr::pivot_longer
和 facet:
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)
你需要把它们放在一个列表中然后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)
}