Сохранить ggplot в цикле с помощью R - PullRequest
0 голосов
/ 15 января 2019

У меня есть набор данных с числовыми и факторными переменными. Я хочу сделать одну страницу с числовым, а другую с фактором вар. Прежде всего, я выбираю коэффициент var с его индексом.

Мой набор данных IRIS.

df<-iris
df$y<-sample(0:1,nrow(iris),replace=TRUE)
fact<-colnames(df)[sapply(df,is.factor)]
index_fact<-which(names(df)%in%fact)

Затем я вычисляю остаток (цифры)

nm<-ncol(df)-length(fact)

Следующий шаг - создание цикла

i_F=1
i_N=1
list_plotN<- list()
list_plotF<- list()

for (i in 1:length(df)){
  plot <- ggplot(df,aes(x=df[,i],color=y,fill=y))+xlab(names(df)[i]) 

  if (is.factor(df[,i])){
    p_factor<-plot+geom_bar()
    list_plotF[[i_F]]<-p_factor
    i_F=i_F+1
  }else{
    p_numeric <- plot+geom_histogram()
    list_plotN[[i_N]]<-p_numeric
    i_N=i_N+1
  }
}

Когда я вижу list_plotF и list_plot_N, это не очень хорошо. У него всегда одни и те же переменные. я не знаю, что я делаю неправильно.

спасибо !!!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я не очень хорошо слежу за вашим кодом цикла. Но из того, что я вижу, похоже, что сохраняется последний график в каждом цикле, который вы делаете. Я восстановил то, что, я думаю, тебе нужно, используя lapply. Обычно я предпочитаю использовать циклы for для циклов всякий раз, когда могу.

Lapply берет список значений и функцию и применяет эту функцию к каждому значению. Вы можете определить свою функцию отдельно, как у меня, так что все выглядит чище. Затем вы просто упоминаете функцию в команде lapply.

В нашем случае список представляет собой список столбцов из вашего кадра данных df. Функция, которую он применяет, сначала создает наш базовый сюжет. Затем он делает быструю проверку, чтобы увидеть, является ли столбец, на который он смотрит, фактором. Если это фактор, он создает гистограмму, иначе он создает гистограмму.

histOrBar <- function(var) {
  basePlot <- ggplot(df, aes_string(var))
  if ( is.factor(df[[var]]) ) {
    basePlot + geom_bar()  
  } else {
    basePlot + geom_histogram()
  }
}

loDFs <- lapply(colnames(df), histOrBar)
0 голосов
/ 15 января 2019

Попробуйте передать имена столбцов с aes_string, чтобы лучше выровнять x с df :

for (i in 1:length(df)){
    plot <- ggplot(df, aes_string(x=names(df)[i], color="y", fill="y")) + 
              xlab(names(df)[i]) 
    ...
}

Чтобы продемонстрировать проблему с помощью aes() и решение с использованием aes_string() в контексте OP, рассмотрим следующий случайный кадр данных со столбцами разных типов данных: factor, char, int, num, bool, date.

Данные

library(ggplot2)

set.seed(1152019)
alpha <- c(LETTERS, letters, c(0:9))
data_tools <- c("sas", "stata", "spss", "python", "r", "julia")

random_df <- data.frame(
  group = sample(data_tools, 500, replace=TRUE),
  int = as.numeric(sample(1:15, 500, replace=TRUE)),
  num = rnorm(500),
  char = replicate(500, paste(sample(LETTERS[1:2], 3, replace=TRUE), collapse="")),
  bool = as.numeric(sample(c(TRUE, FALSE), 500, replace=TRUE)),
  date = as.Date(sample(as.integer(as.Date('2019-01-01', origin='1970-01-01')):as.integer(Sys.Date()), 
                        500, replace=TRUE), origin='1970-01-01')
)

Graph

fact <- colnames(random_df)[sapply(random_df,is.factor)]
index_fact <- which(names(random_df) %in% fact)

i_F=1
i_N=1
list_plotN <- list()
list_plotF <- list()
plot <- NULL

for (i in 1:length(random_df)){
  # aes() VERSION
  #plot <- ggplot(random_df, aes(x=random_df[,i], color=group, fill=group)) +
  #  xlab(names(random_df)[i]) 

  # aes_string() VERSION
  plot <- ggplot(random_df, aes_string(x=names(random_df)[i], color="group", fill="group")) +
    xlab(names(random_df)[i]) 

  if (is.factor(random_df[,i])){
    p_factor <- plot + geom_bar()
    list_plotF[[i_F]] <- p_factor
    i_F=i_F+1
  }else{
    p_numeric <- plot + geom_histogram()
    list_plotN[[i_N]] <- p_numeric
    i_N=i_N+1
  }
}

Проблема (при использовании aes(), где выходные данные графика НЕ ​​меняются в зависимости от типа)

Problem Plots


Решение (используя aes_string(), где графики меняются в зависимости от типа)

Solution Plots

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...