绘图发散堆积条形图与ggplot2

时间:2018-03-07 22:00:54

标签: r ggplot2

有没有办法使用ggplot2创建不同的堆叠条形图,如下图中右侧的条形图?

enter image description here

可重复示例的数据

library(ggplot2)
library(scales)
library(reshape)

dat <- read.table(text = "    ONE TWO THREE
                  1   23  234 324
                  2   34  534 12
                  3   56  324 124
                  4   34  234 124
                  5   123 534 654",sep = "",header = TRUE)

# reshape data
datm <- melt(cbind(dat, ind = rownames(dat)), id.vars = c('ind'))

# plot
ggplot(datm,aes(x = variable, y = value,fill = ind)) + 
  geom_bar(position = "fill",stat = "identity") +
  coord_flip()

2 个答案:

答案 0 :(得分:4)

当然,正值叠加正值,负值叠加负值。不要使用位置fill。只需将您想要的内容定义为负值,实际上将它们设为负值。你的例子只有正分数。 E.g。

ggplot(datm, aes(x = variable, y = ifelse(ind %in% 1:2, -value, value), fill = ind)) + 
    geom_col() +
    coord_flip()

enter image description here

如果您还希望缩放为1,则需要进行一些预处理:

library(dplyr)
datm %>% group_by(variable) %>% mutate(value = value / sum(value)) %>% 
  ggplot(aes(x = variable, y = ifelse(ind %in% 1:2, -value, value), fill = ind)) + 
  geom_col() +
  coord_flip()

enter image description here

答案 1 :(得分:2)

极端的方法可能是自己计算方框。这是一种方法

dd <- datm %>% group_by(variable) %>% 
  arrange(desc(ind)) %>% 
  mutate(pct = value/sum(value), right = cumsum(pct), left=lag(right, default=0))

然后你可以用

绘图
ggplot(dd) + 
  geom_rect(aes(xmin=right, xmax=left, ymin=as.numeric(variable)-.4, ymax=as.numeric(variable)+.4, fill=ind)) + 
  scale_y_continuous(labels=levels(dd$variable), breaks=1:nlevels(dd$variable))

得到左图。为了得到正确的答案,你只需移动一下盒子。这将排列ind 3框的所有右边缘。

ggplot(dd %>% group_by(variable) %>% mutate(left=left-right[ind==3], right=right-right[ind==3])) + 
  geom_rect(aes(xmin=right, xmax=left, ymin=as.numeric(variable)-.4, ymax=as.numeric(variable)+.4, fill=ind)) + 
  scale_y_continuous(labels=levels(dd$variable), breaks=1:nlevels(dd$variable))

enter image description here

所以这里可能有些过分,但你有很多控制方式。