r - 使用 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. 基于公园名称和区域的独特主标题。
这对我来说是一个巨大的挑战,但对于经常使用代码的人来说可能是一个简单的编码问题。我将永远感激帮助,因为我一直需要这种类型的循环。谢谢!
解决方案
我认为您提供的示例的主要问题是循环是在“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)
})
推荐阅读
- c# - C# 信号量没有按预期工作,无法弄清楚原因
- google-analytics - 为什么只有一个页面的网站没有 100% 的跳出率
- amp-html - 在 google-amp 中的页面加载时运行脚本并验证为 amp-page
- redis - 如何在 REDIS 中标记一个键,以便稍后我可以删除与该标记匹配的所有键?
- javascript - 我的代码不刷新就无法工作。它没有显示正确的页面颜色
- swift - 更改 IBOutlet 标题时意外发现 nil
- javascript - 如何将两个 html 表单与一个谷歌表格链接?
- amazon-web-services - 未找到字段的值 - AppSync AWS
- python - 查找数据框中的最低时间值
- java - JAVA Hibernate 合并正在更新而不是合并