使用 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)
})
我看到过这个问题的不同变体,但是 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)
})