【问题标题】:ggplot2 bar chart sign on y-axisggplot2 条形图符号在 y 轴上
【发布时间】:2017-09-25 09:03:25
【问题描述】:

我有以下数据:

mydata <- data.frame(x = c("UK1", "UK2", "UK3", "UK4", "UK5", "UK6", "UK7"), 
                     n = c(50, 55, 58, 64, 14, 18, 45), 
                     F = c(-6, 17, 26, -37, 44, -22, 15), 
                     z = c("a", "a", "b", "a" , "b", "b", "a"))

我想创建一个 x 列(x 轴)的 ggplot(条形图),对照列 z 列的 n 列(y 轴)颜色分割。棘手的部分是,如果 F 中的值为正,我希望条形图向上走,如果为负,则向下走。 ggplot 可以吗?

【问题讨论】:

  • 您因提供数据框而受到好评。但是您的问题涉及zZ;后者应该是F 对应数据框中的那个?

标签: r ggplot2 bar-chart


【解决方案1】:

使用sign的解决方案:

您可以使用sign() 提取F 的符号并将其乘以nn * sign(F)

library(ggplot2)

mydata <- data.frame(x = c("UK1", "UK2", "UK3", "UK4", "UK5", "UK6", "UK7"), 
                     n = c(50, 55, 58, 64, 14, 18, 45), 
                     F = c(-6, 17, 26, -37, 44, -22, 15), 
                     z = c("a", "a", "b", "a" , "b", "b", "a"))

ggplot(mydata, aes(x, n * sign(F), fill = z)) +
    geom_bar(stat = "identity", position = "dodge")

【讨论】:

    【解决方案2】:

    我的代表太低,无法评论或投票,所以这里的答案建立在前一个的基础上:

      ggplot(mydata) +
        geom_bar(aes(x = x, y =(n*ifelse(F<0,-1,1)), fill = z), stat = "identity") +
        scale_y_continuous(labels=abs)
    

    这会在 1 go 中添加方向(不需要额外的列),并使用 abs() 函数转换 y 轴的标签。

    【讨论】:

    • 使用labels = abs的好提示
    【解决方案3】:

    ggplot2 中的条形图是用geom_bar 制作的,但默认使用stat_bin,即它会为您计算 bin 中的出现次数。诀窍是告诉 ggplot2 按原样使用这些值。这是通过geom_bar(stat='identity') 完成的。

    其次,要让一些上升和一些下降,您需要变量的值是正数和负数。我在下面的代码中采用了一种方法。

    mydata$dir <- ifelse(mydata$F < 0, -1, 1)
    ggplot(mydata, aes(x=x, y=n*dir, colour=z)) + geom_bar(stat='identity')
    

    【讨论】:

    • 谢谢,但有没有办法覆盖 x 轴以使值成为绝对值。所以轴会从 60 到 30 到 0 到 30 到 60
    • 看看scale_y_continuous;您必须手动设置breakslabels
    猜你喜欢
    • 2021-02-26
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多