我想使用因子和两个以上变量创建条形图!我的数据如下所示:
Var1 Var2 ... VarN Factor1 Factor2
Obs1 1-5 1-5 ... 1-5
Obs2 1-5 1-5 ... ...
Obs3 ... ... ... ...
每个数据点都是一个范围从 1-5 的 Likert 项
使用二分版本绘制总和(4 以上的每一项都是 1,否则为 0)
我用这个转换了数据
MyDataFrame = dichotomize(MyDataFrame,>=4)
p <- colSums(MyDataFrame)
p <- data.frame(names(p),p)
names(p) <- c("var","value")
ggplot(p,aes(var,value)) + geom_bar() + coord_flip()
这样做我会丢失由因子1等提供的信息,我想使用堆叠来可视化评级来自哪一组人
有没有一个优雅的解决方案来解决这个问题?我读到有关使用 reshape 来融合数据然后应用 ggplot?
最佳答案
我建议如下:使用一个因子进行堆叠,另一个因子进行分面。您可以将 position="fill"
删除到 geom_bar()
以使用计数而不是标准化值。
my.df <- data.frame(replicate(10, sample(1:5, 100, rep=TRUE)),
F1=gl(4, 5, 100, labels=letters[1:4]),
F2=gl(2, 50, labels=c("+","-")))
my.df[,1:10] <- apply(my.df[,1:10], 2, function(x) ifelse(x>4, 1, 0))
library(reshape2)
my.df.melt <- melt(my.df)
library(plyr)
res <- ddply(my.df.melt, c("F1","F2","variable"), summarize, sum=sum(value))
library(ggplot2)
ggplot(res, aes(y=sum, x=variable, fill=F1)) +
geom_bar(stat="identity", position="fill") +
coord_flip() +
facet_grid(. ~ F2) +
ylab("Percent") + xlab("Item")
在上图中,我显示了 F1(四个水平)和 F2(两个水平)的每个组合的观测频率“1”(李克特量表上的值高于 4),其中有 10 个或 15 个观测值:
> xtabs(~ F1 + F2, data=my.df)
F2
F1 + -
a 15 10
b 15 10
c 10 15
d 10 15
然后,我使用原始 data.frame 的“融化”版本,通过 ddply
,† 计算条件项总分。我相信其余的图形命令是高度可配置的,具体取决于您想要显示的信息类型。
† 在这种简化的情况下,ddply
指令相当于 with(my.df.melt,aggregate(value, list(F1) =F1,F2=F2,变量=变量),总和))
。
关于r - 通过ggplot2绘制多个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9152937/