Несколько ggplots на одной странице с использованием цикла for в R

Я пытаюсь построить несколько «ggplot» на одной странице, используя цикл for. Цикл for используется, потому что количество графиков не определено «динамически». Ось x графиков будет изменяться в каждой итерации. Я прочитал так много статей о создании пустого списка, затем добавил каждый график в определенный индекс списка, а затем использовал функцию «множественный график», чтобы отобразить все графики списка на одной странице. Однако это не работает! Проблема в том, что программа в конечном итоге печатает только последнюю информацию о графике, сохраненную в последнем индексе списка с разными метками! код и рисунок ниже указывают на идею. `

Howmany <- readline(prompt = "Specify the number of the independent variables: ") 
Howmany <- as.numeric(Howmany)
plot_lst <- vector("list", length = Howmany) #' an empty list
   for ( i in 1:Howmany){
        plot_lst[[i]] <- ggplot(data=data, aes(x=data[, c(i)], y=data$gender))  +
        geom_point(aes(size = 5)) +    
           scale_color_discrete(name = "dependent_variable" + labs(
            title = (paste("Logistic Regression Fitting Model",i)), 
            x = names(data)[i],
            y =  "gender")
        
   }
 multiplot(plotlist = plot_lst, cols = 1)

Несколько ggplots на одной странице с использованием цикла for в R

Я очень ценю любое предложение.

Я также попробовал то, что было предложено в этой ссылке: показать несколько графиков из ggplot на одной странице в r

Тем не менее, все еще сталкиваюсь с той же проблемой.

Я думаю, вам нужно print() сюжетный объект. Например, p <- ggplot(data = data, aes(....)); print(p) внутри цикла for. Она может ничего не производить, но при вязании ваши сюжеты проявятся.

monte 21.11.2022 06:33

Хотя я не думаю, что это вызывает вашу проблему, вы можете удалить это: i = i + 1. Вам не нужно вручную увеличивать индекс i, так как вы используете конструкцию for(). Вам также нужно как-то распечатать графики. Я предполагаю, что вы передаете свой список plot_lst функции multiplot?

Stewart Macdonald 21.11.2022 06:41

Без лучшего понимания ваших данных или вашего кода трудно дать много советов. Мое первое предложение состояло бы в том, чтобы посмотреть на преобразование ваших данных в длинный формат, а затем использовать аспекты ggplot. Если вы предоставите немного образцов данных, мы сможем помочь вам в дальнейшем.

Stewart Macdonald 21.11.2022 06:49

Честно говоря, я сомневаюсь, что есть причина использовать циклы for в R без какой-либо экстраординарной причины... В этом случае: почему бы не использовать огранки? cookbook-r.com/Graphs/Facets_(ggplot2)

asd-tm 21.11.2022 07:58

да прохожу. Я отредактировал вопрос и добавил код. что печать делает с моей проблемой? это помогает? @StewartMacdonald

Deema 21.11.2022 17:12

мои данные касаются логистической регрессии между категориальной зависимой переменной и количеством независимых переменных, взятых у пользователя. часть регрессии выполнена. Тем не менее, я хотел бы построить все корреляции между зависимой переменной и независимыми переменными на одной странице (каждая занимает один график), а затем построить модель прогнозирования на одном графике. аспект работает, если у меня есть две переменные оси X, но у меня может быть больше. @СтюартМакдональд

Deema 21.11.2022 17:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку ggplot aes() использует ленивую оценку, вам необходимо принудительно выполнять оценку на каждой итерации цикла (иначе все графики будут одинаковыми в последней позиции i).

Один из способов сделать это — заключить правую часть присваивания в local() и использовать i <- i:

labs(x = ...) показалось неправильным, поэтому я переписал его так: x = names(data)[i], пожалуйста, проверьте, работает ли это для вас.

plot_lst <- vector("list", length = Howmany) #' an empty list
for (i in 1:Howmany) {
  
  plot_lst[[i]] <- local({
    i <- i 
    
    ggplot(data=data, aes(x=data[, c(i)], y=data$gender)) +
    geom_point(aes(size = 5)) +    
    scale_color_discrete(name = "dependent_variable") +
      labs(
        title = (paste("Logistic Regression Fitting Model", i)), 
        x = names(data)[i],
        y = "gender")
    })
}

Ниже приведен один пример использования набора данных радужной оболочки. Если мы напечатаем plot_lst, мы увидим три разных графика.

Я предполагаю, что функция multiplot из пакета разброса, который не работает с последней версией R, поэтому я не могу воспроизвести, работает ли он правильно.

Howmany <- readline(prompt = "Specify the number of the independent variables: ") 
Howmany <- as.numeric(Howmany)
plot_lst <- vector("list", length = Howmany) #' an empty list

for ( i in 1:Howmany){
  
  plot_lst[[i]] <- local({ 
    i <- i
    
    ggplot(data  = iris,
           aes(x = iris[, c(i)],
               y = iris$Species)) +
    geom_point(aes(size = 5)) +    
    scale_color_discrete(name = "dependent_variable") +
    labs(
      title = paste("Logistic Regression Fitting Model", i), 
      x = names(data)[i],
      y =  "species"
    )
    
  })
}

plot_lst

Спасибо за ваш ответ. Тем не менее, я попробовал и все равно получаю тот же результат (та же проблема) @TimTeaFan

Deema 21.11.2022 17:27

Не могли бы вы предоставить некоторые примеры данных, которые позволяют нам воспроизвести вашу проблему.

TimTeaFan 21.11.2022 20:20

для выполнения логистической регрессии пользователь может выбрать один столбец в качестве зависимой переменной. в представленном случае «пол» и выбрать номера и имена независимых переменных. в представленном случае (math_score, read_score и обед) из выбранного фрейма данных. Затем я создал новый фрейм данных только с выбранными столбцами, где зависимая переменная будет первым столбцом, а остальные — независимыми переменными. Затем glm( data[, c(1)] ~. , data = d). Затем мне нужно построить подогнанную модель и корреляцию между зависимыми и независимыми переменными на одной странице или на одном графике. @TimTeaFan

Deema 22.11.2022 06:14

@Deema: без ваших данных (используйте dput(data) или слишком большое подмножество этих данных) трудно воспроизвести вашу проблему. Пожалуйста, прочитайте о том, как создать минимальный воспроизводимый пример. Я обновил свой ответ простым примером из набора данных радужной оболочки. Просто используйте 3 как Howmany. Когда мы рисуем plot_lst, мы видим три разных графика, но только при использовании local({i <- i; .... }).

TimTeaFan 22.11.2022 07:33

Другие вопросы по теме