【问题标题】:Plot divergent stacked bar chart with ggplot2用ggplot2绘制发散堆积条形图
【发布时间】:2018-03-07 22:00:53
【问题描述】:

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

可重现示例的数据

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()

【问题讨论】:

标签: r ggplot2


【解决方案1】:

当然,正值叠加,负值叠加。不要使用位置fill。只需将您想要的定义为负值,然后将它们设为负值。您的示例只有正分数。例如

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

如果你还想缩放到 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()

【讨论】:

    【解决方案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))
    

    所以这里可能有点矫枉过正,但你可以通过这种方式进行大量控制。

    【讨论】:

    • 是的,如果目标是填充到 1 并堆叠 pos 和 neg,我很确定无论如何你都需要预先计算。但我认为,您仍然应该能够只将所有级别缩放到 1,然后更改为负数并使用位置堆栈进行绘图。不需要geom_rect
    • @Axeman 似乎是对的。老实说,我不知道 ggplot 将如何处理堆叠负值条。我只是想表明你基本上可以画出你想要的任何东西以及它的样子。
    • 公平地说,IIRC 的负堆叠在某个时候发生了变化,可能是一年前左右?同意当事情没有按照你想要的方式发展时,你可以绘制像rect这样的图元!
    猜你喜欢
    • 2021-01-01
    • 2019-01-14
    • 1970-01-01
    • 2012-09-17
    • 2021-12-27
    • 2023-03-27
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多