Построение нескольких графиков внутри функции в R - PullRequest
0 голосов
/ 25 июня 2018

У меня есть список colName, который содержит имена столбцов Dataframe isNumValLong.Каждый элемент этого списка представляет собой символьный вектор, содержащий 6 имен столбцов.

column names in a list

isNumValLong - это кадр данных, содержащий значения для имен столбцов, передаваемых вфункция plothist():

Struct of the dataframe

Я намерен передать 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)

Функция возвращает ошибку

enter image description here

Пожалуйста, дайте мне знать, где я ошибаюсь?

@ 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 набора графиков, каждый из которых имеет два вспомогательных участка.Пример первого сета выглядит следующим образом:

example 1st set:

1 Ответ

0 голосов
/ 25 июня 2018

Может быть, это то, что вы хотите? Я немного изменил вашу функцию, поэтому вам нужно только передать 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)
...