Построение гистограммы - PullRequest
0 голосов
/ 15 января 2020

У меня есть кадр данных из 1090 строк и 5 столбцов (A, B, C, D, E). Все значения каждой переменной столбца находятся в диапазоне от 0 до 1. Как можно построить гистограмму с координатами X-X, показывающими интервалы как 0-0,2, 0,2-0,4, 0,4-0,6, 0,6-0,8 и 0,8-1,0 для каждого из переменные столбца? Спасибо.

Ответы [ 2 ]

1 голос
/ 16 января 2020

Для полноты картины предлагаем также решение, которое использует melt() для изменения формата с широкого на длинный. Почти всегда ggplot() лучше всего работает с данными в длинном формате.

Также показаны два варианта работы с переменными столбца: наложение с разными цветами заливки и фасетирование.

Столбчатая диаграмма с накоплением

library(data.table)
ggplot(melt(setDT(DT), measure.vars = names(DT))) +
  aes(x = cut(value, seq(0, 1, 0.2)), fill = variable) + 
  geom_bar() +
  xlab(("interval"))

enter image description here

Это похоже на ответ dc37 , но вызывает cut() в aes().

Гистограмма с гранями

library(data.table)
ggplot(melt(setDT(DT), measure.vars = names(DT))) +
  aes(x = cut(value, seq(0, 1, 0.2)), fill = variable) + 
  geom_bar() +
  facet_wrap(vars(variable), nrow = 1L) +
  xlab(("interval")) +
  theme(legend.position = "none")

enter image description here

Это может быть больше в соответствии с требованием OP о "гистограмме с осью X, показывающей интервалы как 0 -0,2, 0,2-0,4, 0,4-0,6, 0,6-0,8 и 0,8-1,0 для каждой из переменных столбца".

Данные

Это краткий способ создать таблицу данных с 5 столбцами случайных чисел:

library(data.table)
set.seed(123L)
DT <- setnames(as.data.table(replicate(5L, runif(100L))), LETTERS[1:5])
0 голосов
/ 15 января 2020

Вы можете 1) преобразовать ваши данные в более длинный формат, чтобы все ваши значения были в одном столбце и категориальном столбце, содержащем A, B, ... 2) Затем вы можете использовать функцию cut для генерации интервала в вашем столбце, содержащем значения и количество для каждого интервала каждой группы:

library(tidyr)
library(dplyr)
df %>% pivot_longer(everything(), names_to = "Var", values_to = "Val") %>% 
  mutate(intervals = cut(Val, breaks = c(0, 0.2, 0.4,0.6,0.8,1.0))) %>% 
  group_by(Var, intervals) %>% count()

# A tibble: 25 x 3
# Groups:   Var, intervals [25]
   Var   intervals     n
   <chr> <fct>     <int>
 1 A     (0,0.2]      18
 2 A     (0.2,0.4]    19
 3 A     (0.4,0.6]    16
 4 A     (0.6,0.8]    24
 5 A     (0.8,1]      23
 6 B     (0,0.2]      17
 7 B     (0.2,0.4]    25
 8 B     (0.4,0.6]    18
 9 B     (0.6,0.8]    22
10 B     (0.8,1]      18
# … with 15 more rows

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

library(tidyr)
library(dplyr)
library(ggplot2)
df %>% pivot_longer(everything(), names_to = "Var", values_to = "Val") %>% 
  mutate(intervals = cut(Val, breaks = c(0, 0.2, 0.4,0.6,0.8,1.0))) %>% 
  ggplot(aes(x = intervals,fill = Var)) +
  geom_bar()

enter image description here

Выглядит ли то, что вы ожидаете?

Данные

df <- data.table(A = sample(1:100,100, replace = TRUE)/100,
                 B = sample(1:100,100, replace = TRUE)/100,
                 C = sample(1:100,100, replace = TRUE)/100,
                 D = sample(1:100,100, replace = TRUE)/100,
                 E = sample(1:100,100, replace = TRUE)/100)
...