为各种data.frames创建相同的绘图
我有三个不同的数据框架(GRCYPT_流量、ESIEIT_流量、GRCYPT_流量),它们包含相同的变量(报告流量、合作伙伴流量、指标、年份、值),但具有不同的级别/观察值。现在我想为每个data.frames创建绘图。因为这些图应该看起来是一样的,所以我似乎有理由使用一个迭代命令。我尝试了foreach循环:为各种data.frames创建相同的绘图,r,ggplot2,foreach,R,Ggplot2,Foreach,我有三个不同的数据框架(GRCYPT_流量、ESIEIT_流量、GRCYPT_流量),它们包含相同的变量(报告流量、合作伙伴流量、指标、年份、值),但具有不同的级别/观察值。现在我想为每个data.frames创建绘图。因为这些图应该看起来是一样的,所以我似乎有理由使用一个迭代命令。我尝试了foreach循环: foreach(i=GRCYPT_flows, ESIEIT_flows, GRCYPT_flows) %do% { ggplot(i, aes(year, value)) + ge
foreach(i=GRCYPT_flows, ESIEIT_flows, GRCYPT_flows) %do% { ggplot(i, aes(year, value)) +
geom_line(aes(colour=partner_ctry, linetype=indicator)) + facet_wrap(~report_ctry) +
theme(axis.text.x=element_text(angle=90, vjust=0.5)) +
scale_x_continuous(breaks=seq(2002, 2012, 2), name="") +
scale_y_continuous(name="Billion Euros") +
scale_colour_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("EA17", "Extra-EA17")) +
scale_linetype_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("Trade", "Capital")) +
theme(legend.title=element_blank())}
该代码实际上不起作用。我在这里面临的问题是:
我想做的是告诉R:“为每个data.frames绘制一个图,并将每个图保存在一个单独的列表中。”这里有一个iris的三个data.frames的示例,为了简单起见,我将其命名为i1、i2和i3
i2 <- i3 <- i1 <- iris
foreach(m = 1:3) %do% {
dat <- paste0("i" , m) %>% get
ggplot(dat, aes(Sepal.Length, Petal.Length)) + geom_line()
}
我认为这里最“R”-y的解决方案是lappy。Lapply获取事物的向量,对所有事物执行相同的操作,然后将输出存储为列表。因为您使用的是ggplot,所以您可能希望所有类似的绘图都有一个组织整齐的列表
首先将数据帧组织在一个列表中
my_data <- list(GRCYPT_flows, ESIEIT_flows)
这将获取列表中的每个元素(“i”)并对其执行自定义函数,其中自定义函数是您精心绘制的图
由于使用的是ggplot,因此可以将这些绘图存储为输出。因此,我的_图将是一个包含所有图的整洁列表
因此,使用完整的绘图功能,请尝试:
my_plot <- lapply(my_data, function(i) {
ggplot(i, aes(year, value)) +
geom_line(aes(colour=partner_ctry, linetype=indicator)) + facet_wrap(~report_ctry) +
theme(axis.text.x=element_text(angle=90, vjust=0.5)) +
scale_x_continuous(breaks=seq(2002, 2012, 2), name="") +
scale_y_continuous(name="Billion Euros") +
scale_colour_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("EA17", "Extra-EA17")) +
scale_linetype_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("Trade", "Capital")) +
theme(legend.title=element_blank())
})
my_plot我建议将绘图代码从循环中分离出来,这样您就可以在一个示例上测试它,然后轻松地为批处理运行它。您可能希望将批处理保存到文件中
library(tidyverse)
myplot <- function(df, filename = NULL) {
df %>%
ggplot(aes(Sepal.Length, Petal.Length)) +
geom_point() ->
result
if(!is.null(filename)) ggsave(filename, plot = result, width = 6, height = 4)
else result
}
# test the plot
myplot(iris)
# do the batch
l <- list(one = iris, two = iris)
l %>% names %>% walk(function(n) myplot(l[[n]], paste0(n, ".pdf")))
库(tidyverse)
myplot%
ggplot(aes(萼片长度、花瓣长度))+
几何点()->
后果
如果(!is.null(filename))ggsave(filename,plot=result,width=6,height=4)
其他结果
}
#测试情节
myplot(虹膜)
#批量生产
l%names%>%walk(函数(n)myplot(l[[n]],粘贴0(n,.pdf”))
您想使用foreach
而不是简单的for
(或list+lappy)有什么原因吗也许您可以将data.frames的字符名列表传递给foreach
,然后使用get
获取实际的data.frame。您可以使用foreach
infrastructure(例如,请参阅)返回列表。@docendodiscimus也许OP可以在某个时候升级以使用并行后端。@docendo discimus:好吧,我愿意接受任何可行的建议。它不一定必须是foreach循环。正如我所说的,我对R完全陌生,不知道有多少命令。这确实有效,但它并不能完全产生我所需要的,因为我希望R将每个绘图存储在一个单独的列表中。在这里,所有绘图都存储在my\u plot
中。另外,当我试图保存我的绘图时,我得到一个错误消息,msg没有适用于“list”类对象的“grid.draw”方法。
my_plot <- lapply(my_data, function(i) {
ggplot(i, aes(year, value)) +
geom_line(aes(colour=partner_ctry, linetype=indicator)) + facet_wrap(~report_ctry) +
theme(axis.text.x=element_text(angle=90, vjust=0.5)) +
scale_x_continuous(breaks=seq(2002, 2012, 2), name="") +
scale_y_continuous(name="Billion Euros") +
scale_colour_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("EA17", "Extra-EA17")) +
scale_linetype_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("Trade", "Capital")) +
theme(legend.title=element_blank())
})
library(tidyverse)
myplot <- function(df, filename = NULL) {
df %>%
ggplot(aes(Sepal.Length, Petal.Length)) +
geom_point() ->
result
if(!is.null(filename)) ggsave(filename, plot = result, width = 6, height = 4)
else result
}
# test the plot
myplot(iris)
# do the batch
l <- list(one = iris, two = iris)
l %>% names %>% walk(function(n) myplot(l[[n]], paste0(n, ".pdf")))