我有一个调查文件,其中行是观察和列的问题。
以下是一些fake data的外观:
People,Food,Music,People
P1,Very Bad,Bad,Good
P2,Good,Good,Very Bad
P3,Good,Bad,Good
P4,Good,Very Bad,Very Good
P5,Bad,Good,Very Good
P6,Bad,Good,Very Good
我的目标是用ggplot2
创建这种图。
- 我绝对不在乎颜色,设计等
- 图与假数据不符
以下是我的假数据:
raw <- read.csv("http://pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
但是如果我选择Y作为计数,那么我就面临一个选择X和Group值的问题...我不知道如果不使用reshape2
是否能成功...我也尝试过使用带有melt函数的reshape。但是我不知道如何使用它...
2条答案
按热度按时间3vpjnl9f1#
**编辑:**多年后
对于纯ggplot 2 +
utils::stack()
解决方案,请参阅@markus的answer!一个有点冗长的tidyverse解决方案,所有非基本包都显式地声明,以便您知道每个函数来自哪里:
原答案:
首先,你需要得到每个类别的计数,即每个组(食物,音乐,人)有多少Bads和Goods等。这将是这样做的:
然后,您需要从中创建一个数据框,将其融化并绘制:
这就是你要找的吗?
为了澄清一点,在ggplot multiple grouping bar中,您有一个看起来像这样的 Dataframe :
由于第4-9列中有数值,稍后将在y轴上绘制,因此可以很容易地用
reshape
进行转换并绘制。对于我们当前的数据集,我们需要类似的东西,所以我们使用
freq=table(col(raw), as.matrix(raw))
来获得:想象一下,你有
Very.Bad
,Bad
,Good
等等,而不是X1PCE
,X2PCE
,X3PCE
。看到相似之处了吗?但是我们需要先创建这样的结构。因此有了freq=table(col(raw), as.matrix(raw))
。xnifntxz2#
在@jakub的回答中,计算是在数据传递到
ggplot()
之前完成的,这就是为什么geom_bar
中的stat
被设置为"identity"
(即按原样获取数据,不做任何事情)。另一种方法是让
ggplot
为您计数,因此我们可以使用stat = "count"
,即geom_bar
的默认值:数据