5

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

这是我的 R 代码:

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

它产生了这个图: 示例图

我想使这张图表居中,以便第 1 阶段和第 2 阶段在左侧,第 3 和第 4 阶段在右侧。

这是我正在寻找的一个粗略的想法。但是想象中心线是时间 0,时间在任一方向上都是正数: 目标示例

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

4

2 回答 2

7

这种类型的图表大量用于李克特类型的调查数据,显示围绕中心点的正面和负面看法

你想要做什么我在 2011 年初的一篇文章中称其为“网络堆叠分布”,也称为发散条形图。您会发现它以两种方式提及。威拉德·布林顿 (Willard Brinton) 在他 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 包在 lattice 中实现它

关于交叉验证的一个非常好的解释:https ://stats.stackexchange.com/questions/25109/visualizing-likert-responses-using-r-or-spss

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

伊桑·布朗:http ://statisfactions.com/2012/improved-net-stacked-distribution-graphs-via-ggplot2-trickery/

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

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

我已经对这些图表进行了一些可用性测试,虽然它们的性能优于许多其他值,但似乎更喜欢更简单的东西,比如净值(积极情绪 - 消极情绪,类似于净推荐值的计算方式)。

于 2013-10-22T12:36:15.757 回答
2

这就是我的意思:

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 会抱怨堆叠定义不明确。如果您在不将数据框分成正/负值的情况下尝试此操作,您就会明白原因。

于 2013-10-21T23:00:01.317 回答