Можно ли использовать stat_function по группе? - PullRequest
1 голос
/ 12 июня 2019

Следуя ответу на мой предыдущий вопрос , допустим, что я строю кривые плотности по группам с ggplot, и я хочу получить соответствующую нормальную кривую для каждой группы (с соответствующими средствами и Стандартное отклонение). Сначала я попробовал

library(ggplot2)
mtcars$vs <- as.factor(mtcars$vs)
ggplot(mtcars,aes(x=mpg, fill = vs, colour = vs)) + geom_density(alpha = 0.1) + 
    stat_function(fun = dnorm, args = list(mean = mean(mtcars$mpg), sd = sd(mtcars$mpg)))

но он выдает уникальную нормальную кривую. Затем я обнаружил в этот вопрос (ответ которого я не вижу, как мне помочь), что stat_function понимает group эстетику, поэтому я попытался

ggplot(mtcars,aes(x=mpg, fill = vs, colour = vs)) + geom_density(alpha = 0.1) + 
    stat_function(aes(group = vs), fun = dnorm, args = list(mean = mean(mtcars$mpg), sd = sd(mtcars$mpg)))

но сюжет не меняется. Так как же я могу сказать stat_function, что я хочу, чтобы аргументы принимались для каждой vs -группы? Я также ожидаю, что цвет каждой из этих нормальных кривых будет таким же, как (или связан с) цвет кривой mpg той же группы.

Я тоже пробовал с

library(dplyr)
ggplot(mtcars %>% group_by(vs),...

но это не имело никакого эффекта.

Спасибо!

1 Ответ

1 голос
/ 12 июня 2019

Использование циклов:

Пример 1: две переменные

mtcars$vs <- as.factor(mtcars$vs)
p <- unique(mtcars$vs)
g <- ggplot(mtcars, aes(x = mpg, fill = vs, colour = vs))
for (i in seq_along(p))  {
  df <- mtcars %>% filter(vs == p[i])
  g <- g + geom_density(alpha = .05) +
    stat_function(data = df,
                  fun = dnorm,
                  args = list(mean = mean(df$mpg), sd = sd(df$mpg)))
}
g

enter image description here

Пример 2: более двух переменных

mtcars$cyl <- as.factor(mtcars$cyl)
p <- unique(mtcars$cyl)
g <- ggplot(mtcars, aes(x = mpg, fill = cyl, colour = cyl))
for (i in seq_along(p))  {
  df <- mtcars %>% filter(cyl == p[i])
  g <- g + geom_density(alpha = .05) +
    stat_function(data = df,
                  fun = dnorm,
                  args = list(mean = mean(df$mpg), sd = sd(df$mpg)))
}
g

enter image description here

Лоскутное решение : добавление двух слоев

library(ggplot2)

mtcars$vs <- as.factor(mtcars$vs)
mt1 <- filter(mtcars, vs == 1)
mt0 <- filter(mtcars, vs == 0)

ggplot(mtcars, aes(x = mpg, fill = vs, colour = vs)) + geom_density(alpha = 0.1) +
  stat_function(data = mt0, fun =  dnorm,
    args = list(mean = mean(mt0$mpg), sd = sd(mt0$mpg))) +
  stat_function(data = mt1, fun = dnorm,
                args = list(mean = mean(mt1$mpg), sd = sd(mt1$mpg)))

Выход: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...