Как добавить линии и оттенки на графике

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть набор данных, и я хочу создать для него график. Мои данные и коды графика:

 #Data
Days<-c("-6","-6","-6","-1","-1","-1","1","6","6","6","13","13","13","16","20","20","20","24","28","28","28","44","44","44")
Event<-c("","","","","","","H","","","","","","","P","","","","H","","","","","","")
Dummy<-c("","","","","","","1","","","","","","","1","","","","1","","","","","","")
Item <-c("DIABP","PULSE","SYSBP","DIABP","PULSE","SYSBP","","DIABP","PULSE","SYSBP","DIABP","PULSE","SYSBP","","DIABP","PULSE","SYSBP","","DIABP","PULSE","SYSBP","DIABP","PULSE","SYSBP")
Result <- c("100","68","149","98","80","142","","98","88","142","110","72","160","","102","69","159","","99","82","136","97","84","144")
#Dataframe
Sample.data <- data.frame( Days, Event,Dummy, Item, Result,stringsAsFactors = F) 
Sample.data %>% mutate(ID=1) %>% mutate (Name="Jack")

#Plot
ggplot(type.convert(Sample.data))   
  geom_line(aes(Days, Result, group = Item, color = Item))  
  geom_hline(yintercept=120) 
  geom_hline(yintercept=80) 
  geom_point(aes(x = Days, y =Dummy )) 
  geom_text(aes(x = Days, y =Dummy,label=Event,Vjust = 1.75))
  

график, который я получил, это:
введите описание изображения здесь
Я хочу еще больше улучшить его, но не знаю как. Может ли кто-нибудь помочь в этом:

  1. Я хочу добавить вертикальную пунктирную линию там, где отмечено событие;
  2. Я хочу затенить область между линией (y = 120 и Y = 80);
  3. Я не хочу строить линию, когда Item==»» (ДЛЯ этого нет строки, но она отображалась в легенде ;
  4. Я хочу добавить имя в сноску или заголовок. Пожалуйста, обратите внимание, что я хочу что-то вроде Sample.data $Name вместо «Jack», так как я делаю графики для более чем 1 человека, и я буду использовать циклические коды для создания графиков, поэтому имя должно автоматически меняться само по себе.

Это будет выглядеть так:

введите описание изображения здесь

извините за уродливый сюжет. это лучшее, что я могу получить, рисуя. 🙁

Ответ №1:

Попробуйте этот код:

 library(ggplot2)
#Data
Days<-c("-6","-6","-6","-1","-1","-1","1","6","6","6","13","13","13","16","20","20","20","24","28","28","28","44","44","44")
Event<-c("","","","","","","H","","","","","","","P","","","","H","","","","","","")
Dummy<-c("","","","","","","1","","","","","","","1","","","","1","","","","","","")
Item <-c("DIABP","PULSE","SYSBP","DIABP","PULSE","SYSBP","","DIABP","PULSE","SYSBP","DIABP","PULSE","SYSBP","","DIABP","PULSE","SYSBP","","DIABP","PULSE","SYSBP","DIABP","PULSE","SYSBP")
Result <- c("100","68","149","98","80","142","","98","88","142","110","72","160","","102","69","159","","99","82","136","97","84","144")
#Dataframe
Sample.data <- data.frame( Days, Event,Dummy, Item, Result,stringsAsFactors = F) 
Sample.data %>% mutate(ID=1) %>% mutate (Name="Jack")
#Create flags
Sample.data$Flag <- ifelse(Sample.data$Dummy==1,Sample.data$Days,NA)
#Plot
ggplot(type.convert(Sample.data))   
  geom_line(aes(Days, Result, group = Item, color = Item))  
  geom_ribbon(aes(x=Days,ymin=80,ymax=120),fill='blue',alpha=0.2) 
  geom_hline(yintercept=120) 
  geom_hline(yintercept=80) 
  geom_point(aes(x = Days, y =Dummy )) 
  geom_text(aes(x = Days, y =Dummy,label=Event,Vjust = 1.75)) 
  geom_vline(aes(xintercept=Flag),lty='dashed') 
  scale_color_discrete(breaks=unique(Sample.data$Item[Sample.data$Item!=''])) 
  labs(title='Jack',caption = 'Jack')
  

Вывод:

введите описание изображения здесь

Комментарии:

1. Спасибо! Вы быстры! Что я должен делать, если я хочу, чтобы DIABP и SYSBP отображались в строке, а Pulse были точками?

2. Когда я использую `geom_ribbon (aes (x = Days, ymin = 80, ymax = 120), fill = ‘blue’, alpha = 0.2)’ в своих реальных данных, я получил сообщение об ошибке Error: Discrete value supplied to continuous scale . Что я сделал не так?

3. @Stataq Ваша переменная Days должна быть типа factor или другого типа. Чтобы изменить тип линии, попробуйте scale_linetype_manual()

4. Просто проверьте тип дней: [1] «числовой». Что мне делать? Для импульса я хочу использовать точки, а DIABP и SYSBP все еще строят график. могу ли я добавить fliter в некоторые, где ограничить Item %in% c("DIABP", "SYSBP") ?

5. @Stataq Проверьте параметры разрывов для того, что вы хотите вокруг scale_color_discrete() , вы можете добавить еще один другой элемент, например breaks=unique(Sample.data$Item[Sample.data$Item %in% c("DIABP", "SYSBP")]