График с цифрами c и категориальными переменными - PullRequest
1 голос
/ 09 апреля 2020

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

Например, я хочу посмотреть, насколько отличается количество (в тысячах долларов) отгрузок, которые заказывают 3 потребителя по типу продукта. Возьмите данные этого примера:

prueba <- data.frame("client1" = truncnorm::rtruncnorm(n = 60, a = 1, b = 9.8, mean = 6.5, sd = 1),
                     "client2" = truncnorm::rtruncnorm(n = 60, a = 1, b = 9.8, mean = 6.9, sd = 2),
                     "client3" = truncnorm::rtruncnorm(n = 60, a = 1, b = 9.8, mean = 5, sd = 3),
                     "type" = as.factor(sample(LETTERS[1:3], 60, replace = T, prob = c(0.4,0.35,0.25))),
                     "cat" = as.factor(sample(LETTERS[20:22], 60, replace = T, prob = c(0.5, 0.1,0.4))))
prueba[,1:3] <- round(prueba[,1:3], 1)
head(prueba)
#  client1 client2 client3 type cat
#1     6.3     7.2     7.0    B   T
#2     7.2     6.5     3.5    C   T
#3     8.0     6.4     8.0    A   V
#4     8.0     7.4     7.0    A   V
#5     7.5     7.6     2.5    B   V
#6     7.0     9.0     3.7    A   V

С ggplot я могу сделать это:

library(tidyverse)
library(patchwork)

uno <- prueba %>% ggplot(aes(x = type, 
                      y = client1)) +
        geom_boxplot()+scale_y_continuous(limits = c(0,10))

dos <- prueba %>% ggplot(aes(x = type, 
                             y = client2)) +
        geom_boxplot()

tres <- prueba %>% ggplot(aes(x = type, 
                              y = client3)) +
        geom_boxplot()

uno+dos+tres+plot_layout(byrow = F)

Я получаю это: Различия в распределениях:
Differences in distributions

Однако я хочу что-то вроде этого: Что-то вроде этого:
Something like this

Но вместо этого ось x будет заполнена другой категорией ie Я хочу, чтобы он был заполнен дистрибутивом каждого клиента.

  1. Возможно ли это?

  2. Как я могу сделать это в R?

  3. Существуют другие методы визуализации для того же?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Вы ищете это что-то вроде этого?

prueba2 <- prueba %>% 
  pivot_longer(cols = starts_with("client"), names_to = "client")

  ggplot(data = prueba2, aes(x = type, 
                             y = value, 
                             fill = client)) +
  geom_boxplot() 

enter image description here

Если это так, сначала поместите все столбцы client # в один столбец «client» с соответствующими значениями в другой столбец «value» с pivot_longer (из пакета tidyr, уже в tidyverse). Затем пусть ggplot сделает все остальное - все, что мы должны сказать, это: ось x - это «тип», ось y - «значение», а «клиент» - это цвет заливки.

0 голосов
/ 09 апреля 2020

Я не уверен, правильно ли я вас понимаю, но если вам нужен каждый уровень клиента, а не уровень кошки, вам нужно преобразовать все в длинный формат:

prueba <- data.frame("client1" = truncnorm::rtruncnorm(n = 60, a = 1, b = 9.8, mean = 6.5, sd = 1),
                     "client2" = truncnorm::rtruncnorm(n = 60, a = 1, b = 9.8, mean = 6.9, sd = 2),
                     "client3" = truncnorm::rtruncnorm(n = 60, a = 1, b = 9.8, mean = 5, sd = 3),
                     "type" = as.factor(sample(LETTERS[1:3], 60, replace = T, prob = c(0.4,0.35,0.25))),
                     "cat" = as.factor(sample(LETTERS[20:22], 60, replace = T, prob = c(0.5, 0.1,0.4))))
prueba[,1:3] <- round(prueba[,1:3], 1)

library(reshape2)

prueba_long <- melt(prueba,  id.vars = c('type', 'cat'))

ggplot(prueba_long, aes(x = type, y = value, colour = variable)) +
  geom_boxplot()

enter image description here

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