如何在R中获得聚集堆栈栏?

时间:2018-04-16 18:57:50

标签: r ggplot2 data-analysis

我有一个包含以下数据的数据集(比如说):

n=50

df = data.frame(id =c(seq(1,n),seq(1,n)), pre_post = c(rep(0,n),rep(1,n)), q1 = sample(1:5,2*n, replace = TRUE), q2 = sample(1:5,2*n, replace = TRUE),q3 = sample(1:5,2*n, replace = TRUE),q4 = sample(1:5,2*n, replace = TRUE))

df$pre_post = as.factor(df$pre_post)
df$q1 = as.factor(df$q1)
df$q2 = as.factor(df$q2)
df$q3 = as.factor(df$q3)
df$q4 = as.factor(df$q4)

head(df)

enter image description here

我想要一个图表,使得所有问题都应该在x轴上,并且堆栈应该是在前后回复为1,2,... 5的人数。

如何实现这个目标?

我有10个这样的问题,我需要将它绘制在一个图表中。

通常希望比较每个问题在前后的每个因素的频率。

我做了什么?

melted = melt(df, id.vars = c('id','pre_post'))

ggplot(melted, aes(x = pre_post, y =id , fill = value)) + 
  geom_bar(stat = 'identity', position = 'stack') + facet_grid(~variable)

这给了我以下情节。但这张图似乎不正确。我哪里错了?

enter image description here

1 个答案:

答案 0 :(得分:1)

正如人们在评论中提到的那样,geom_bar旨在无需输入。拥有y = id意味着您将y值设置为所有ID的总和,这不是您想要的。 geom_bar使用stat_count而不是stat_identity在幕后进行计数,然后将其映射到y值。

所以你可以保持一切都非常简单 - 没有y,没有统计数据 - 让geom_bar为你设定。

library(ggplot2)
library(reshape2)

n=50

df = data.frame(
    id =c(seq(1,n),seq(1,n)), 
    pre_post = c(rep(0,n),rep(1,n)), 
    q1 = sample(1:5,2*n, replace = TRUE), 
    q2 = sample(1:5,2*n, replace = TRUE),
    q3 = sample(1:5,2*n, replace = TRUE),
    q4 = sample(1:5,2*n, replace = TRUE)
)

df$pre_post = as.factor(df$pre_post)
df$q1 = as.factor(df$q1)
df$q2 = as.factor(df$q2)
df$q3 = as.factor(df$q3)
df$q4 = as.factor(df$q4)


melted <- melt(df, id.vars = c('id','pre_post'))


ggplot(melted, aes(x = pre_post, fill = value)) +
    geom_bar(position = "stack") +
    facet_grid(~ variable)

我提到了第二个例子,因为你提到了显示每个答案的频率。您可以使用stat_count调用为标签制作文字地理位置。请注意,calc(count)..count..的新替代品,但新语法可能只在ggplot2的github版本中。

ggplot(melted, aes(x = pre_post, fill = value)) +
    geom_bar(position = "stack") +
    stat_count(aes(label = calc(count)), geom = "text", position = position_stack(vjust = 0.5)) +
    facet_grid(~ variable)

reprex package(v0.2.0)创建于2018-04-17。