我想要一个条形图,如果数字为正,则将条形颜色为红色,如果数字为负,则将条形颜色为绿色。我希望它采用 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 作为输入,如何指定条形颜色以使其按我想要的方式工作?
一种可能的方法是根据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)
归档时间: |
|
查看次数: |
2039 次 |
最近记录: |