将ggplot aes中的颜色指定给stat_function的颜色参数

问题描述 投票:0回答:1

假设我想创建一个带有颜色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

那可能吗?

r ggplot2
1个回答
1
投票

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)

© www.soinside.com 2019 - 2024. All rights reserved.