为组中的每个级别自动化 ggplot
Automating a ggplot for each level in a group
我的数据包含一列鱼类计数以及相应的每次捕获的时间和地点。
data <- structure(list(year = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L,
2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L,
2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L,
2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L,
2020L, 2020L, 2020L), season = structure(c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L), .Label = c("dry", "wet"), class = "factor"),
site = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L), common_name = structure(c(68L, 92L, 105L, 68L,
92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L,
68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L,
105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L,
92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L,
68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L,
105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L,
92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L,
68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L), .Label = c("Atlantic Mud Crab",
"Atlantic Needlefish", "Banded Blenny", "Banded Brittle Star",
"Banded Killifish", "Bandtail Puffer", "Barracuda spp", "Bigclaw Snapping Shrimp",
"Bigeye Mojarra", "Blenny spp", "Blue Crab", "Blue Crab spp",
"Blue Striped Grunt", "Bluethroat Pikeblenny", "Bonefish",
"Brittle Star spp", "Broadback Mud Crab", "Brown Shrimp",
"Bryozoan Shrimp", "Chain Pipefish", "Checkered Puffer",
"Chub spp", "Clown Goby", "Code Goby", "Combtooth Blenny spp",
"Crested Blenny", "Crested Goby", "Crossbanded Grass Shrimp",
"Cushion Sea Star", "Daggerblade Grass Shrimp", "Darter Goby",
"Dusky Pipefish", "Dwarf Seahorse", "Estuarine Snapping Shrimp",
"False Zostera Shrimp", "Fiddler Crab spp", "Flagfin Mojarra",
"Flatback Mud Crab", "Florida Blenny", "Florida Grass Shrimp",
"Florida Grassflat Crab", "Frillfin Goby", "Fringed Pipefish",
"Furrowed Mud Crab", "Giant Decorator crab", "Giant Tiger Prawn",
"Glass Shrimp", "Goby spp", "Goby spp (Ctenogobius spp)",
"Goldspotted Killifish", "Grass Shrimp (H obliquimanus)",
"Grass Shrimp (Leander spp)", "Grass Shrimp (Nikoides schmitti)",
"Grass Shrimp (P mundusnovus)", "Grass Shrimp (Palaemon spp)",
"Grass Shrimp (Palaemonidae spp)", "Grass Shrimp (Periclimenes spp)",
"Grass Shrimp (Thor spp)", "Grass Shrimp Spp", "Gray Snapper",
"Great Barracuda", "Grunt spp", "Gulf Flounder", "Gulf Killifish",
"Gulf Pipefish", "Gulf Toadfish", "Halfbeak spp", "Hardhead Silverside",
"Harlequin Brittle Star", "Harris Mud Crab", "Highfin Blenny",
"Hogchoker", "Horseshoe Crab", "Iridescent Shrimp", "Jack spp",
"Jewel Cichlid", "Killifish spp", "Least Puffer", "Lesser Blue Crab",
"Lined Seahorse", "Lined Sole", "Lobate Mud Crab", "Longnose Spider Crab",
"Longsnout Seahorse", "Longtail Grass Shrimp", "Mangrove Gambusia",
"Mangrove Rivulus", "Manning Grass Shrimp", "Marsh Killifish",
"Marsh Shrimp", "Mayan Cichlid", "Mojarra spp", "Mud Crab spp",
"Mullet spp", "Needlefish spp", "Oyster Mud Crab", "Pearl Blenny",
"Pinfish", "Pink Shrimp", "Pink Shrimp spp", "Pipefish spp",
"Porgy spp", "Puffer spp", "Pugnose Pipefish", "Rainwater Killifish",
"Red-Algae Shrimp", "Redear Sardine", "Redfin Needlefish",
"Roughneck Shrimp", "Sailfin Molly", "Sailor's Choice", "Saltmarsh Mud Crab",
"Sargassum Fish", "Sargassum Pipefish", "Sargassum Shrimp",
"Sargassum Swimming Crab", "Say Mud Crab", "Schoolmaster Snapper",
"Sea Star spp", "Seabream", "Seahorse spp", "Sheepshead",
"Sheepshead Minnow", "Silver Jenny", "Silverside spp", "Slender Mojarra",
"Slender Sargassum Shrimp", "Small Spine Sea Star", "Smooth Mud Crab",
"Snapper spp", "Snapping Shrimp (A viridari)", "Snapping Shrimp (A. angulosus)",
"Snapping Shrimp spp", "Southern Pink Shrimp", "Southern Puffer",
"Southern Sennet", "Spaghetti Eel", "Speckled Worm Eel",
"Spider Crab spp", "Sponge Spider Crab", "Spotted Pink Shrimp",
"Spotted Whiff", "Squat Grass Shrimp", "Stone Crab", "Striped Mullet",
"Swimming Crab spp", "Timicu", "Tomtate", "Tripletail", "White Grunt",
"White Mullet", "Whitespotted Filefish", "Yellowfin Mojarra",
"Zostera Shrimp"), class = "factor"), num = c(0L, 1L, 0L,
4L, 2L, 0L, 0L, 0L, 4L, 0L, 5L, 24L, 0L, 0L, 0L, 0L, 1L,
5L, 0L, 2L, 3L, 0L, 0L, 38L, 25L, 0L, 14L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 1L, 9L, 0L, 5L, 20L, 10L, 0L, 17L, 0L, 0L, 0L,
66L, 2L, 64L, 0L, 5L, 4L, 0L, 12L, 49L, 0L, 0L, 2L, 0L, 2L,
0L, 0L, 0L, 0L, 0L, 1L, 4L, 0L, 1L, 4L, 0L, 0L, 2L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 16L, 12L, 12L, 0L, 0L, 26L, 2L,
0L, 0L)), class = "data.frame", row.names = c(NA, -90L))
我想创建一个函数,首先汇总每个物种的数据,然后为每个唯一的物种名称保存一个 png 文件图(如果文件名 = NULL,则打印到屏幕上)。我已经走到这一步了,但不确定要解决什么...
GetMatrix=function(data, commonToSum) {
newdat<-filter(data,common_name %in% commonToSum)
cdata2 <- plyr::ddply(data, c("year", "season"), summarise,
N = length(num),
n_mean = mean(num),
n_median = median(num),
sd = sd(num),
se = sd / sqrt(N))
cdata2$year_season <- paste(cdata2$year, "_", cdata2$season, sep = "")
cdata2 <- within(cdata2, year[year == 2005 & season == 'wet'] <- 2005.75)
cdata2 <- within(cdata2, year[year == 2006 & season == 'wet'] <- 2006.75)
cdata2 <- within(cdata2, year[year == 2007 & season == 'wet'] <- 2007.75)
cdata2 <- within(cdata2, year[year == 2008 & season == 'wet'] <- 2008.75)
cdata2 <- within(cdata2, year[year == 2009 & season == 'wet'] <- 2009.75)
cdata2 <- within(cdata2, year[year == 2010 & season == 'wet'] <- 2010.75)
cdata2 <- within(cdata2, year[year == 2011 & season == 'wet'] <- 2011.75)
cdata2 <- within(cdata2, year[year == 2012 & season == 'wet'] <- 2012.75)
cdata2 <- within(cdata2, year[year == 2013 & season == 'wet'] <- 2013.75)
cdata2 <- within(cdata2, year[year == 2014 & season == 'wet'] <- 2014.75)
cdata2 <- within(cdata2, year[year == 2015 & season == 'wet'] <- 2015.75)
cdata2 <- within(cdata2, year[year == 2016 & season == 'wet'] <- 2016.75)
cdata2 <- within(cdata2, year[year == 2017 & season == 'wet'] <- 2017.75)
cdata2 <- within(cdata2, year[year == 2018 & season == 'wet'] <- 2018.75)
cdata2 <- within(cdata2, year[year == 2019 & season == 'wet'] <- 2019.75)
cdata2 <- within(cdata2, year[year == 2020 & season == 'wet'] <- 2020.75)
cdata2 <- within(cdata2, year[year == 2005 & season == 'dry'] <- 2005.25)
cdata2 <- within(cdata2, year[year == 2006 & season == 'dry'] <- 2006.25)
cdata2 <- within(cdata2, year[year == 2007 & season == 'dry'] <- 2007.25)
cdata2 <- within(cdata2, year[year == 2008 & season == 'dry'] <- 2008.25)
cdata2 <- within(cdata2, year[year == 2009 & season == 'dry'] <- 2009.25)
cdata2 <- within(cdata2, year[year == 2010 & season == 'dry'] <- 2010.25)
cdata2 <- within(cdata2, year[year == 2011 & season == 'dry'] <- 2011.25)
cdata2 <- within(cdata2, year[year == 2012 & season == 'dry'] <- 2012.25)
cdata2 <- within(cdata2, year[year == 2013 & season == 'dry'] <- 2013.25)
cdata2 <- within(cdata2, year[year == 2014 & season == 'dry'] <- 2014.25)
cdata2 <- within(cdata2, year[year == 2015 & season == 'dry'] <- 2015.25)
cdata2 <- within(cdata2, year[year == 2016 & season == 'dry'] <- 2016.25)
cdata2 <- within(cdata2, year[year == 2017 & season == 'dry'] <- 2017.25)
cdata2 <- within(cdata2, year[year == 2018 & season == 'dry'] <- 2018.25)
cdata2 <- within(cdata2, year[year == 2019 & season == 'dry'] <- 2019.25)
cdata2 <- within(cdata2, year[year == 2020 & season == 'dry'] <- 2020.25)
}
Plot<-function(data,common_name,fileName=NULL) {
ggplot(cdata2, aes(x = year, y = n_mean, color = season)) +
annotate(geom = "rect", xmin = 2010, xmax = 2010.5, ymin = -Inf, ymax = Inf,
fill = "lightblue", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2013.5, xmax = 2014, ymin = -Inf, ymax = Inf,
fill = "lightgreen", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2017.5, xmax = 2018, ymin = -Inf, ymax = Inf,
fill = "#E0E0E0", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2011.5, xmax = 2012, ymin = -Inf, ymax = Inf,
fill = "pink", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2015.5, xmax = 2016, ymin = -Inf, ymax = Inf,
fill = "pink", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2018.5, xmax = 2019, ymin = -Inf, ymax = Inf,
fill = "orange", colour = NA, alpha = 0.4) +
geom_errorbar(aes(ymin=n_mean-se, ymax=n_mean+se),
width=.2,
color = "black") +
geom_point(color = "black",
shape = 21,
size = 3,
aes(fill = season)) +
scale_fill_manual(values=c("white", "#C0C0C0")) + scale_x_continuous(breaks=c(2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2018,2019,2020)) +
theme(panel.border = element_rect(fill = NA, color = "black"),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
labs(x="Year", y = "Mean count") +
theme(plot.title = element_text(hjust = 0.5)) +
theme(axis.text.y = element_text(size = 10, face = "bold")) +
theme(axis.text.x = element_text(size = 10, face = "bold")) +
theme(axis.title = element_text(size = 14, face = "bold"))
}
spSummary <- data %>%
group_by(common_name) %>%
dplyr::summarize(total.numbers=sum(num)) %>%
arrange(-total.numbers)
spSummary
splist<-spSummary$common_name
dataList<-list()
filenameVal<-paste0(1:length(splist),splist,"- IBBEAM_trend_plot.png")
setwd('C:/Users/...Trend plots')
for(run in 1:length(splist)) {
dataList[[run]]<-GetMatrix(data,splist[run])
Plot(data=dataList[[run]],splist[run],fileName=filenameVal[run])
print(paste(run,splist[run]))
}
这是您修复后的程序代码!!
但是,没有发布数据。
library(tidyverse) ###!!!###
data
GetMatrix=function(data, commonToSum) {
newdat<-filter(data,common_name %in% commonToSum)
cdata2 <- plyr::ddply(data, c("year", "season"), summarise,
N = length(num),
n_mean = mean(num),
n_median = median(num),
sd = sd(num),
se = sd / sqrt(N))
cdata2$year_season <- paste(cdata2$year, "_", cdata2$season, sep = "")
cdata2 <- within(cdata2, year[year == 2005 & season == 'wet'] <- 2005.75)
cdata2 <- within(cdata2, year[year == 2006 & season == 'wet'] <- 2006.75)
cdata2 <- within(cdata2, year[year == 2007 & season == 'wet'] <- 2007.75)
cdata2 <- within(cdata2, year[year == 2008 & season == 'wet'] <- 2008.75)
cdata2 <- within(cdata2, year[year == 2009 & season == 'wet'] <- 2009.75)
cdata2 <- within(cdata2, year[year == 2010 & season == 'wet'] <- 2010.75)
cdata2 <- within(cdata2, year[year == 2011 & season == 'wet'] <- 2011.75)
cdata2 <- within(cdata2, year[year == 2012 & season == 'wet'] <- 2012.75)
cdata2 <- within(cdata2, year[year == 2013 & season == 'wet'] <- 2013.75)
cdata2 <- within(cdata2, year[year == 2014 & season == 'wet'] <- 2014.75)
cdata2 <- within(cdata2, year[year == 2015 & season == 'wet'] <- 2015.75)
cdata2 <- within(cdata2, year[year == 2016 & season == 'wet'] <- 2016.75)
cdata2 <- within(cdata2, year[year == 2017 & season == 'wet'] <- 2017.75)
cdata2 <- within(cdata2, year[year == 2018 & season == 'wet'] <- 2018.75)
cdata2 <- within(cdata2, year[year == 2019 & season == 'wet'] <- 2019.75)
cdata2 <- within(cdata2, year[year == 2020 & season == 'wet'] <- 2020.75)
cdata2 <- within(cdata2, year[year == 2005 & season == 'dry'] <- 2005.25)
cdata2 <- within(cdata2, year[year == 2006 & season == 'dry'] <- 2006.25)
cdata2 <- within(cdata2, year[year == 2007 & season == 'dry'] <- 2007.25)
cdata2 <- within(cdata2, year[year == 2008 & season == 'dry'] <- 2008.25)
cdata2 <- within(cdata2, year[year == 2009 & season == 'dry'] <- 2009.25)
cdata2 <- within(cdata2, year[year == 2010 & season == 'dry'] <- 2010.25)
cdata2 <- within(cdata2, year[year == 2011 & season == 'dry'] <- 2011.25)
cdata2 <- within(cdata2, year[year == 2012 & season == 'dry'] <- 2012.25)
cdata2 <- within(cdata2, year[year == 2013 & season == 'dry'] <- 2013.25)
cdata2 <- within(cdata2, year[year == 2014 & season == 'dry'] <- 2014.25)
cdata2 <- within(cdata2, year[year == 2015 & season == 'dry'] <- 2015.25)
cdata2 <- within(cdata2, year[year == 2016 & season == 'dry'] <- 2016.25)
cdata2 <- within(cdata2, year[year == 2017 & season == 'dry'] <- 2017.25)
cdata2 <- within(cdata2, year[year == 2018 & season == 'dry'] <- 2018.25)
cdata2 <- within(cdata2, year[year == 2019 & season == 'dry'] <- 2019.25)
cdata2 <- within(cdata2, year[year == 2020 & season == 'dry'] <- 2020.25)
cdata2 ###The function has to return something###
}
Plot<-function(data,common_name,fileName=NULL) {
###I changed ggplot(cdata2,... to ggplot(data,...
ggplot(data, aes(x = year, y = n_mean, color = season)) +
annotate(geom = "rect", xmin = 2010, xmax = 2010.5, ymin = -Inf, ymax = Inf,
fill = "lightblue", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2013.5, xmax = 2014, ymin = -Inf, ymax = Inf,
fill = "lightgreen", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2017.5, xmax = 2018, ymin = -Inf, ymax = Inf,
fill = "#E0E0E0", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2011.5, xmax = 2012, ymin = -Inf, ymax = Inf,
fill = "pink", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2015.5, xmax = 2016, ymin = -Inf, ymax = Inf,
fill = "pink", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2018.5, xmax = 2019, ymin = -Inf, ymax = Inf,
fill = "orange", colour = NA, alpha = 0.4) +
geom_errorbar(aes(ymin=n_mean-se, ymax=n_mean+se),
width=.2,
color = "black") +
geom_point(color = "black",
shape = 21,
size = 3,
aes(fill = season)) +
scale_fill_manual(values=c("white", "#C0C0C0")) + scale_x_continuous(breaks=c(2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2018,2019,2020)) +
theme(panel.border = element_rect(fill = NA, color = "black"),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
labs(x="Year", y = "Mean count") +
theme(plot.title = element_text(hjust = 0.5)) +
theme(axis.text.y = element_text(size = 10, face = "bold")) +
theme(axis.text.x = element_text(size = 10, face = "bold")) +
theme(axis.title = element_text(size = 14, face = "bold"))
}
spSummary <- data %>%
group_by(common_name) %>%
dplyr::summarize(total.numbers=sum(num)) %>%
arrange(-total.numbers)
spSummary
splist<-spSummary$common_name
dataList<-list()
filenameVal<-paste0(1:length(splist),splist,"- IBBEAM_trend_plot.png")
setwd('C:/Users/...Trend plots')
for(run in 1:length(splist)) {
dataList[[run]]<-GetMatrix(data,splist[run])
Plot(data=dataList[[run]],splist[run],fileName=filenameVal[run])
print(paste(run,splist[run]))
}
更新 1
好的。让我们看看如何更清晰优雅地完成它。
对于初学者,我假设您的数据位于名为 data
的 data frame
中。
首先,让我们创建一个 GetSummary
汇总函数。这将等同于您的 GetMatrix
.
GetSummary = function(data) data %>%
mutate(year = year+ifelse(season=='wet',0.75,0.25)) %>%
group_by(year, season) %>%
summarise(
.groups = "keep",
N = n(),
n_mean = mean(num),
n_median = median(num),
sd = sd(num),
se = sd / sqrt(N)
)
现在让我们通过按 common_name
对数据进行分组,使用 nest
函数折叠它,并将我们的函数映射到折叠的数据上来做一个简单的突变。
library(tidyverse)
data = data %>%
as_tibble() %>%
mutate(common_name = common_name %>% fct_infreq() %>% fct_drop()) %>%
group_by(common_name) %>%
nest() %>%
mutate(summ = map(data, GetSummary))
data
# A tibble: 3 x 3
# Groups: common_name [3]
# common_name data summ
# <fct> <list> <list>
#1 Hardhead Silverside <tibble [30 x 4]> <grouped_df [6 x 7]>
#2 Mojarra spp <tibble [30 x 4]> <grouped_df [6 x 7]>
#3 Rainwater Killifish <tibble [30 x 4]> <grouped_df [6 x 7]>
这个结果可能有点出乎意料。请注意,您在变量 data
中获取一种鱼类型的数据,并且此数据的摘要在 summ
中。让我们看看 summ
变量中有什么 Hardhead Silverside
fish.
data[1,]$summ
# A tibble: 6 x 7
# Groups: year, season [6]
# year season N n_mean n_median sd se
# <dbl> <fct> <int> <dbl> <int> <dbl> <dbl>
#1 2018. dry 5 0.8 0 1.79 0.8
#2 2019. wet 5 5 0 11.2 5
#3 2019. dry 5 2 0 4.47 2
#4 2020. wet 5 13.2 0 29.5 13.2
#5 2020. dry 5 0 0 0 0
#6 2021. wet 5 3.6 0 6.99 3.12
这就是您所期望的。
现在让我们准备一个创建图形的函数。但首先,让我们将有关彩色矩形的信息写在一个 tibble
.
中
dfAnnot = tribble(
~year, ~fill,
2010, "lightblue",
2011.5, "pink",
2013.5, "lightgreen",
2015.5, "pink",
2017.5, "#E0E0E0",
2018.5, "orange"
)
这样的table以后可以根据自己的需要轻松扩展。
现在我们可以创建一个函数来创建图形并将其保存到 png
文件中。我的 makePlot
函数等同于你的 Plot
函数。
makePlot = function(df, group, dir=""){
data = df$summ[[1]]
plot = data %>% ggplot(aes(year, n_mean, fill=season))+
geom_point(color = "black", shape = 21, size = 3)+
geom_errorbar(aes(ymin = n_mean-se, ymax = n_mean+se), width = .2)+
annotate(xmin = dfAnnot$year, xmax = dfAnnot$year+0.5,
ymin = -Inf, ymax = Inf, fill = dfAnnot$fill,
geom="rect", alpha = 0.4) +
scale_fill_manual(values=c("white", "#C0C0C0"))+
scale_x_continuous(breaks=2005:2020)+
theme(panel.border = element_rect(fill = NA, color = "black"),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
labs(x="Year", y = "Mean count") +
theme(plot.title = element_text(hjust = 0.5)) +
theme(axis.text.y = element_text(size = 10, face = "bold")) +
theme(axis.text.x = element_text(size = 10, face = "bold")) +
theme(axis.title = element_text(size = 14, face = "bold"))+
ggtitle(group$common_name)
ggsave(paste(dir, group$common_name,".png"), plot)
plot
}
通过创建此功能,我试图尽可能接近您的期望。我刚刚添加了一个图表标题。
这个函数的使用非常简单。你只需要两个函数 group_by
和 group_map
.
data %>% group_by(common_name) %>%
group_map(makePlot, dir="plots/")
图表可以在 Plots window 中看到,并且另外保存在 plots 目录中的文件中。我建议在 RStudio 中工作并创建一个项目。您不需要使用 setwd
函数设置目录。
整个过程应该可以正常工作,甚至可以进行更多观察。它也可以在将来轻松扩展(dfAnnot
table)。我希望我的解决方案能够奏效并满足您的期望。
还要记住文件名直接来自 common_name 变量。确保只有那些字符串是有效的文件名。
我的数据包含一列鱼类计数以及相应的每次捕获的时间和地点。
data <- structure(list(year = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L,
2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L,
2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L,
2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L,
2020L, 2020L, 2020L), season = structure(c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L), .Label = c("dry", "wet"), class = "factor"),
site = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L,
5L, 5L, 5L), common_name = structure(c(68L, 92L, 105L, 68L,
92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L,
68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L,
105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L,
92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L,
68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L,
105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L,
92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L,
68L, 92L, 105L, 68L, 92L, 105L, 68L, 92L, 105L), .Label = c("Atlantic Mud Crab",
"Atlantic Needlefish", "Banded Blenny", "Banded Brittle Star",
"Banded Killifish", "Bandtail Puffer", "Barracuda spp", "Bigclaw Snapping Shrimp",
"Bigeye Mojarra", "Blenny spp", "Blue Crab", "Blue Crab spp",
"Blue Striped Grunt", "Bluethroat Pikeblenny", "Bonefish",
"Brittle Star spp", "Broadback Mud Crab", "Brown Shrimp",
"Bryozoan Shrimp", "Chain Pipefish", "Checkered Puffer",
"Chub spp", "Clown Goby", "Code Goby", "Combtooth Blenny spp",
"Crested Blenny", "Crested Goby", "Crossbanded Grass Shrimp",
"Cushion Sea Star", "Daggerblade Grass Shrimp", "Darter Goby",
"Dusky Pipefish", "Dwarf Seahorse", "Estuarine Snapping Shrimp",
"False Zostera Shrimp", "Fiddler Crab spp", "Flagfin Mojarra",
"Flatback Mud Crab", "Florida Blenny", "Florida Grass Shrimp",
"Florida Grassflat Crab", "Frillfin Goby", "Fringed Pipefish",
"Furrowed Mud Crab", "Giant Decorator crab", "Giant Tiger Prawn",
"Glass Shrimp", "Goby spp", "Goby spp (Ctenogobius spp)",
"Goldspotted Killifish", "Grass Shrimp (H obliquimanus)",
"Grass Shrimp (Leander spp)", "Grass Shrimp (Nikoides schmitti)",
"Grass Shrimp (P mundusnovus)", "Grass Shrimp (Palaemon spp)",
"Grass Shrimp (Palaemonidae spp)", "Grass Shrimp (Periclimenes spp)",
"Grass Shrimp (Thor spp)", "Grass Shrimp Spp", "Gray Snapper",
"Great Barracuda", "Grunt spp", "Gulf Flounder", "Gulf Killifish",
"Gulf Pipefish", "Gulf Toadfish", "Halfbeak spp", "Hardhead Silverside",
"Harlequin Brittle Star", "Harris Mud Crab", "Highfin Blenny",
"Hogchoker", "Horseshoe Crab", "Iridescent Shrimp", "Jack spp",
"Jewel Cichlid", "Killifish spp", "Least Puffer", "Lesser Blue Crab",
"Lined Seahorse", "Lined Sole", "Lobate Mud Crab", "Longnose Spider Crab",
"Longsnout Seahorse", "Longtail Grass Shrimp", "Mangrove Gambusia",
"Mangrove Rivulus", "Manning Grass Shrimp", "Marsh Killifish",
"Marsh Shrimp", "Mayan Cichlid", "Mojarra spp", "Mud Crab spp",
"Mullet spp", "Needlefish spp", "Oyster Mud Crab", "Pearl Blenny",
"Pinfish", "Pink Shrimp", "Pink Shrimp spp", "Pipefish spp",
"Porgy spp", "Puffer spp", "Pugnose Pipefish", "Rainwater Killifish",
"Red-Algae Shrimp", "Redear Sardine", "Redfin Needlefish",
"Roughneck Shrimp", "Sailfin Molly", "Sailor's Choice", "Saltmarsh Mud Crab",
"Sargassum Fish", "Sargassum Pipefish", "Sargassum Shrimp",
"Sargassum Swimming Crab", "Say Mud Crab", "Schoolmaster Snapper",
"Sea Star spp", "Seabream", "Seahorse spp", "Sheepshead",
"Sheepshead Minnow", "Silver Jenny", "Silverside spp", "Slender Mojarra",
"Slender Sargassum Shrimp", "Small Spine Sea Star", "Smooth Mud Crab",
"Snapper spp", "Snapping Shrimp (A viridari)", "Snapping Shrimp (A. angulosus)",
"Snapping Shrimp spp", "Southern Pink Shrimp", "Southern Puffer",
"Southern Sennet", "Spaghetti Eel", "Speckled Worm Eel",
"Spider Crab spp", "Sponge Spider Crab", "Spotted Pink Shrimp",
"Spotted Whiff", "Squat Grass Shrimp", "Stone Crab", "Striped Mullet",
"Swimming Crab spp", "Timicu", "Tomtate", "Tripletail", "White Grunt",
"White Mullet", "Whitespotted Filefish", "Yellowfin Mojarra",
"Zostera Shrimp"), class = "factor"), num = c(0L, 1L, 0L,
4L, 2L, 0L, 0L, 0L, 4L, 0L, 5L, 24L, 0L, 0L, 0L, 0L, 1L,
5L, 0L, 2L, 3L, 0L, 0L, 38L, 25L, 0L, 14L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 1L, 9L, 0L, 5L, 20L, 10L, 0L, 17L, 0L, 0L, 0L,
66L, 2L, 64L, 0L, 5L, 4L, 0L, 12L, 49L, 0L, 0L, 2L, 0L, 2L,
0L, 0L, 0L, 0L, 0L, 1L, 4L, 0L, 1L, 4L, 0L, 0L, 2L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 16L, 12L, 12L, 0L, 0L, 26L, 2L,
0L, 0L)), class = "data.frame", row.names = c(NA, -90L))
我想创建一个函数,首先汇总每个物种的数据,然后为每个唯一的物种名称保存一个 png 文件图(如果文件名 = NULL,则打印到屏幕上)。我已经走到这一步了,但不确定要解决什么...
GetMatrix=function(data, commonToSum) {
newdat<-filter(data,common_name %in% commonToSum)
cdata2 <- plyr::ddply(data, c("year", "season"), summarise,
N = length(num),
n_mean = mean(num),
n_median = median(num),
sd = sd(num),
se = sd / sqrt(N))
cdata2$year_season <- paste(cdata2$year, "_", cdata2$season, sep = "")
cdata2 <- within(cdata2, year[year == 2005 & season == 'wet'] <- 2005.75)
cdata2 <- within(cdata2, year[year == 2006 & season == 'wet'] <- 2006.75)
cdata2 <- within(cdata2, year[year == 2007 & season == 'wet'] <- 2007.75)
cdata2 <- within(cdata2, year[year == 2008 & season == 'wet'] <- 2008.75)
cdata2 <- within(cdata2, year[year == 2009 & season == 'wet'] <- 2009.75)
cdata2 <- within(cdata2, year[year == 2010 & season == 'wet'] <- 2010.75)
cdata2 <- within(cdata2, year[year == 2011 & season == 'wet'] <- 2011.75)
cdata2 <- within(cdata2, year[year == 2012 & season == 'wet'] <- 2012.75)
cdata2 <- within(cdata2, year[year == 2013 & season == 'wet'] <- 2013.75)
cdata2 <- within(cdata2, year[year == 2014 & season == 'wet'] <- 2014.75)
cdata2 <- within(cdata2, year[year == 2015 & season == 'wet'] <- 2015.75)
cdata2 <- within(cdata2, year[year == 2016 & season == 'wet'] <- 2016.75)
cdata2 <- within(cdata2, year[year == 2017 & season == 'wet'] <- 2017.75)
cdata2 <- within(cdata2, year[year == 2018 & season == 'wet'] <- 2018.75)
cdata2 <- within(cdata2, year[year == 2019 & season == 'wet'] <- 2019.75)
cdata2 <- within(cdata2, year[year == 2020 & season == 'wet'] <- 2020.75)
cdata2 <- within(cdata2, year[year == 2005 & season == 'dry'] <- 2005.25)
cdata2 <- within(cdata2, year[year == 2006 & season == 'dry'] <- 2006.25)
cdata2 <- within(cdata2, year[year == 2007 & season == 'dry'] <- 2007.25)
cdata2 <- within(cdata2, year[year == 2008 & season == 'dry'] <- 2008.25)
cdata2 <- within(cdata2, year[year == 2009 & season == 'dry'] <- 2009.25)
cdata2 <- within(cdata2, year[year == 2010 & season == 'dry'] <- 2010.25)
cdata2 <- within(cdata2, year[year == 2011 & season == 'dry'] <- 2011.25)
cdata2 <- within(cdata2, year[year == 2012 & season == 'dry'] <- 2012.25)
cdata2 <- within(cdata2, year[year == 2013 & season == 'dry'] <- 2013.25)
cdata2 <- within(cdata2, year[year == 2014 & season == 'dry'] <- 2014.25)
cdata2 <- within(cdata2, year[year == 2015 & season == 'dry'] <- 2015.25)
cdata2 <- within(cdata2, year[year == 2016 & season == 'dry'] <- 2016.25)
cdata2 <- within(cdata2, year[year == 2017 & season == 'dry'] <- 2017.25)
cdata2 <- within(cdata2, year[year == 2018 & season == 'dry'] <- 2018.25)
cdata2 <- within(cdata2, year[year == 2019 & season == 'dry'] <- 2019.25)
cdata2 <- within(cdata2, year[year == 2020 & season == 'dry'] <- 2020.25)
}
Plot<-function(data,common_name,fileName=NULL) {
ggplot(cdata2, aes(x = year, y = n_mean, color = season)) +
annotate(geom = "rect", xmin = 2010, xmax = 2010.5, ymin = -Inf, ymax = Inf,
fill = "lightblue", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2013.5, xmax = 2014, ymin = -Inf, ymax = Inf,
fill = "lightgreen", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2017.5, xmax = 2018, ymin = -Inf, ymax = Inf,
fill = "#E0E0E0", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2011.5, xmax = 2012, ymin = -Inf, ymax = Inf,
fill = "pink", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2015.5, xmax = 2016, ymin = -Inf, ymax = Inf,
fill = "pink", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2018.5, xmax = 2019, ymin = -Inf, ymax = Inf,
fill = "orange", colour = NA, alpha = 0.4) +
geom_errorbar(aes(ymin=n_mean-se, ymax=n_mean+se),
width=.2,
color = "black") +
geom_point(color = "black",
shape = 21,
size = 3,
aes(fill = season)) +
scale_fill_manual(values=c("white", "#C0C0C0")) + scale_x_continuous(breaks=c(2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2018,2019,2020)) +
theme(panel.border = element_rect(fill = NA, color = "black"),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
labs(x="Year", y = "Mean count") +
theme(plot.title = element_text(hjust = 0.5)) +
theme(axis.text.y = element_text(size = 10, face = "bold")) +
theme(axis.text.x = element_text(size = 10, face = "bold")) +
theme(axis.title = element_text(size = 14, face = "bold"))
}
spSummary <- data %>%
group_by(common_name) %>%
dplyr::summarize(total.numbers=sum(num)) %>%
arrange(-total.numbers)
spSummary
splist<-spSummary$common_name
dataList<-list()
filenameVal<-paste0(1:length(splist),splist,"- IBBEAM_trend_plot.png")
setwd('C:/Users/...Trend plots')
for(run in 1:length(splist)) {
dataList[[run]]<-GetMatrix(data,splist[run])
Plot(data=dataList[[run]],splist[run],fileName=filenameVal[run])
print(paste(run,splist[run]))
}
这是您修复后的程序代码!! 但是,没有发布数据。
library(tidyverse) ###!!!###
data
GetMatrix=function(data, commonToSum) {
newdat<-filter(data,common_name %in% commonToSum)
cdata2 <- plyr::ddply(data, c("year", "season"), summarise,
N = length(num),
n_mean = mean(num),
n_median = median(num),
sd = sd(num),
se = sd / sqrt(N))
cdata2$year_season <- paste(cdata2$year, "_", cdata2$season, sep = "")
cdata2 <- within(cdata2, year[year == 2005 & season == 'wet'] <- 2005.75)
cdata2 <- within(cdata2, year[year == 2006 & season == 'wet'] <- 2006.75)
cdata2 <- within(cdata2, year[year == 2007 & season == 'wet'] <- 2007.75)
cdata2 <- within(cdata2, year[year == 2008 & season == 'wet'] <- 2008.75)
cdata2 <- within(cdata2, year[year == 2009 & season == 'wet'] <- 2009.75)
cdata2 <- within(cdata2, year[year == 2010 & season == 'wet'] <- 2010.75)
cdata2 <- within(cdata2, year[year == 2011 & season == 'wet'] <- 2011.75)
cdata2 <- within(cdata2, year[year == 2012 & season == 'wet'] <- 2012.75)
cdata2 <- within(cdata2, year[year == 2013 & season == 'wet'] <- 2013.75)
cdata2 <- within(cdata2, year[year == 2014 & season == 'wet'] <- 2014.75)
cdata2 <- within(cdata2, year[year == 2015 & season == 'wet'] <- 2015.75)
cdata2 <- within(cdata2, year[year == 2016 & season == 'wet'] <- 2016.75)
cdata2 <- within(cdata2, year[year == 2017 & season == 'wet'] <- 2017.75)
cdata2 <- within(cdata2, year[year == 2018 & season == 'wet'] <- 2018.75)
cdata2 <- within(cdata2, year[year == 2019 & season == 'wet'] <- 2019.75)
cdata2 <- within(cdata2, year[year == 2020 & season == 'wet'] <- 2020.75)
cdata2 <- within(cdata2, year[year == 2005 & season == 'dry'] <- 2005.25)
cdata2 <- within(cdata2, year[year == 2006 & season == 'dry'] <- 2006.25)
cdata2 <- within(cdata2, year[year == 2007 & season == 'dry'] <- 2007.25)
cdata2 <- within(cdata2, year[year == 2008 & season == 'dry'] <- 2008.25)
cdata2 <- within(cdata2, year[year == 2009 & season == 'dry'] <- 2009.25)
cdata2 <- within(cdata2, year[year == 2010 & season == 'dry'] <- 2010.25)
cdata2 <- within(cdata2, year[year == 2011 & season == 'dry'] <- 2011.25)
cdata2 <- within(cdata2, year[year == 2012 & season == 'dry'] <- 2012.25)
cdata2 <- within(cdata2, year[year == 2013 & season == 'dry'] <- 2013.25)
cdata2 <- within(cdata2, year[year == 2014 & season == 'dry'] <- 2014.25)
cdata2 <- within(cdata2, year[year == 2015 & season == 'dry'] <- 2015.25)
cdata2 <- within(cdata2, year[year == 2016 & season == 'dry'] <- 2016.25)
cdata2 <- within(cdata2, year[year == 2017 & season == 'dry'] <- 2017.25)
cdata2 <- within(cdata2, year[year == 2018 & season == 'dry'] <- 2018.25)
cdata2 <- within(cdata2, year[year == 2019 & season == 'dry'] <- 2019.25)
cdata2 <- within(cdata2, year[year == 2020 & season == 'dry'] <- 2020.25)
cdata2 ###The function has to return something###
}
Plot<-function(data,common_name,fileName=NULL) {
###I changed ggplot(cdata2,... to ggplot(data,...
ggplot(data, aes(x = year, y = n_mean, color = season)) +
annotate(geom = "rect", xmin = 2010, xmax = 2010.5, ymin = -Inf, ymax = Inf,
fill = "lightblue", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2013.5, xmax = 2014, ymin = -Inf, ymax = Inf,
fill = "lightgreen", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2017.5, xmax = 2018, ymin = -Inf, ymax = Inf,
fill = "#E0E0E0", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2011.5, xmax = 2012, ymin = -Inf, ymax = Inf,
fill = "pink", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2015.5, xmax = 2016, ymin = -Inf, ymax = Inf,
fill = "pink", colour = NA, alpha = 0.4) +
annotate(geom = "rect", xmin = 2018.5, xmax = 2019, ymin = -Inf, ymax = Inf,
fill = "orange", colour = NA, alpha = 0.4) +
geom_errorbar(aes(ymin=n_mean-se, ymax=n_mean+se),
width=.2,
color = "black") +
geom_point(color = "black",
shape = 21,
size = 3,
aes(fill = season)) +
scale_fill_manual(values=c("white", "#C0C0C0")) + scale_x_continuous(breaks=c(2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2018,2019,2020)) +
theme(panel.border = element_rect(fill = NA, color = "black"),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
labs(x="Year", y = "Mean count") +
theme(plot.title = element_text(hjust = 0.5)) +
theme(axis.text.y = element_text(size = 10, face = "bold")) +
theme(axis.text.x = element_text(size = 10, face = "bold")) +
theme(axis.title = element_text(size = 14, face = "bold"))
}
spSummary <- data %>%
group_by(common_name) %>%
dplyr::summarize(total.numbers=sum(num)) %>%
arrange(-total.numbers)
spSummary
splist<-spSummary$common_name
dataList<-list()
filenameVal<-paste0(1:length(splist),splist,"- IBBEAM_trend_plot.png")
setwd('C:/Users/...Trend plots')
for(run in 1:length(splist)) {
dataList[[run]]<-GetMatrix(data,splist[run])
Plot(data=dataList[[run]],splist[run],fileName=filenameVal[run])
print(paste(run,splist[run]))
}
更新 1
好的。让我们看看如何更清晰优雅地完成它。
对于初学者,我假设您的数据位于名为 data
的 data frame
中。
首先,让我们创建一个 GetSummary
汇总函数。这将等同于您的 GetMatrix
.
GetSummary = function(data) data %>%
mutate(year = year+ifelse(season=='wet',0.75,0.25)) %>%
group_by(year, season) %>%
summarise(
.groups = "keep",
N = n(),
n_mean = mean(num),
n_median = median(num),
sd = sd(num),
se = sd / sqrt(N)
)
现在让我们通过按 common_name
对数据进行分组,使用 nest
函数折叠它,并将我们的函数映射到折叠的数据上来做一个简单的突变。
library(tidyverse)
data = data %>%
as_tibble() %>%
mutate(common_name = common_name %>% fct_infreq() %>% fct_drop()) %>%
group_by(common_name) %>%
nest() %>%
mutate(summ = map(data, GetSummary))
data
# A tibble: 3 x 3
# Groups: common_name [3]
# common_name data summ
# <fct> <list> <list>
#1 Hardhead Silverside <tibble [30 x 4]> <grouped_df [6 x 7]>
#2 Mojarra spp <tibble [30 x 4]> <grouped_df [6 x 7]>
#3 Rainwater Killifish <tibble [30 x 4]> <grouped_df [6 x 7]>
这个结果可能有点出乎意料。请注意,您在变量 data
中获取一种鱼类型的数据,并且此数据的摘要在 summ
中。让我们看看 summ
变量中有什么 Hardhead Silverside
fish.
data[1,]$summ
# A tibble: 6 x 7
# Groups: year, season [6]
# year season N n_mean n_median sd se
# <dbl> <fct> <int> <dbl> <int> <dbl> <dbl>
#1 2018. dry 5 0.8 0 1.79 0.8
#2 2019. wet 5 5 0 11.2 5
#3 2019. dry 5 2 0 4.47 2
#4 2020. wet 5 13.2 0 29.5 13.2
#5 2020. dry 5 0 0 0 0
#6 2021. wet 5 3.6 0 6.99 3.12
这就是您所期望的。
现在让我们准备一个创建图形的函数。但首先,让我们将有关彩色矩形的信息写在一个 tibble
.
dfAnnot = tribble(
~year, ~fill,
2010, "lightblue",
2011.5, "pink",
2013.5, "lightgreen",
2015.5, "pink",
2017.5, "#E0E0E0",
2018.5, "orange"
)
这样的table以后可以根据自己的需要轻松扩展。
现在我们可以创建一个函数来创建图形并将其保存到 png
文件中。我的 makePlot
函数等同于你的 Plot
函数。
makePlot = function(df, group, dir=""){
data = df$summ[[1]]
plot = data %>% ggplot(aes(year, n_mean, fill=season))+
geom_point(color = "black", shape = 21, size = 3)+
geom_errorbar(aes(ymin = n_mean-se, ymax = n_mean+se), width = .2)+
annotate(xmin = dfAnnot$year, xmax = dfAnnot$year+0.5,
ymin = -Inf, ymax = Inf, fill = dfAnnot$fill,
geom="rect", alpha = 0.4) +
scale_fill_manual(values=c("white", "#C0C0C0"))+
scale_x_continuous(breaks=2005:2020)+
theme(panel.border = element_rect(fill = NA, color = "black"),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
labs(x="Year", y = "Mean count") +
theme(plot.title = element_text(hjust = 0.5)) +
theme(axis.text.y = element_text(size = 10, face = "bold")) +
theme(axis.text.x = element_text(size = 10, face = "bold")) +
theme(axis.title = element_text(size = 14, face = "bold"))+
ggtitle(group$common_name)
ggsave(paste(dir, group$common_name,".png"), plot)
plot
}
通过创建此功能,我试图尽可能接近您的期望。我刚刚添加了一个图表标题。
这个函数的使用非常简单。你只需要两个函数 group_by
和 group_map
.
data %>% group_by(common_name) %>%
group_map(makePlot, dir="plots/")
图表可以在 Plots window 中看到,并且另外保存在 plots 目录中的文件中。我建议在 RStudio 中工作并创建一个项目。您不需要使用 setwd
函数设置目录。
整个过程应该可以正常工作,甚至可以进行更多观察。它也可以在将来轻松扩展(dfAnnot
table)。我希望我的解决方案能够奏效并满足您的期望。
还要记住文件名直接来自 common_name 变量。确保只有那些字符串是有效的文件名。