Scale_fill_manual 未生成条件指定的颜色填充
Scale_fill_manual not producing color fill specified by a condition
1:没有问题
假设我下载 storm_econ_dmg.csv
:
fileUrl <- "https://raw.githubusercontent.com/MichaelSodeke/DataSets/main/storm_health_dmg.csv"
download.file(fileUrl, destfile="storm_health_dmg.csv", method = "curl", mode="wb")
df1 <- read_csv("storm_health_dmg.csv")
接下来,我用 geom_bar
绘制此数据(记下 fill=(max.fatal == 583)
):
p1 <- ggplot(df1, aes(x=reorder(state, max.fatal), y=max.fatal, fill=(max.fatal == 583) ))
p1 <- p1 + geom_bar(stat="identity")
p1 <- p1 + scale_fill_manual(values=c("TRUE"="seagreen3", "FALSE"="grey80"))
p1 <- p1 + coord_flip() + theme(legend.position="none")
srch <- df1$max.fatal > 50
p1 <- p1 + geom_text(data=df1[srch,], aes(label=evtype), angle=0, hjust=1.1, vjust=0.3, nudge_y=-0.1, size=2.5, fontface="bold")
p1 <- p1 + geom_text(data=df1[srch,], aes(label=max.fatal), angle=0, hjust=-1.3, vjust=0.3, nudge_y=0.1, size=2.5, fontface="bold")
p1 <- p1 + theme(panel.background = element_rect(fill = "white"),
axis.line.x.bottom=element_line(colour="black"),
axis.line.y.left=element_line(colour = "black"))
p1 %>% print()
下图中 scale_fill_manual
使用 TRUE/FALSE 值:
2:问题
现在假设我下载 tornado_dmg.csv
:
fileUrl <- "https://raw.githubusercontent.com/MichaelSodeke/DataSets/main/tornado_dmg.csv"
download.file(fileUrl, destfile="tornado_dmg.csv", method = "curl", mode="wb")
df2 <- read_csv("tornado_dmg.csv")
然后我用 geom_jitter
绘制这些数据(记下 fill=(f == 5)
):
p2 <- ggplot(df2, aes(x=bgn.date, y=path.area, fill=(f == 5) ))
p2 <- p2 + geom_jitter(stat="identity", size=1)
p2 <- p2 + scale_fill_manual(values=c("TRUE"="red", "FALSE"="grey80"))
p2 %>% print()
但是,请注意 scale_fill_manual
在这种情况下对 TRUE/FALSE 值不起作用:
请解释为什么 scale_fill_manual
在 第 1 部分 中有效,但在 第 2 部分 中无效?
非常感谢!
尝试将 fill
更改为 color
。条可以被填充,而抖动中的点可以被着色:
library(ggplot2)
#Data
fileUrl <- "https://raw.githubusercontent.com/MichaelSodeke/DataSets/main/tornado_dmg.csv"
df2 <- read.csv(fileUrl)
#Code
ggplot(df2, aes(x=bgn.date, y=path.area, color=(f == 5) ))+
geom_jitter(stat="identity", size=1)+
scale_color_manual(values=c("TRUE"="red", "FALSE"="grey80"))
输出:
我喜欢这个问题。这是您花费大量时间试图解决的问题之一,结果发现答案就在您面前。
问题是您将 fill
用于 geom_point
。如果要更改点的颜色,则必须使用 color
或 colour
(以及匹配的 scale_*_manual
)。因此,您的代码将是:
p2 <- ggplot(df2, aes(x=bgn.date, y=path.area, colour=(f == 5) ))
p2 <- p2 + geom_jitter(stat="identity", size=1)
p2 <- p2 + scale_colour_manual(values=c("TRUE"="red", "FALSE"="grey80"))
p2 %>% print()
或者,我这样做的方式,我认为它不那么笨重:
ggplot(df2, aes(x=bgn.date, y=path.area, colour=(f == 5) ))+
geom_point()+
scale_fill_manual(values=c("seagreen3", "grey80"))+
theme_classic()
我使用了 geom_point
,但我不知道那会是什么样子,因为整个图表没有及时加载。可能看起来不太好。
1:没有问题
假设我下载 storm_econ_dmg.csv
:
fileUrl <- "https://raw.githubusercontent.com/MichaelSodeke/DataSets/main/storm_health_dmg.csv"
download.file(fileUrl, destfile="storm_health_dmg.csv", method = "curl", mode="wb")
df1 <- read_csv("storm_health_dmg.csv")
接下来,我用 geom_bar
绘制此数据(记下 fill=(max.fatal == 583)
):
p1 <- ggplot(df1, aes(x=reorder(state, max.fatal), y=max.fatal, fill=(max.fatal == 583) ))
p1 <- p1 + geom_bar(stat="identity")
p1 <- p1 + scale_fill_manual(values=c("TRUE"="seagreen3", "FALSE"="grey80"))
p1 <- p1 + coord_flip() + theme(legend.position="none")
srch <- df1$max.fatal > 50
p1 <- p1 + geom_text(data=df1[srch,], aes(label=evtype), angle=0, hjust=1.1, vjust=0.3, nudge_y=-0.1, size=2.5, fontface="bold")
p1 <- p1 + geom_text(data=df1[srch,], aes(label=max.fatal), angle=0, hjust=-1.3, vjust=0.3, nudge_y=0.1, size=2.5, fontface="bold")
p1 <- p1 + theme(panel.background = element_rect(fill = "white"),
axis.line.x.bottom=element_line(colour="black"),
axis.line.y.left=element_line(colour = "black"))
p1 %>% print()
下图中 scale_fill_manual
使用 TRUE/FALSE 值:
2:问题
现在假设我下载 tornado_dmg.csv
:
fileUrl <- "https://raw.githubusercontent.com/MichaelSodeke/DataSets/main/tornado_dmg.csv"
download.file(fileUrl, destfile="tornado_dmg.csv", method = "curl", mode="wb")
df2 <- read_csv("tornado_dmg.csv")
然后我用 geom_jitter
绘制这些数据(记下 fill=(f == 5)
):
p2 <- ggplot(df2, aes(x=bgn.date, y=path.area, fill=(f == 5) ))
p2 <- p2 + geom_jitter(stat="identity", size=1)
p2 <- p2 + scale_fill_manual(values=c("TRUE"="red", "FALSE"="grey80"))
p2 %>% print()
但是,请注意 scale_fill_manual
在这种情况下对 TRUE/FALSE 值不起作用:
请解释为什么 scale_fill_manual
在 第 1 部分 中有效,但在 第 2 部分 中无效?
非常感谢!
尝试将 fill
更改为 color
。条可以被填充,而抖动中的点可以被着色:
library(ggplot2)
#Data
fileUrl <- "https://raw.githubusercontent.com/MichaelSodeke/DataSets/main/tornado_dmg.csv"
df2 <- read.csv(fileUrl)
#Code
ggplot(df2, aes(x=bgn.date, y=path.area, color=(f == 5) ))+
geom_jitter(stat="identity", size=1)+
scale_color_manual(values=c("TRUE"="red", "FALSE"="grey80"))
输出:
我喜欢这个问题。这是您花费大量时间试图解决的问题之一,结果发现答案就在您面前。
问题是您将 fill
用于 geom_point
。如果要更改点的颜色,则必须使用 color
或 colour
(以及匹配的 scale_*_manual
)。因此,您的代码将是:
p2 <- ggplot(df2, aes(x=bgn.date, y=path.area, colour=(f == 5) ))
p2 <- p2 + geom_jitter(stat="identity", size=1)
p2 <- p2 + scale_colour_manual(values=c("TRUE"="red", "FALSE"="grey80"))
p2 %>% print()
或者,我这样做的方式,我认为它不那么笨重:
ggplot(df2, aes(x=bgn.date, y=path.area, colour=(f == 5) ))+
geom_point()+
scale_fill_manual(values=c("seagreen3", "grey80"))+
theme_classic()
我使用了 geom_point
,但我不知道那会是什么样子,因为整个图表没有及时加载。可能看起来不太好。