#r #ggplot2 #dynamic #iteration
#r #ggplot2 #динамический #итерация
Вопрос:
Это следует из моего последнего вопроса. Я потратил около часа, пытаясь понять, как передать переменную, которую я использую для фильтрации моего фрейма данных, в заголовок сгенерированного графика.
Следуя моим предыдущим вопросам.
library (tidyverse)
library (epitools)
# here's my made up data
DISEASE = c("Marco Polio","Marco Polio","Marco Polio","Marco Polio","Marco Polio",
"Mumps","Mumps","Mumps","Mumps","Mumps",
"Chicky Pox","Chicky Pox","Chicky Pox","Chicky Pox","Chicky Pox")
YEAR = c(2011, 2012, 2013, 2014, 2015,
2011, 2012, 2013, 2014, 2015,
2011, 2012, 2013, 2014, 2015)
VALUE = c(82,89,79,51,51,
79,91,69,89,78,
71,69,95,61,87)
AREA =c("A", "B","C")
DATA = data.frame(DISEASE, YEAR, VALUE,AREA)
DATA<-
DATA %>%
mutate(POPN = case_when(
AREA == "A" ~ 2.5,
AREA == "B" ~ 3,
AREA == "C" ~ 7,
TRUE ~ 0)) %>%
group_by(DISEASE,AREA,POPN) %>%
count(AREA) %>%
mutate(res = list(pois.byar(n, POPN))) %>%
unnest()
DATA%>%filter(DISEASE== "Marco Polio")%>%
ggplot(aes(x=AREA, y=rate)) geom_point()
geom_hline(aes(yintercept=rate[AREA == "A"]),
linetype="dashed", color = "red")
Я думал, что это
x_label = "Area!!!"
y_label = "Rate!!!"
DATA%>%filter(DISEASE== "Marco Polio")%>%
ggplot(aes(x=AREA, y=rate)) geom_point()
geom_hline(aes(yintercept=rate[AREA == "A"]),
linetype="dashed", color = "red")
labs(x = x_label,y = y_label)
ggtitle(DATA$DISEASE)
Почему этого не происходит?
Он генерирует диаграмму для Marco Polio, но использует Chicky Pox в качестве заголовка.
Чего я хочу, так это (ложный код) ggtitle == фильтр (болезнь)
Потому что то, что я собираюсь сделать после этого, — это ходить и мурлыкать, чтобы получить каждый график для каждой инфекции, и я хотел бы, чтобы заголовок был автоматически.
Ta.
РЕДАКТИРОВАТЬ: Я попробовал предложение ниже, и оно не совсем работает.
Я пробовал это
DATA%>%filter(DISEASE== "Mumps")%>%
ggplot(aes(x=AREA, y=rate)) geom_point()
geom_hline(aes(yintercept=rate[AREA == "A"]),
linetype="dashed", color = "red")
ggtitle(paste(DISEASE))
DATA%>%filter(DISEASE== "Mumps")%>%
ggplot(aes(x=AREA, y=rate)) geom_point()
geom_hline(aes(yintercept=rate[AREA == "A"]),
linetype="dashed", color = "red")
ggtitle(as.character(DISEASE))
и безуспешно.
Имеет ли это какое-то отношение к тому, что БОЛЕЗНЬ становится ФАКТОРОМ при ее группировании?
Ответ №1:
Похоже, вам нужна функция, в которой вы можете ввести заболевание и создать график.
disease_plot <- function(disease_of_interest) {
DATA %>%
filter(DISEASE == disease_of_interest) %>%
ggplot(aes(x = AREA, y = rate))
geom_point()
geom_hline(aes(yintercept = rate[AREA == "A"]),
linetype = "dashed", color = "red")
# labs(x = x_label, y = y_label)
ggtitle(disease_of_interest)
}
disease_plot("Marco Polio")
disease_plot("Chicky Pox")
disease_plot("Mumps")
Или создать их все сразу…
map(unique(DATA$DISEASE), disease_plot)
Комментарии:
1. Очевидно, мне нужно начать изучать, как писать функции… Я думаю, что это способ думать о проблемах. Я ценю вашу помощь и советы здесь, Стивен и Марк. Я собираюсь показать функцию, которая у меня уже была, а затем включить часть ggtitle. Мне бы и в голову не пришло включать «заголовок» в функцию, но я также не знал, как это сделать. Надеюсь, это нормально? И имеет смысл?
2. Продолжение от @Tung: Я перепроверил ответ, данный здесь Стивеном. Это действительно работает. И я думаю, что знаю почему: перед запуском этого раздела: labs (x = x_label, y = y_label) Я должен был определить, что это были за заголовки. Когда это не сработало, и я увидел, что могу использовать функцию, которая у меня уже была, я собрал ее вместе в своем ответе. Я отмечу ваш ответ как ответ! Приношу извинения.
Ответ №2:
В конце концов, я воспользовался советом и помощью Стивена и Марка и совместил это со своим первоначальным планом пройти через это, мурлыкая под нос.
Вот оно:
walk(unique(DATA$DISEASE), function(disease_of_interest) {
p <- DATA%>%filter(DISEASE== !!disease_of_interest)%>%
ggplot(aes(x=AREA, y=rate,y=rate,
ymin = rate-lower, ymax = rate upper))
geom_point()
geom_hline(aes(yintercept=rate[AREA == "A"]),
linetype="dashed", color = "red")
labs(x = x_label,y = y_label),
ggtitle(paste0("Number of ",disease_of_interest,
" in 2018"))
geom_errorbar(aes(ymin=lower, ymax=upper), width=.1)
print(p)
ggsave(paste("drive path",disease_of_interest, "plot.png"))
scale_x_discrete(limits=c("C","A","B"))
})
Комментарии:
1. Почему вы использовали
!!
внутри своей функции?2. Краткий ответ: для этого есть унаследованная мной функция.
3. Длинный ответ: В dplyr (и в tidyeval в целом) вы используете !! сказать, что вы хотите отменить кавычки на входные данные, чтобы они оценивались, а не заключались в кавычки. Это дает нам функцию, которая на самом деле делает то, что мы хотим. dplyr.tidyverse.org/articles/programming.html . Таким образом, я предполагаю, что это гарантирует правильность ввода в фильтр.
4. Вам это не нужно
!!
для работы функции.!!
требуется только тогда, когда вы заключаете свою переменную в кавычки, используяquo
,enquo
,sym
,ensym
и т.д.5. Спасибо, Танг, я объяснил, почему я не пометил предыдущий ответ как ответ. Я ценю это, потому что я не думаю, что это справедливо, что Стивен не получил бы никакой оценки. Ваши предложения выглядят интересными, и спасибо за объяснение о!!
Ответ №3:
Это потому, что вы используете весь текст DATA$DISEASE
в качестве заголовка, и кажется, что он просто захватывает последнее значение в нем column
. Гораздо проще dataframe
сначала создать отфильтрованный, а затем ввести его в plot
, я думаю.
df <- DATA%>%filter(DISEASE== "Marco Polio")
ggplot(data = df, aes(x=AREA, y=rate)) geom_point()
geom_hline(aes(yintercept=rate[AREA == "A"]),
linetype="dashed", color = "red")
labs(x = x_label,y = y_label)
ggtitle(df$DISEASE)
В конце концов, я подумал, что решением было бы вызывать не DATA $, а просто DISEASE
Однако, похоже, это работает не так, как ожидалось, при фильтрации по другому заболеванию. Я думаю, вам пришлось бы также включить DISEASE в ggtitle, или лучше использовать первую функцию, или другой ответ, опубликованный другим пользователем.
РАБОТАЕТ НЕ ТАК, КАК ОЖИДАЛОСЬ:
DATA%>%filter(DISEASE== "Marco Polio")%>%
ggplot(aes(x=AREA, y=rate)) geom_point()
geom_hline(aes(yintercept=rate[AREA == "A"]),
linetype="dashed", color = "red")
labs(x = x_label,y = y_label)
ggtitle(DISEASE)
Комментарии:
1. К сожалению, это работает с моими пробными данными (используемыми здесь). Но когда я тестирую это на своих реальных данных, это не так. И я получаю следующую ошибку: Ошибка в rlang::list2(…, title = заголовок, subtitle = подзаголовок, caption = заголовок, : объект ‘DISEASE’ не найден
2. Я подозреваю, что опечатка или str (df) показывает другой формат для некоторых столбцов, которые отличаются от тестовых данных и вызывают проблему? Я не могу помочь вам с этим, основываясь на комментарии, которого я боюсь. Пожалуйста, примите рабочий ответ для тестовых данных, хотя
3. Могу я спросить, где вы смотрели?
4. О, я имел в виду, что нужно читать ваш код, выяснять, что мы сделали неправильно, и изменять его, пока он не заработает.
5. Хм. Хорошо. Я не хочу превращать это в масштабное обсуждение, но я посмотрю, как я могу сравнить два сгруппированных фрейма данных (тестовые и реальные данные).