Создать график для каждой переменной в данных (все переменные являются категориальными)

#r #loops #plot

#r #петли #сюжет #циклы #график

Вопрос:

Я использую набор данных Soy из пакета mlbench в R.

Я хочу показать частотное распределение, создав простые столбчатые диаграммы для каждой переменной (все категориальные). Графики должны выглядеть примерно так:

https://www.statmethods.net/graphs/images/barplot1.jpg

Заранее большое спасибо, M

Ответ №1:

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

 library(mlbench)
data(Soybean)
library(ggplot2)
library(dplyr)       

for(j in 1:ncol(Soybean)){

  var <- colnames(Soybean)[j]

  Soybean %>% 
    ggplot(aes(x = get(var)))   
    geom_histogram(stat = 'count')  
    labs(x = 'var')

}
  

Он сгенерирует 36 графиков, подобных этому:
введите описание изображения здесь

Комментарии:

1. Спасибо за ваш вклад. Это сработало хорошо и было именно тем, что я искал. Еще раз, большое спасибо. Однако время вычисления было выше, чем у метода из комментария выше.

Ответ №2:

В качестве альтернативы вы также можете попробовать {purrr} применить {ggplot2} процесс к каждому столбцу данных. Я использовал aes_string() здесь, чтобы имена столбцов можно было передавать в виде строк в ggplot эстетику.

Редактировать: Использование gridExtra::marrangeGrob() для создания расположения всех фигур размером 6 х 6.

 library(mlbench)
library(purrr)
library(ggplot2)
library(gridExtra)

data("Soybean")

marrangeGrob(
  map(
    names(Soybean), 
    ~ ggplot(Soybean, aes_string(.x))   
      geom_bar()
  ),
  ncol = 6,
  nrow = 6,
  top = "Soybean Distribution"
)
  

Комментарии:

1. спасибо за ваш вклад, это именно то, что я искал. Однако я думал о создании пространства графика 6 x 6, чтобы я мог просматривать их все одновременно. Есть ли способ включить это в ваш код? Заранее большое спасибо,

2. Я отредактировал ответ таким образом, чтобы вы получили график 6 x 6. Я использовал gridExtra::marrangeGrob(). Время вычисления увеличивается, но я надеюсь, что это нормально.

Ответ №3:

Используя базу R, вы можете получить желаемый результат с:

 my.barplot.function = function(x){ 
  heights = table(x)
  barplot(heights, names.arg = levels(x))
}

apply(Soybean, 2, my.barplot.function)
  

Вы получите графики, подобные приведенному ниже, для всех переменных:

Гистограмма для переменной 1

Комментарии:

1. спасибо за ваш вклад. Это сработало очень хорошо. Отличный вклад, я очень ценю вашу помощь.

2. @MLU : Рад слышать, что у вас это хорошо сработало. Даже если это не лучший ответ, пожалуйста, подумайте о том, чтобы дать ему оценку, если вы нашли код и результат полезными для решения вашей проблемы и для будущего программирования 🙂