首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在一个柱状图上绘制多个变量?

在一个柱状图上绘制多个变量?
EN

Stack Overflow用户
提问于 2019-05-10 01:05:35
回答 1查看 192关注 0票数 -1

我正在使用这个数据集:https://archive.ics.uci.edu/ml/datasets/Wholesale+customers

我想要绘制一个直方图,其中包含所有已花费的变量(除了区域和渠道之外的所有变量)。我希望它们是按通道绘制的,它有2个级别。我从一个网站的示例中获得了以下代码,但将其放入了我的变量中:

代码语言:javascript
复制
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")

这会产生我想要的东西,但它不会使用我的数据。这是我得到的图表,但这些值没有任何意义,因为它们基本上是随机的。

我如何让我的数据像这样绘制?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-10 01:55:02

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

代码语言:javascript
复制
library(ggplot2)
library(tidyr)

在读取具有列的正确类的数据之后( Channel和Region的系数,而其余六个字段是数值),检查数据的正确性。

代码语言:javascript
复制
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'))
代码语言:javascript
复制
str(df)
代码语言:javascript
复制
'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 ...
代码语言:javascript
复制
head(df)
代码语言:javascript
复制
  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来生成所需的条形图(而不是直方图)。

代码语言:javascript
复制
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))将从以下位置重塑数据集:

代码语言:javascript
复制
  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

到一个“较长”的数据集,它现在的product类型为rows:

代码语言:javascript
复制
  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就会知道你想让条形图并排出现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56064355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档