使用ggplot创建以零为中心的堆积条形图

时间:2013-10-21 22:24:44

标签: r ggplot2

我目前正在使用R中的ggplot2处理堆叠的水平条形图表。

这是我的R代码:

ggplot(results, aes(x=Protocol, y=Time, fill=Phase)) + 
  geom_bar(stat="identity") + coord_flip()

它产生了这个图: Example Graph

我想将此图表居中,以便第1阶段和第2阶段位于左侧,第3阶段和第4阶段位于右侧。

这是我正在寻找的一个粗略的想法。但是想象一下,中心线是时间0,时间在任何一个方向都是积极的: Example of Goal

我想我应该背靠背制作两张图?

2 个答案:

答案 0 :(得分:5)

这种类型的图表大量用于类似于中心点的正面和负面感知的类似调查数据

你想做什么我在2011年初的一篇文章中称之为“净堆积分布”,也被称为分歧条形图。你会发现它以两种方式提到。威拉德·布林顿在1939年出版的“平面展示”一书中使用了它。那里有很多。

我的示例和解释,包含Tableau的代码:http://www.organizationview.com/net-stacked-distribution-a-better-way-to-visualize-likert-data

Naomi Robbins写了一篇论文:http://www.amstat.org/membersonly/proceedings/2011/papers/300784_64164.pdf

一些R示例

Jason Bryer提供了一个Likert包,其中包含相应的网站:http://jason.bryer.org/likert/

HH包在格子

中实现它

对Cross Validated的一个非常好的解释:https://stats.stackexchange.com/questions/25109/visualizing-likert-responses-using-r-or-spss

杰森贝克尔:http://blog.jsonbecker.com/2012/07/ranked-likert-scale-visualization.html

Ethan Brown:http://statisfactions.com/2012/improved-net-stacked-distribution-graphs-via-ggplot2-trickery/

Daniel Luedecke:http://strengejacke.wordpress.com/2013/07/17/plotting-likert-scales-net-stacked-distributions-with-ggplot-rstats/

这些图表中最大的争议点是如何处理中性价值。 Naomi建议将其分割在中心轴的两侧。我认为中性值既不是正面的也不是负面的,因此我们应该将其有效地视为零,而不是在图表上显示它(它可以与次要图形或图表上的不适用值一起绘制)。 p>

我已经在这些图表上做了一些可用性测试,虽然它们比其他许多价值表现得更好,但更像是净数字(积极情绪 - 负面情绪,类似于净推动者得分的计算方式)似乎更受欢迎。

答案 1 :(得分:0)

这就是我的意思:

library(scales)
dat <- read.csv("~/Downloads/bench.csv",stringsAsFactors = TRUE)
dat$Time1 <- ifelse(dat$Phase %in% c('Decode','Deserialize'),-dat$Time,dat$Time)

up <- dat[dat$Time1 >= 0,]
down <- dat[dat$Time1 < 0,]

commapos <- function(x, ...) {
    format(abs(x), big.mark = ",", trim = TRUE,
           scientific = FALSE, ...)
}

ggplot() + 
    geom_bar(data = up,aes(x = Protocol,y = Time1,fill = as.integer(Phase)),stat = "identity") + 
    geom_bar(data = down,aes(x = Protocol,y = Time1,fill = as.integer(Phase)),stat = "identity") + 
    scale_y_continuous(labels = commapos) +
    coord_flip()

commapos格式化程序,我实际上只是从我自己的现有代码中抓取的,当时我做了类似的事情。您可能不需要精确的格式,但abs(x)是关键部分。

另外,请注意您的Phase变量是一个字符/因子,因此要从原始颜色条中获取颜色条,我必须强制回整数。

而且,正如我所提到的,当使用小于零的值时,ggplot会抱怨堆栈没有很好地定义。如果您在不将数据框分成正/负值的情况下尝试此操作,您将看到原因。