Как создать facet_wrap() для столбца с его именем, сохраненным в переменной

#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 Я не знал об этом (так что спасибо за введение), но, похоже, это лучший ответ.