Добавление заголовков динамических диаграмм в ggplot2

#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. Хм. Хорошо. Я не хочу превращать это в масштабное обсуждение, но я посмотрю, как я могу сравнить два сгруппированных фрейма данных (тестовые и реальные данные).