Как я могу создать 2 отдельных графика на одной странице с 2 разными переменными y в моей функции

#r #for-loop #ggplot2

#r #для цикла #ggplot2

Вопрос:

Итак, у меня есть фрейм данных из 4 переменных, использующий цикл for, я хотел бы написать функцию, которая создает 1 страницу для каждого игрока с годом на оси x и 1 график с vo2max на оси y и 1 график с hp на оси y.

Внизу вы можете найти второй ggplot, который я пытался добавить в этот код, но он не будет работать. спасибо за вашу помощь.

 
tv<- data.frame(
  player = c("p1","p2","p3", "p1", "p2", "p3"),
  year = c("2010", "2010", "2010", "2015", "2015", "2015"),
  vo2max = c(50, 52, 52, 53, 54, 56),
  hp = c(100, 100, 105, 103, 102, 105)
)

vohp <- function(id){
  vohp1 <- tv %>% filter(player == id)
  ggplot(vohp1, aes(year, vo2max)  
    geom_point()  
    geom_line()  
    scale_y_continuous(label = scales::number_format(accuracy = 5)) 
    theme(axis.text.x = element_text(size= 6, angle = 90), strip.text = element_text(size = 6)) 
    ggsave(paste0("~/Desktop/rtest//", id, "testttttt.pdf"))
  
 
}

for(id in unique(tv$player)){
  vohp(id)
}


#supplemental part that was not working into the code

vohp2 <- tv %>% filter(player == id)
ggplot(vohp2, aes(year, hp, group = id))  
  geom_point()  
  geom_line()  
  scale_y_continuous(label = scales::number_format(accuracy = 5)) 
  theme(axis.text.x = element_text(size= 6, angle = 90), strip.text = element_text(size = 6)) 
  ggsave(paste0("~/Desktop/rtest//", id, "testttttt.pdf"))


  

Ответ №1:

Попробуйте это. Некоторые подробности. Вы можете разделить фрейм данных в списке, используя split() by player, а затем установить в функции график схемы. Поскольку вам нужно два графика на игрока, вы можете создать их внутри функции и использовать patchwork , вы можете объединить их. Наконец, вы можете применить функцию для создания графиков, избегая использования циклов lapply() . Наконец, используя pdf() функцию с циклом, вы можете создать PDF-файл с изображениями, которые я показал в конце. Здесь код со встроенной функцией и процесс:

 library(ggplot2)
library(patchwork)
#Data
tv<- data.frame(
  player = c("p1","p2","p3", "p1", "p2", "p3"),
  year = c("2010", "2010", "2010", "2015", "2015", "2015"),
  vo2max = c(50, 52, 52, 53, 54, 56),
  hp = c(100, 100, 105, 103, 102, 105)
)
#List
List <- split(tv,tv$player)
#Function
myfunplot <- function(x)
{
  #Plot 1
  G1 <- ggplot(x, aes(year, vo2max,group=1))  
           geom_point()  
           geom_line()  
           scale_y_continuous(label = scales::number_format(accuracy = 5)) 
           theme(axis.text.x = element_text(size= 6, angle = 90),
                 strip.text = element_text(size = 6)) 
    ggtitle(paste0('vo2max for ',unique(x$player)))
  #Plot 2
  G2 <- ggplot(x, aes(year, hp,group=1))  
    geom_point()  
    geom_line()  
    scale_y_continuous(label = scales::number_format(accuracy = 5)) 
    theme(axis.text.x = element_text(size= 6, angle = 90),
          strip.text = element_text(size = 6)) 
    ggtitle(paste0('hp for ',unique(x$player)))
  #Compose
  GF <- G1 G2
  return(GF)
}
#Apply
Listplot <- lapply(List, myfunplot)
#Prepare to export
pdf('Myplots.pdf',width = 14)
for(i in c(1:length(Listplot)))
{
  plot(Listplot[[i]])
}
dev.off()
  

Вывод в PDF-файле будет выглядеть следующим образом:

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

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

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

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

1. У вас есть идея, почему в нем говорится, что G2 также нельзя добавить в ggplot Error: Can't add G2 to a ggplot object. , откуда берется x, думал, что это будет мой набор данных. Спасибо за вашу помощь, очень признателен

2. @pat28dh Попробуйте повторно запустить R и запустить только код из решения. Похоже на конфликт, также убедитесь patchwork , что он загружен!