存储ggplots列表的轴名称的最佳方法是什么?

时间:2017-09-28 22:40:00

标签: r list ggplot2

我创建了一个大型数据框(> 100列)

s <- data.frame(x1, x2,....,x100)
var_list <- names(s)

然后我手动为相应的y轴创建另一个包含100个名称的列表:

y_names <- c("Time", "hr", "W m-2"..... 100 items)

最后,我遍历列表以创建一个包含100个图的PDF:

plot_list = list()
for (i in 2:length(var_list)) {
  p = ggplot(s, aes_string(x = x1, y = var_list[i])) +
    geom_line()+
    ylab(y_names[i])+
    ggtitle(paste(var_list[i]))
  plot_list[[i]] = p
}

 # create pdf where each page is a separate plot. ,
pdf("figures.pdf",  width=7, height=1.5)
for (i in 2:length(var_list)) {
  print(plot_list[[i]])
}
dev.off()

显然,这是一个问题,因为我无法确定我是否将正确的y轴给予正确的情节,而不是通过查看最终的情节。如果我必须对订单进行更改,那就完全不同了。

如何以更好的方式设置名称?也许在数据框本身,我可以确定订单?

1 个答案:

答案 0 :(得分:1)

您可以使用查找表和Load函数。这确保了所需的y轴标签始终用于给定的数据列。这是一个例子:

让我们创建一个包含我们想要用于所有可能列名的y标签的查找表。在match中,lookup是数据框var_names的可能列名。 s是我们想要在图中使用的相应y轴标签。

y_lab
lookup = data.frame(var_names=c("wm","hr","time","grp", 'cm'), 
                    y_lab=c("W m-2", "Hour", "Time", "Group","Centimeters"))

现在,在绘制数据时,使用 var_names y_lab 1 wm W m-2 2 hr Hour 3 time Time 4 grp Group 5 cm Centimeters 为图中给定的y列标识正确的match。在下面的示例中,我更改了您的代码示例,以直接使用数据框列名作为循环变量。请注意使用lookup$y_lab函数为match的当前值获取正确的y_lab

yvar

另一种选择是创建所有y值的单面图。这将是这样的:

for (yvar in names(s)[-1]) {
  p = ggplot(s, aes_string(x = "x1", y = yvar)) +
    geom_line() +
    ylab(lookup$y_lab[match(yvar, lookup$var_names)]) +
    ggtitle(yvar)
  plot_list[[yvar]] = p
}