6

我有一个数据框,其中包含百分比份额,代表不同项目的列,行代表不同类别回答的受访者的各自份额。我想制作一个堆叠的条形图。

library(ggplot2)
library(reshape2)
 test<-data.frame(i1=c(16,40,26,18),
               i2=c(17,46,27,10),
               i3=c(23,43,24,10),
               i4=c(19,25,20,36))
 rownames(test)<-c("very i.","i.","less i.","not i.")

test.m<-melt(test)

ggplot(test.m, aes(x=variable, y=value, fill=value)) + 
   geom_bar(position="stack", stat="identity")

看起来不错,但我想要
a) 居中条形:肯定答案(非常 i. 和 i.)向上和底部两个类(更少 i.而不是 i.)向下。
b) 每个类别(非常 i,i,less i,not i,)具有相同的颜色。

任何帮助将非常感激。

4

2 回答 2

12

最好使用类别名称而不是行名称作为分隔符:

test$category <- factor(c(3,4,2,1), labels=c("very i.","i.","less i.","not i."))

(因子水平的排序是根据堆积条形图(最低:not i.,最高:very i.)完成的。

test.m <- melt(test)

要回答您的问题:

  1. 如果某些值高于而其他值低于零,则堆叠条形图效果不佳。因此,创建了两个单独的条形图(一个具有负值,一个具有正值)。
  2. 新列category用于fill将每个类别映射到不同颜色的参数。

完整代码:

ggplot(test.m, aes(x=variable, fill=category)) + 
      geom_bar(data = subset(test.m, category %in% c("less i.","not i.")),
               aes(y = -value), position="stack", stat="identity") +
      geom_bar(data = subset(test.m, !category %in% c("less i.","not i.")), 
               aes(y = value), position="stack", stat="identity")

在此处输入图像描述

于 2012-11-16T20:02:11.053 回答
10

另一个专门为此目的设计的工具是likert()在 HH 包中。这个甜蜜的函数绘制了适合李克特、语义差异和评级量表数据的发散堆积条形图。

library(HH)
# note use of t(test)[,4:1] to transpose and mirror dataframe for easy plotting
# test dataframe is otherwise unaltered from OP's question

likert(t(test)[,4:1], horizontal = FALSE,
       main = NULL, # or give "title",
       xlab = "Percent", # becomes ylab due to horizontal arg
       auto.key = list(space = "right", columns = 1,
                     reverse = TRUE))

在此处输入图像描述

一个特别吸引人的功能likert()是能够以 ReferenceZero 参数为中心的中性响应。(注意它如何为参考响应使用适当的灰色):

likert(t(test)[,4:1], horizontal=FALSE,
       main = NULL, # or give "title",
       xlab = "Percent", # becomes ylab due to horizontal arg
       ReferenceZero = 3,
       auto.key=list(space = "right", columns = 1,
                     reverse = TRUE))

以一个响应为中心的李克特数据

(这些示例使用垂直条很常见,但horizontal=TRUE通常更好,尤其是如果想要包含问题或比例名称。)

于 2012-12-04T15:58:45.940 回答