R:使用ggplot2和lapply制作多个条形图:如何根据列表插入字幕?

时间:2019-06-22 17:18:47

标签: r ggplot2 lapply

我的目标是使用lapplyggplot2生成并保存多个条形图。为此,我从数据中创建了一个列表。现在,除了字幕之外,其他所有东西都可以正常工作:我想将列表元素的名称插入图形中。到目前为止,我只能插入第一个元素的名称。

我发现了另一篇文章,到目前为止,对我有很大帮助。我是新来的,所以我希望我以正确的方式发布此问题(我没有找到与该其他帖子相关的选项)。

我改编自this question 因为我对那里提供的案件有后续问题。

###creating some random data:

df <- data.frame(value = floor(runif(20,min=0,max=30)), 
                 Intervall = paste("Intervall",rep(1:10,2)), type = rep(c("a", "b")))

list1 <- split(df, df$type)

###producing plots with lapply and ggplot

plots <- lapply(list1, function(x) {
                       ggplot(x, aes(Intervall, value)) + 
                        geom_bar(stat="identity") + 
                        labs(title="Intervalle", subtitle =names(list1))})
lapply(names(plots), 
       function(x) ggsave(filename=paste(x,".emf",sep=""), plot=plots[[x]]))

我列表中的元素称为ab。现在,第一个图应具有字幕"a",第二个图应具有字幕"b"

我该怎么做? (另外,如何在保存之前先在控制台中看到我的图?)

使用names(list1) "a"成为两个图形的字幕…

2 个答案:

答案 0 :(得分:1)

该问题与第二个命令无关。它来自“图”的创建。在subtitle中,我们传递了整个names(list1)而不是相应的元素。如果我们遍历“ list1”的names,则为每个列表元素获取对应的名称变得更加容易,而且list可以基于相同的名称进行子集

plots <- lapply(names(list1), function(nm) {
                       ggplot(list1[[nm]], aes(Intervall, value)) + 
                        geom_bar(stat="identity") + 
                        labs(title="Intervalle", subtitle =nm)})
names(plots) <- names(list1)

现在,我们使用与OP中相同的命令(将.emf更改为.png

lapply(names(plots), function(nm) ggsave(filename =
       paste(path, nm, ".png", sep=""), plot = plots[[nm]]))

-图

enter image description here

enter image description here

答案 1 :(得分:1)

考虑用bysplit代替lapply,并在字幕文件名 type >参数。

# NAMED LIST OF PLOTS
plots <- by(df, df$type, function(sub) {
            p <- ggplot(sub, aes(Intervall, value)) + 
                  geom_bar(stat="identity") + 
                  labs(title="Intervalle", subtitle = sub$type[1])

            ggsave(filename=paste0(sub$type[1],".emf"), plot=p)

            return(p)
         })