在一个小图中绘制多个变量?

时间:2019-05-09 17:05:35

标签: r ggplot2 histogram

我正在使用以下数据集: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 个答案:

答案 0 :(得分:1)

通过加载tidyr包,可以对数据进行重塑以支持预期的输出。

library(ggplot2)
library(tidyr)

在使用正确的列类(在剩下的六个字段为数字的情况下,Channel和Region的因子)读取数据之后,请检查数据的正确性。

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 :: gather和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=Channelposition=position_dodge(),以便ggplot知道您想要并排显示条形图。