Построение нескольких графиков внутри функции в R
У меня есть список colName
который содержит имена столбцов Dataframe isNumValLong
, Каждый элемент этого списка представляет собой символьный вектор, содержащий 6 имен столбцов.
isNumValLong
это фрейм данных, который содержит значения для имен столбцов, передаваемых в функцию plothist()
:
Я намерен пройти colName
к plothist
который создаст несколько графиков в наборе из 6 переменных в каждом вызове.
plothist <- function(colName, myDf) {
#str(name)
#class(name)
l <- length(colName)
ls <- list()
for (i in 1:l) {
ls[[i]] <- isNumValLong %>% filter(key %in% colName[i]) %>%
ggplot(aes(x = value)) + geom_histogram() + facet_grid(. ~ key, scales = "free")
}
grid.arrange(ls)
}
мой вызов функции ниже:
lapply(colName, plothist, isNumValLong)
Функция возвращает ошибку
Пожалуйста, дайте мне знать, где я не прав?
@MrFlik, вот воспроизводимый код:
library(ggplot2)
library(tidyr)
library(gridExtra)
plothist <- function(name, myDf) {
#str(name)
#class(name)
l <- length(name)
ls <- list()
for (i in 1:l) {
ls[[i]] <- myDf %>% filter(key %in% name[i]) %>%
ggplot(aes(x = value)) + geom_histogram() + ggtitle(label = as.character(name[i]))
}
grid.arrange(ls)
}
u <- rnorm(10^6)
v <- rnorm(10^6)
w <- rnorm(10^6)
x <- rnorm(10^6)
y <- rnorm(10^6)
z <- rnorm(10^6)
isNumVal <- data.frame(cbind(u, v, w, x, y, z))
isNumValLong <- gather(isNumVal, key = "key", value = "value")
colName <- as.character(unique(isNumValLong$key))
colName <- split(colName, ceiling(seq_along(colName)/2))
lapply(colName, plothist, isNumValLong)
Ожидаемый результат должен составлять 3 набора участков, каждый из которых имеет два участка. Пример первого сета выглядит следующим образом:
1 ответ
Может быть, это то, что вы хотите? Я немного адаптировал вашу функцию, поэтому вам нужно только передать data.frame, а не уникальные имена, и вы можете передать количество строк и столбцов, которые будут использоваться для графиков.
library(ggplot2)
library(tidyr)
library(dplyr)
library(gridExtra)
u <- rnorm(10^3); v <- rnorm(10^3)
w <- rnorm(10^3); x <- rnorm(10^3)
y <- rnorm(10^3); z <- rnorm(10^3)
isNumVal <- data.frame(cbind(u, v, w, x, y, z))
isNumValLong <- gather(isNumVal, key = "key", value = "value")
plothist <- function(myDf, ncols=3, nrows=2) {
uniqueKey <- unique(myDf$key)
ls <- list()
for (i in 1:length(uniqueKey)) {
myDfPlot = myDf %>% filter(myDf$key %in% uniqueKey[i])
ls[[i]] = ggplot(myDfPlot, aes(value)) +
geom_histogram() +
ggtitle(label = as.character(paste("Key:", as.character(uniqueKey[i]),
"\t Mean:", as.character(round(mean(myDfPlot$value, na.rm = TRUE),4)),
"\t Median:", as.character(round(median(myDfPlot$value, na.rm = TRUE),4))
), sep = ", "))
}
marrangeGrob(ls, ncol = ncols, nrow = nrows)
}
plothist(isNumValLong)
plothist(isNumValLong,2,1)