假设我想创建一个带有颜色aes的直方图,并且我有几个函数适用于我用于颜色aes的列的每个因子级别。
很抱歉复杂的描述,这是一个例子:
library(ggplot2)
set.seed(1234)
wdata = data.frame(
sex = factor(rep(c("F", "M"), each=200)),
weight = c(rnorm(200, 55), rnorm(200, 58)))
head(wdata)
fun_f <- function(x){dnorm(x, mean = 55)}
fun_m <- function(x){dnorm(x, mean = 58)}
p <- ggplot(wdata, aes(x = weight, color=sex, fill = sex)) +
geom_histogram(aes(color = sex),position = "dodge", bins = 30)+
stat_function(fun=function(x){
fun_m(x)*60
},
geom="line",
color ="blue",
size = 1)+
stat_function(fun=function(x){
fun_f(x)*60
},
color ="red",
geom="line",
size = 1)
p
我现在的目标是使用wdata[sex=="f"]
的颜色替换fun_f
而不是color="red"
。类似于fun_m
。
那可能吗?
stat_function
像任何其他aes
图层一样采用ggplot
映射,因此它实际上将继承您最初设置的color = sex, fill = sex
。
但是,要让stat_function
识别数据中sex
的不同值,您可以在data
参数中进行过滤。如果你考虑一下,你的函数与实际数据无关,所以除非你手动触发,否则不会发生任何事情要求为"M"
和"F"
绘制一条曲线。然后在颜色和填充比例中设置所需的颜色。
library(ggplot2)
library(dplyr)
ggplot(wdata, aes(x = weight, color = sex, fill = sex)) +
geom_histogram(position = "dodge") +
stat_function(fun = function(x) fun_m(x) * 60, data = . %>% filter(sex == "M")) +
stat_function(fun = function(x) fun_f(x) * 60, data = . %>% filter(sex == "F")) +
scale_color_manual(values = c("F" = "red", "M" = "blue")) +
scale_fill_manual(values = c("F" = "red", "M" = "blue"))
由reprex package创建于2019-02-25(v0.2.1)