Я использую пакеты grid
и grid.Extra
, чтобы иметь несколько графиков ggplots в одной сетке, однако мне нужно всего создать 28 графиков ggplots, каждый с другой переменной y. Очевидно, цикл для создания и сохранения их как переменной достаточно прост, но мне нужно сохранять каждый график как отдельный объект. В настоящее время у меня всего 28 одинаковых графических кодов с измененной только осью, но я знаю, что есть способ получше.
Мой минимальный пример кода:
dattn <- ggplot()+
geom_boxplot(
data = dat,
mapping = aes(x = site, y = tn)
)
Мой текущий заголовок цикла (не уверен, имеет ли это значение):
for (i in dat[, 10:12])
Мне нужно переключить значение y на tp
и tss
и сохранить эти графики ggplots как dattp
и datss
. Столбцы переменных - 10, 11 и 12 в указанном порядке.
Изучая эту проблему, я столкнулся с этим вопросом: Динамическое именование переменных в цикле для создания 30 ggplots, что очень похоже на мою проблему, однако в нем используются конвейерные функции, и я понятия не имею, как их использовать, тогда как у меня есть некоторое представление об использовании цикла for. Если кто-то думает, что это сработает лучше, я был бы благодарен за это.
Я также пробовал код paste("dat", i, sep="") <- ggplot...
конкретно из вопроса Сохранить объекты ggplot в цикле, но это выдает сообщение об ошибке target of assignment expands to non-language object
и снова использует функции конвейера.
Я обновлю свой вопрос, добавив всю необходимую информацию по мере необходимости. Заранее спасибо.
Причина, по которой я запросил помощь с использованием циклов for, заключается в том, что мне также нужно разбить мои данные на подмножества на основе местоположения («ферма» в данных), и я решил, что как только я смогу изменить текст цикла, я смогу изменить то, как я подмножество data и использовать вложенные циклы.
Данные с использованием dput(head(dat))
:
structure(list(year = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("2018",
"2019"), class = "factor"), month = structure(c(4L, 5L, 5L, 6L,
7L, 7L), .Label = c("1", "2", "3", "4", "5", "6", "7", "9", "10",
"11", "12"), class = "factor"), day = c(24L, 18L, 30L, 25L, 6L,
19L), farm = structure(c(2L, 2L, 2L, 2L, 2L, 2L), .Label = c("ARR",
"Car", "CAR", "Mur", "Muz", "PBR", "Pre", "PRE", "Sch", "SCH",
"Sim", "SIM", "STU"), class = "factor"), treat = structure(c(1L,
1L, 1L, 1L, 1L, 1L), .Label = c("CC", "Con"), class = "factor"),
tss = c(1955, 3540, 4893.3, 410, 3357.5, 1836), tn = c(17,
32.8, 7.26, 5.91, 16.1, 16.7), tp = c(4.35, 10, 49.5, 3.57,
9.79, 11.1), dis = c(8178, 184232, 401364, 1113947, 10728,
21869), tss.1 = c(1.576347171, 64.30227415, 193.6414217,
45.03046056, 3.551344392, 3.958763937), tn.1 = c(0.013707367,
0.595795082, 0.28729829, 0.649097614, 0.017029529, 0.036008365
), tp.1 = c(0.003507473, 0.181644842, 1.958851976, 0.392094498,
0.010355223, 0.023933704), site = structure(c(1L, 1L, 1L,
1L, 1L, 1L), .Label = c("Car CC", "Mur CC", "Muz CC", "Pre CC",
"Sch CC", "Sim CC", "CAR CC", "ARR CC", "PBR CC", "PRE CC",
"STU CC", "Car Con", "Mur Con", "Muz Con", "Pre Con", "Sch Con",
"Sim Con", "SCH Con", "PRE Con", "ARR Con", "PBR Con", "SIM Con",
"STU Con"), class = "factor")), row.names = c(NA, 6L), class = "data.frame")
И немного кода форматирования:
# Set variables as factors
cols <- c("year", "month")
dat[cols] <- lapply(dat[cols], as.factor)
# Set dat$site to combine farm and treat
dat$site <- paste(dat$farm, dat$treat)
# Sets the sites in order instead of aphabetically.
# unique() is needed else Error: duplicates
dat$site <- factor(dat$site, levels =unique(dat$site))
Не уверен, что это поможет, но мне предложили именно это.