#r #ggplot2
#r #ggplot2
Вопрос:
Я хочу создать график с огранкой. Данные очень просты для этого минимально воспроизводимого примера (и так же много в оригинале):
structure(list(Phenotype = c("Dichaete", "Dichaete", "Wild",
"Wild"), Status = c("Observed", "Expected", "Observed", "Expected"
), Results = c(773, 885.75, 408, 295.25)), row.names = c(NA,
-4L), class = c("tbl_df", "tbl", "data.frame"))
Теперь в этом коде есть две части: одна — это то, что я сделал для имитации других переменных, которые у меня есть. Они не изменятся. Другая часть полностью гибкая.
# Unchangeable Part ############################
fly <- tibble(Phenotype = c("Dichaete", "Wild"),
Observed = c(773, 408),
Expected = c(885.75, 295.25))
data <- pivot_longer(fly, cols = c(Observed, Expected), names_to = "Status", values_to = "Results")
gfIdentifier <- "Phenotype"
# Changeable Part ##############################
ggplot(data, aes(x = Status, y = Results, fill = Status))
geom_col(colour = "black")
facet_wrap(facets = .data[[gfIdentifier]], ncol = 2)
theme_classic()
Этот код создает этот график (я добавил colour = "black"
аргумент, чтобы проиллюстрировать свою точку зрения):
Он не выполняет огранку. Чего я хотел, так это:
(Я уже убрал черную рамку)
Обратите внимание, что все переменные, которые я описал в начале, могут и будут меняться, поэтому явное их упоминание (как я сделал для создания цели) не является вариантом.
Ответ №1:
Мне нравится этот вопрос, потому что мне было ужасно сложно разобраться, когда я имел дело с подобной ситуацией, но это такое хорошее решение, которое на самом деле оказывается применимым к множеству интересных вещей. Все, что вам нужно сделать, это заставить R обрабатывать вашу текстовую строку как переменную. Это можно сделать с помощью eval и parse .
ggplot(data, aes(x = Status, y = Results, fill = Status))
geom_col(colour = "black")
facet_wrap(.~eval(parse(text = gfIdentifier)), ncol = 2)
theme_classic()
Комментарии:
1. в этом случае
get(gfIdentifier)
это также поможет2. @PLY Я не знал об этом (так что спасибо за введение), но, похоже, это лучший ответ.