【问题标题】:Different bar color for positive and negative bars in bar plot [duplicate]条形图中正负条的不同条颜色[重复]
【发布时间】:2020-05-16 06:13:23
【问题描述】:

我想要一个条形图,如果数字为正,则将条形着色为红色,如果数字为负,则将条形着色为绿色。我希望它采用 ggplot“模板”的形式,我可以在其中更改基础数据,并且它仍然可以执行我想要的操作。目前我的代码只有在所有数字都是正数或者我的数据中有正数和负数时才有效。

版本 1(不起作用)。但是,所有条都应该是绿色的,因为没有正数,fill = change < 0 不起作用,在这种情况下它只需要第一种颜色,即红色。

data1 <- data.frame(group = as.factor(c("all", "men", "women")),
                   change = as.numeric(c(-10000, -6000, -4000)))

ggplot(data1, 
       aes(x = group, 
           y = change, 
           fill = change < 0)) + 
  geom_bar(stat = "identity") + 
  scale_fill_manual(guide = FALSE,
                    values = c("red", "green"))

第 2 版(按预期工作)。

data2 <- data.frame(group = as.factor(c("all", "men", "women")),
                    change = as.numeric(c(2000, 6000, -4000)))

ggplot(data2, 
       aes(x = group, 
           y = change, 
           fill = change < 0)) + 
  geom_bar(stat = "identity") + 
  scale_fill_manual(guide = FALSE,
                    values = c("red", "green"))

第 3 版(工作 - 偶然?)。所有的条都是红色的,但我猜在版本 1 中只是这种情况,因为红色首先出现在 scale_fill_manual 中指定的颜色中?

data3 <- data.frame(group = as.factor(c("all", "men", "women")),
                    change = as.numeric(c(10000, 6000, 4000)))

ggplot(data3, 
       aes(x = group, 
           y = change, 
           fill = change < 0)) + 
  geom_bar(stat = "identity") + 
  scale_fill_manual(guide = FALSE,
                    values = c("red", "green"))

无论我使用 data1、data2 还是 data3 作为输入,我如何指定条形颜色以使其按我的意愿工作?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    一种可能的方法是基于ifelse 语句定义一个颜色列,然后使用scale_fill_identity 应用相应的颜色:

    library(dplyr)
    library(ggplot2)
    data2 %>% mutate(Color = ifelse(change <0, "red","green")) %>%
      ggplot(aes(x = group, y = change, fill = Color))+
      geom_col()+
      scale_fill_identity(guide = FALSE)
    

    【讨论】:

    • 不错。你介意考虑将这个添加/转移到主要的questoin,这是一个副本吗?stackoverflow.com/questions/11838278/…
    • 我想但是在您所指的问题的示例中,颜色代码没有意义。没有办法根据例子得到绿色
    • 虽然我不明白你的意思 - 我已经看到你已经添加了你的答案。 +2(到处都是;)
    • ;) 我做到了,但我在提到 OP 在另一个问题上提出的问题:“如果 X 的值 > 0,那么该值应该是绿色的......如果Y > 0,则该值应为红色”。根据示例,如果我们应用正确的 ifelse 语句,所有值都应该是红色的。我在写这个问题时认为这是一个错字。
    • 如果不是,则示例不适合此特定语句。由于问题来自 2012 年,我相信 OP 已满足 @mnel 的回答。
    【解决方案2】:

    使用 SO 答案 here 并根据您的情况稍微调整一下,就可以通过这种方式使用 scale_fill_manual 来获得您想要的东西:

    library(ggplot2)
    
    data1 <- data.frame(group = as.factor(c("all", "men", "women")),
                        change = as.numeric(c(-10000, -6000, -4000)))
    
    data2 <- data.frame(group = as.factor(c("all", "men", "women")),
                        change = as.numeric(c(2000, 6000, -4000)))
    
    data3 <- data.frame(group = as.factor(c("all", "men", "women")),
                        change = as.numeric(c(10000, 6000, 4000)))
    
    myplot <- function(df){
        ggplot(df, 
               aes(x = group, 
                   y = change, 
                   fill = change < 0)) + 
            geom_bar(stat = "identity") + 
            scale_fill_manual(guide = FALSE,
                              name = 'change < 0', 
                              values = setNames(c('green', 'red'), c(T, F)))
    }
    
    myplot(data1)
    

    myplot(data2)
    

    myplot(data3)
    

    reprex package (v0.3.0) 于 2020-01-30 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      相关资源
      最近更新 更多