我正在使用以下数据集: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")
这产生了我想要的,但不使用我的数据。这是我得到的图,但是这些值基本上没有随机性,因此没有任何意义。
如何获取这样的数据以作图?
答案 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())
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知道您想要并排显示条形图。