Пропускная способность графика плотности ядра в ggplot2 с `facet_wrap` - PullRequest
0 голосов
/ 27 апреля 2011

Я хотел бы использовать stat_density() и facet_wrap() в пакете ggplot2 для создания графиков плотности ядра для различных группировок, но я хочу убедиться, что я использую одинаковую полосу пропускания для каждого графика.Могу ли я быть уверен, что stat_density() использует одинаковую полосу пропускания для каждого графика?

Например, используя diamonds:

library(ggplot2)    
ggplot(diamonds, aes(x = carat)) + 
  stat_density() + 
  facet_wrap(~ cut) + 
  scale_x_log()

В документации показано, что я могу использовать adjust чтобы настроить автоматическую полосу пропускания, но это просто применяет несколько и возвращает меня к первоначальному вопросу.stat_density() также имеет опцию ..., но я не смог пройти через опцию density() bw, например:

ggplot(diamonds, aes(x = carat)) + 
  stat_density(bw = 1) + 
  facet_wrap(~ cut) + 
  scale_x_log()

Итак, если stat_density() isn 't использовать одну и ту же полосу пропускания для всех аспектов, есть ли способ, которым я могу это форсировать?Я пробовал решение ddply() с transform() и density(), но это не удалось, потому что density() не обязательно возвращает то же количество значений x и y, что и для ввода.Есть идеи?Спасибо!

Редактировать Похоже, ggplot2 назначает оптимальную полосу пропускания для каждого аспекта (похоже, @Ramnath и Dianardo, Fortin и Lemieux Econometrica 1996 согласныс этим), а не постоянная пропускная способность, которую я искал.Но, если мне нужна постоянная пропускная способность для всех аспектов, моя попытка ниже не удастся.

my.density <- function(x) {
    temp <- density(x$carat, bw = 0.5)
    return(data.frame(carat = temp$x, density = temp$y))
}
temp <- ddply(diamonds, .(cut), my.density)
ggplot(temp, aes(x = carat, y = density)) + 
             geom_point() + 
             facet_wrap(~ cut) + 
             scale_x_log()
Warning messages:
1: In match.fun(get(".transform", .))(values) : NaNs produced
2: In match.fun(get(".transform", .))(values) : NaNs produced
3: In match.fun(get(".transform", .))(values) : NaNs produced
4: In match.fun(get(".transform", .))(values) : NaNs produced
5: In match.fun(get(".transform", .))(values) : NaNs produced
6: Removed 84 rows containing missing values (geom_point). 
7: Removed 113 rows containing missing values (geom_point). 
8: Removed 98 rows containing missing values (geom_point). 
9: Removed 98 rows containing missing values (geom_point). 
10: Removed 106 rows containing missing values (geom_point). 

1 Ответ

2 голосов
/ 28 апреля 2011

Предупреждения из-за отрицательных значений для carat в my.density. Небольшая модификация вашего кода поможет:

  ggplot(temp, aes(x = carat, y = density)) + 
    geom_line(subset = .(carat > 0)) +
   facet_wrap(~ cut) + scale_x_log() 

Надеюсь, это полезно

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