【问题标题】:how to hijack the y-axis on a "negative" stacked bar chart如何劫持“负”堆积条形图上的 y 轴
【发布时间】:2012-12-06 05:50:27
【问题描述】:

我正在尝试使用堆叠条形图来显示 2 组值,以使测量 2 组中相同域的值以相反的方向传播,类似于堆叠的负条形图。我通过将一组值设置为负数来“劫持”一个堆积条形图来做到这一点。这给了我想要的图像;但是,我想从底部的堆叠条中删除底片。有没有办法做到这一点?另外,我想知道为什么条形几何中的 width= 选项不调整条形的宽度?例如,当我在 geom_bar 规范中添加 width=0.5 作为选项时,我收到错误:

Warning message: Stacking not well defined when ymin != 0

无论如何,提前感谢您提供的任何帮助。我的示例代码如下:

test <- structure(list(Mode = structure(c(2L, 1L, 3L, 2L, 1L, 3L), .Label = c("Air","Land", "Sea"), class = "factor"), Side = structure(c(2L, 2L,2L, 1L, 1L, 1L), .Label = c("Allies", "Axis"), class = "factor"),Value = c(72L, 12L, 16L, -84L, -12L, -22L)), .Names = c("Mode", "Side", "Value"), class = "data.frame", row.names = c(NA, -6L))

p <- ggplot(test, aes(x= Mode, y=Value, fill= Mode)) + geom_bar(color = "black", stat="identity", data=subset(test, Side == "Axis")) + geom_bar(color = "black", stat="identity", data=subset(test, Side == "Allies")) + scale_fill_brewer(type = "seq", palette = 1)+ guides(fill=FALSE) + scale_y_continuous(breaks=seq(-100, 100,10))

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我认为geom_bar 中的width issue 已解决,但由于某种原因,我仍然在 0.9.2.1 中看到它。我可能在这方面遗漏了一些东西,但在 aes() 内设置宽度的旧修复方法仍然适用于我。

    另外,我认为您的意思是您希望 0 以下的 y 轴标签不是负数,但您的问题并不完全清楚。如果我是对的,那么这可能就是你所追求的:

    abs_format <- function(){
        function(x){
            abs(x)
        }
    }
    
    p <- ggplot(test, aes(x= Mode, y=Value, fill= Mode,width = 0.1)) + 
            geom_bar(color = "black", stat="identity", data=subset(test, Side == "Axis")) +
            geom_bar(color = "black", stat="identity", data=subset(test, Side == "Allies")) +
            scale_fill_brewer(type = "seq", palette = 1) + 
            guides(fill=FALSE) + 
            scale_y_continuous(breaks=seq(-100, 100,10),labels = abs_format())
    

    另外,我应该补充一点,您收到的关于堆叠定义不明确的消息不是错误。这只是一个警告,意味着您应该保持警惕。 ggplot 有时会在使用负值时很难弄清楚如何堆叠事物。事情通常会奏效,它只是警告你要警惕龙。

    【讨论】:

    • 乔兰,我很抱歉造成混乱。这正是我所追求的!非常非常感谢!