2016-04-21 5 views
6

Почему следующие графики выглядят иначе? Оба метода, по-видимому, используют гауссовы ядра.Как плотность ggplot2 отличается от функции плотности?

Как ggplot2 вычислить плотность?

library(fueleconomy) 

d <- density(vehicles$cty, n=2000) 
ggplot(NULL, aes(x=d$x, y=d$y)) + geom_line() + scale_x_log10() 

enter image description here

ggplot(vehicles, aes(x=cty)) + geom_density() + scale_x_log10() 

enter image description here


UPDATE:

Решение этого вопроса уже появляется на SO here, однако конкретные PARAMET ers ggplot2 переходит в функцию плотности R-данных, остается неясной.

Альтернативным решением является, чтобы извлечь данные плотности непосредственно из ggplot2 участка, как показано here

+0

Спасибо за ссылки. Однако решение, похоже, не идентифицирует явные различия параметров. Мне интересно, как я могу генерировать/извлекать точные данные плотности из плотности ggplot. – Megatron

+1

Это, как представляется, извлекает точные значения графиков geom_density: http://stackoverflow.com/questions/12394321/r-what-algorithm-does-geom-density-use-and-how-to-extract-points-equation-of – fanli

+0

Я не думаю, что это связано с плотностью, но как вы применяете протокол tranform – user20650

ответ

3

В этом случае, это не вычисление плотности, который отличается, но, как применяется log10 преобразования.

Первые проверки плотности подобны без преобразования

library(ggplot2) 
library(fueleconomy) 

d <- density(vehicles$cty, from=min(vehicles$cty), to=max(vehicles$cty)) 
ggplot(data.frame(x=d$x, y=d$y), aes(x=x, y=y)) + geom_line() 
ggplot(vehicles, aes(x=cty)) + stat_density(geom="line") 

Так что вопрос, как представляется, преобразование. В приведенном ниже stat_density представляется как , если преобразование log10 применяется к переменной x перед вычислением плотности. Итак, чтобы воспроизвести результаты вручную, вы должны преобразовать переменную до , вычисляя плотность. Например

d2 <- density(log10(vehicles$cty), from=min(log10(vehicles$cty)), 
               to=max(log10(vehicles$cty))) 
ggplot(data.frame(x=d2$x, y=d2$y), aes(x=x, y=y)) + geom_line() 
ggplot(vehicles, aes(x=cty)) + stat_density(geom="line") + scale_x_log10() 

PS: Для того, чтобы увидеть, как ggplot подготавливает данные для плотности, вы можете посмотреть на код as.list(StatDensity) приводит к StatDensity$compute_group к ggplot2:::compute_density

Смежные вопросы