我有一个包含以下数据的数据集(比如说):
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)
我想要一个图表,使得所有问题都应该在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)
这给了我以下情节。但这张图似乎不正确。我哪里错了?
答案 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。