使用 apply() 到 ggplot() 创建和保存单个 jpeg

Use apply() to ggplot() to create and save individual jpegs

我看到过这个问题的不同变体,但是 none straight-forward 在回答我经常遇到的问题时是 straight-forward。我经常有像 link:

中描述的那样的大型数据集

Make multiple separate plots from single data frame in 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-axis 头衔。 (假设高度列的值以英尺和米为单位,您需要数字来确定是哪一个。 2. 基于公园名称和区域的独特 main-title。

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

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

我还假设您有一个包含 "units" 变量的列(我在图中将其添加为 "Units");但是,如果不是这种情况,您可以使用 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)
})