首页 > 解决方案 > 使用 apply() 到 ggplot() 创建和保存单个 jpeg

问题描述

我已经看到了这个问题的不同变体,但没有一个可以直接回答我一直遇到的问题。我经常有像这个链接中描述的那样的大型数据集:

从提供的 R 示例中的单个数据框制作多个单独的图:

head(data)
Park_name  Zone Year  Height_mm
1     Park1 Zone1 2011        380
2     Park1 Zone1 2011        510
3     Park1 Zone1 2011        270
4     Park1 Zone2 2011        270
5     Park1 Zone2 2011        230
6     Park1 Zone2 2011        330


# load packages
require(ggplot2)
require(plyr)
# read data 
Y <- read.table("C:/data.csv", sep=",", header=TRUE)
# define the theme
th <- theme_bw() +
  theme(axis.text.x=element_text(),  
        axis.line=element_line(colour="black"), 
        panel.grid.minor = element_blank(),
        panel.grid.major = element_blank(),
        panel.background=element_blank(),
        legend.justification=c(10,10), legend.position=c(10,10), 
        legend.title = element_text(),
        legend.key = element_blank()
    )
# determine park levels
parks <- levels(Y[,"Park_name"])
# apply seperately for each park
p <- lapply(parks, function(park) {
ggplot(Y[Y[, "Park_name"]==park,], aes(x=as.factor(Year), y=Height_mm)) +
  facet_grid(Zone~.) + # show each zone in a seperate facet
  geom_point() + # plot the actual heights (if desired)
  # plot the mean and confidence interval
  stat_summary(fun.data="mean_cl_boot", color="red") 
})       
# finally print your plots
lapply(p, function(x) print(x+th))

我想创建一个单一的情节,为每个公园的区域放入报告附录,绘制年份 x 高度。有时这总计超过 100 个地块。我不想分面换行。我希望这些图是独一无二的,将 jpeg 自动保存到指定文件夹会很棒。我还希望每个图都唯一记录: 1. 唯一的 y 轴标题。(假设高度列的值以英尺和米为单位,您需要数字来确定哪一个。2. 基于公园名称和区域的独特主标题。

这对我来说是一个巨大的挑战,但对于经常使用代码的人来说可能是一个简单的编码问题。我将永远感激帮助,因为我一直需要这种类型的循环。谢谢!

标签: rggplot2jpeglapply

解决方案


我认为您提供的示例的主要问题是循环是在“parks”向量上进行的,该向量仅包含“Park_name”的级别。我认为更好的方法是循环数据,按每个“Park_name”条目进行子集化。

我还假设您有一个带有“单位”变量的列(我在图中将其添加为“单位”);但是,如果不是这种情况,您可以使用dplyr::separate. 我希望你觉得这段代码有用!

# determine park levels
parks <- unique(data[,"Park_name"])

# lapply for each park entry
p <- lapply(parks, function(park) {

  #Subset the data by the each entry in the parks vector
  subdata <- subset(data,data$Park_name == park)

  #Collapse the zone vector as a string
  zones <- paste(unique(subdata[,"Zone"]),
                 collapse = " ")
  ##ggplot
  ggplot(subdata, aes(x=as.factor(Year), y=Height_mm)) +
    facet_grid(Zone~.) + 
    geom_point() + 
    #Add the title and y lab as variables defined by park name, zones and a column with unit information
    labs(title = paste(subdata$Park_name, zones, sep = " "),
         y = paste0("Height (", subdata$Units,")"),
         x = "Year") +

    stat_summary(fun.data="mean_cl_boot", color="red")

  #Save the plot, define your folder location as "C:/myplots/"
  ggsave(filename = paste0(folder, park,".jpeg"),
         device = "jpeg",
         width = 15,
         height = 10,
         units = "cm",
         dpi = 200)
})       

推荐阅读