#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
, что он загружен!