条形图中正负条的条形颜色不同

r-n*_*bie 0 r ggplot2

我想要一个条形图,如果数字为正,则将条形颜色为红色,如果数字为负,则将条形颜色为绿色。我希望它采用 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"))
Run Code Online (Sandbox Code Playgroud)

版本 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"))
Run Code Online (Sandbox Code Playgroud)

版本 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"))
Run Code Online (Sandbox Code Playgroud)

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

dc3*_*c37 5

一种可能的方法是根据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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述