Разместите несколько переменных на одном барплоте? - PullRequest
0 голосов
/ 09 мая 2019

Я работаю с этим набором данных: https://archive.ics.uci.edu/ml/datasets/Wholesale+customers

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

category=c(rep("Fresh",2),rep("Grocery",2),rep("Milk",2),rep("Frozen",2),
         rep("Detergents_Paper",2),rep("Delicassen",2))
condition=rep(c("Food Service", "Retail"))
value=abs(rnorm(12 , 0 , 15))
data=data.frame(category,condition,value)

ggplot(data, aes(fill=condition, y=value, x=category)) + 
  geom_bar(position="dodge", stat="identity")

Это производит то, что я хочу, но не использует мои данные. Вот график, который я получаю, но значения ничего не значат, поскольку они в основном случайные.

Multivariate Histogram

Как мне получить мои данные для построения графика?

1 Ответ

1 голос
/ 09 мая 2019

Загружая пакет tidyr, можно изменить данные для поддержки ожидаемого вывода.

library(ggplot2)
library(tidyr)

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

df <- read.csv(file = url('https://archive.ics.uci.edu/ml/machine-learning-databases/00292/Wholesale%20customers%20data.csv'), colClasses = c('factor','factor','numeric','numeric','numeric','numeric','numeric','numeric'))
str(df)
'data.frame':   440 obs. of  8 variables:
 $ Channel         : Factor w/ 2 levels "1","2": 2 2 2 1 2 2 2 2 1 2 ...
 $ Region          : Factor w/ 3 levels "1","2","3": 3 3 3 3 3 3 3 3 3 3 ...
 $ Fresh           : num  12669 7057 6353 13265 22615 ...
 $ Milk            : num  9656 9810 8808 1196 5410 ...
 $ Grocery         : num  7561 9568 7684 4221 7198 ...
 $ Frozen          : num  214 1762 2405 6404 3915 ...
 $ Detergents_Paper: num  2674 3293 3516 507 1777 ...
 $ Delicassen      : num  1338 1776 7844 1788 5185 ...
head(df)
  Channel Region Fresh Milk Grocery Frozen Detergents_Paper Delicassen
1       2      3 12669 9656    7561    214             2674       1338
2       2      3  7057 9810    9568   1762             3293       1776
3       2      3  6353 8808    7684   2405             3516       7844
4       1      3 13265 1196    4221   6404              507       1788
5       2      3 22615 5410    7198   3915             1777       5185
6       2      3  9413 8259    5126    666             1795       1451

Похоже, что данные импортированы правильно.

Далее мы используемкомбинация tidyr :: collect и ggplot2 :: ggplot для создания желаемого гистограммы (не гистограммы).

df %>%
  tidyr::gather(Type, Amount, -c(Channel, Region)) %>%
  ggplot(aes(x=Type, y=Amount, fill=Channel, group=Channel)) +
    geom_col(position = position_dodge())

enter image description here

tidyr::gather(Type, Amount, -c(Channel, Region))изменит набор данных из этого:

  Channel Region Fresh Milk Grocery Frozen Detergents_Paper Delicassen
1       2      3 12669 9656    7561    214             2674       1338
2       2      3  7057 9810    9568   1762             3293       1776
3       2      3  6353 8808    7684   2405             3516       7844
4       1      3 13265 1196    4221   6404              507       1788
5       2      3 22615 5410    7198   3915             1777       5185
6       2      3  9413 8259    5126    666             1795       1451

В «более длинный» набор данных, который теперь имеет тип продукта в виде строк:

  Channel Region  Type Amount
1       2      3 Fresh  12669
2       2      3 Fresh   7057
3       2      3 Fresh   6353
4       1      3 Fresh  13265
5       2      3 Fresh  22615
6       2      3 Fresh   9413

Это подготовит данные для построения с использованиемggplot2 :: ggplot, где ввод x может быть сопоставлен с новой переменной Type, а переменная y с Amount.Обязательно используйте Group=Channel и position=position_dodge(), чтобы ggplot знал, что вы хотите столбцы рядом.

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