如何为带有百分比的多个变量创建堆叠的条形图 [英] how to create stacked bar charts for multiple variables with percentages
问题描述
我正在尝试使用多个变量创建堆积的条形图,但是我遇到了两个问题:
I am trying to create a stacked bar chart with multiple variables, but I am stuck on two issues:
1)我似乎无法使旋转的y轴显示百分比而不是计数.
1) I can't seem to get the rotated y-axis to display percentages instead of counts.
2)我想基于完全同意"响应的百分比对变量(desc)进行排序.
2) I would like to sort the variables (desc) based on the percentage of the "strongly agree" response.
这是到目前为止我所拥有的一个例子:
Here is an example of what I have so far:
require(scales)
require(ggplot2)
require(reshape2)
# create data frame
my.df <- data.frame(replicate(10, sample(1:4, 200, rep=TRUE)))
my.df$id <- seq(1, 200, by = 1)
# melt
melted <- melt(my.df, id.vars="id")
# factors
melted$value <- factor(melted$value,
levels=c(1,2,3,4),
labels=c("strongly disagree",
"disagree",
"agree",
"strongly agree"))
# plot
ggplot(melted) +
geom_bar(aes(variable, fill=value, position="fill")) +
scale_fill_manual(name="Responses",
values=c("#EFF3FF", "#BDD7E7", "#6BAED6",
"#2171B5"),
breaks=c("strongly disagree",
"disagree",
"agree",
"strongly agree"),
labels=c("strongly disagree",
"disagree",
"agree",
"strongly agree")) +
labs(x="Items", y="Percentage (%)", title="my title") +
coord_flip()
我要感谢几个人的帮助,以帮助实现这一目标.以下是Google提供的众多页面中的一些:
I owe thanks to several folks for help in getting this far. Here are a few of the many pages that Google served up:
http://www. r-bloggers.com/fumblings-with-ranked-likert-scale-data-in-r/
sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] reshape2_1.2.2 ggplot2_0.9.2.1 scales_0.2.2
loaded via a namespace (and not attached):
[1] colorspace_1.2-0 dichromat_1.2-4 digest_0.6.0 grid_2.15.0 gtable_0.1.1 HH_2.3-23
[7] labeling_0.1 lattice_0.20-10 latticeExtra_0.6-24 MASS_7.3-22 memoise_0.1 munsell_0.4
[13] plyr_1.7.1 proto_0.3-9.2 RColorBrewer_1.0-5 rstudio_0.97.237 stringr_0.6.1 tools_2.15.0
推荐答案
对于(1)
要获取百分比,您必须从melted
创建一个data.frame
.至少那是我能想到的方式.
For (1)
To get percentages, you'll have to create a data.frame
from melted
. At least that's the way I could think of.
# 200 is the total sum always. Using that to get the percentage
require(plyr)
df <- ddply(melted, .(variable, value), function(x) length(x$value)/200 * 100)
然后在geom_bar
中的weights
中提供计算出的百分比,如下所示:
Then supply the calculated percentages as weights
in geom_bar
as follows:
ggplot(df) +
geom_bar(aes(variable, fill=value, weight=V1, position="fill")) +
scale_fill_manual(name="Responses",
values=c("#EFF3FF", "#BDD7E7", "#6BAED6",
"#2171B5"),
breaks=c("strongly disagree",
"disagree",
"agree",
"strongly agree"),
labels=c("strongly disagree",
"disagree",
"agree",
"strongly agree")) +
labs(x="Items", y="Percentage (%)", title="my title") +
coord_flip()
我不太了解(2).您是否要(a)计算relative percentages
(以完全同意"为参考??或(b)您是否希望绘图始终显示非常同意",然后显示同意",等等.您可以完成(b ),只需将df中的因子重新排序,
I don't quite understand (2). Do you want to (a) calculate relative percentages
(with reference as "strongly agree"? Or (b) do you want always the plot to display "strongly agree", then "agree", etc.. You can accomplish (b) by just reordering factors in df by,
df$value <- factor(df$value, levels=c("strongly agree", "agree", "disagree",
"strongly disagree"), ordered = TRUE)
Edit:
您可以将variable
和value
的级别重新排序为所需的顺序,如下所示:
You can reorder the levels of
variable
and value
to the order you require as follows:
variable.order <- names(sort(daply(df, .(variable),
function(x) x$V1[x$value == "strongly agree"] ),
decreasing = TRUE))
value.order <- c("strongly agree", "agree", "disagree", "strongly disagree")
df$variable <- factor(df$variable, levels = variable.order, ordered = TRUE)
df$value <- factor(df$value, levels = value.order, ordered = TRUE)
这篇关于如何为带有百分比的多个变量创建堆叠的条形图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!