重新排序ggplot2中堆积条形图中的级别,没有计数数据

时间:2014-04-25 19:56:38

标签: r ggplot2

我正在使用ggplot2来生成平均值(不是计数)的堆积条形图。这可以使用以下代码正常工作:

new.stop <- read.delim("New_stop_data.txt")

A <- ggplot(new.stop, aes(x=Consonant, y=(Duration*1000), fill = Label)) + stat_summary(fun.y="mean", geom="bar") + coord_flip() + theme_bw() + ylab("Duration (ms)") + xlab("Stop")
A + scale_fill_grey()

以这种方式绘制事物原则上工作正常并产生以下plot。但是,“投票”和“结束”等级的顺序应该颠倒,右边是投票。我试图通过使用relevel()和另外的factor()来解决这个问题,如下所示:

new.stop$Label <- relevel(new.stop$Label, ref="vot")
new.stop$Label <- factor(new.stop$Label, levels = c("vot", "closure"), labels=c("VOT", "Closure"))

然而,正如您所看到的,这只会产生barplot where both values are merged。我甚至试图在ggplot2中重新排序,但无济于事。由于这些数据不是计数数据(并且ggplot2假设您只使用条形图的计数数据),我一直无法找到任何似乎在这里工作的帮助。非常感谢任何帮助。

PS:对于我正在做的事情,barplots是典型的。

2 个答案:

答案 0 :(得分:2)

对不起。我在访问用户提供的数据之后编辑了我的答案,几个小时后。

从提供的数据来看,我首先要看看它应该如何排列,数字化。

dat&lt; - read.delim(.. \ New_stop_data.txt)

head(subset(dat, select = c(Consonant, Label, Duration)))

  Consonant   Label    Duration
1       /p/ closure 0.127097695
2       /p/     vot 0.007426832
3       /p/ closure 0.128724749
4       /p/     vot 0.006942377
5       /p/ closure 0.116493725
6       /p/     vot 0.007421805

将其总结为计数

ddply(dat, .(Consonant, Label), summarise, length(Duration*1000))

  Consonant   Label   D
1       /k/ closure 119
2       /k/     vot 119
3      /kw/ closure  75
4      /kw/     vot  75
5       /p/ closure 117
6       /p/     vot 117
7       /t/ closure 116
8       /t/     vot 116

情节计数

ggplot(dat, aes(x=Consonant), y=(Duration*1000)) + 
      geom_bar(aes(fill = Label), stat="bin") + 
      coord_flip() +
      theme_bw() + 
      labs(list = c(x="Duration (ms)", y='Stop')) +
      scale_fill_grey()+
      guides(fill = guide_legend(reverse = TRUE))

counts

和手段

ddply(dat, .(Consonant, Label), summarise, D = mean(Duration*1000))

  Consonant   Label         D
1       /k/ closure 108.35499
2       /k/     vot  26.52917
3      /kw/ closure 122.28891
4      /kw/     vot  31.46828
5       /p/ closure 135.90023
6       /p/     vot  11.27705
7       /t/ closure 124.73526
8       /t/     vot  16.91066

ggplot(dat, aes(x=Consonant, y=(Duration*1000))) + 
  geom_bar(stat="summary", fun.y = mean, aes(fill = Label)) + 
  coord_flip() + 
  theme_bw() + 
  labs(list(y="Duration (ms)", x='Stop')) +
  scale_fill_grey() +
  guides(fill = guide_legend(reverse = TRUE))

means

答案 1 :(得分:2)

当你开始使用统计数据时,有一些深度魔法。或者至少,这是我的愚昧观点。无论如何,更好的是:

  1. 将geom_bar与stat参数一起使用,而不是相反。
  2. 将aes(fill)放在geom_bar()中,而不是ggplot()函数中。
  3. 有一些有趣的东西正在进行聚合的顺序。按照上面的说法,它最初按预期工作,无需重新订购等级或任何东西:

    ggplot(new.stop, aes(x=Consonant, y=(Duration*1000))) + geom_bar(stat="summary", fun.y = mean, aes(fill = Label)) + coord_flip() + theme_bw() + ylab("Duration (ms)") + xlab("Stop") + scale_fill_grey()
    

    FWIW,这就是我个人倾向于避免统计数据的原因。当我首先进行数据汇总(使用plyr或dplyr或其他东西)然后ggplot汇总表时,我总能获得更可预测的结果。