2012-09-12 1 views
11

Chciałbym wiedzieć, co dokładnie robi geom_density(), więc uzasadniam wykres i czy jest jakikolwiek sposób wyodrębnienia funkcji lub punktów, które generują dla każdej z wykreślanych krzywych.R - Jakiego algorytmu używa geom_density() i jak wyodrębnić punkty/równania krzywych?

Dzięki

+0

znalazłem że stat_density() pozwala na ustawienie parametrów. Prawdopodobnie to odpowiada pierwszej części. Nadal chcesz wiedzieć, czy równanie lub punkty można wyodrębnić. – unixsnob

Odpowiedz

18

Wpisanie get("compute_group", ggplot2::StatDensity) (lub dawniej get("calculate", ggplot2:::StatDensity)) będzie Ci algorytm stosowany do obliczania gęstości. (Przy korzeniu, to wezwanie do density() z kernel="gaussian" domyślne.)

Punkty użyte w działki są niewidocznie zwrócony przez print.ggplot(), dzięki czemu można uzyskać do nich tak:

library(ggplot2) 
m <- ggplot(movies, aes(x = rating)) 
m <- m + geom_density() 
p <- print(m) 
head(p$data[[1]], 3) 
#   y  x density scaled count PANEL group ymin  ymax 
# 1 0.0073761 1.0000 0.0073761 0.025917 433.63  1  1 0 0.0073761 
# 2 0.0076527 1.0176 0.0076527 0.026888 449.88  1  1 0 0.0076527 
# 3 0.0078726 1.0352 0.0078726 0.027661 462.81  1  1 0 0.0078726 


## Just to show that those are the points you are after, 
## extract and use them to create a lattice xyplot 
library(gridExtra) 
library(lattice) 
mm <- xyplot(y ~x, data=p$data[[1]], type="l") 

enter image description here

3

Jak zasugerowano w innych odpowiedziach, można uzyskać dostęp do punktów ggplot za pomocą print.ggplot(). Jednakże, kod print() również wypisuje obiekt ggplot, co może nie być pożądane.

wyodrębnić można uzyskać dane obiektu ggplot, bez drukowania działkę korzystając ggplot_build():

library(ggplot2) 
library(ggplot2movies) 

m <- ggplot(movies, aes(x = rating)) 
m <- m + geom_density() 
p <- ggplot_build(m) # <---- INSTEAD OF `p <- print(m)` 
head(p$data[[1]], 3) 
#    y  x  density  scaled count  n PANEL group ymin 
# 1 0.007376115 1.000000 0.007376115 0.02591684 433.6271 58788  1 -1 0 
# 2 0.007652653 1.017613 0.007652653 0.02688849 449.8842 58788  1 -1 0 
# 3 0.007872571 1.035225 0.007872571 0.02766120 462.8127 58788  1 -1 0 


# Just to show that those are the points you are after, extract and use them 
# to create a lattice xyplot 
library(lattice) 
m2 <- xyplot(y ~x, data=p$data[[1]], type="l") 

library(gridExtra) 
grid.arrange(m, m2, nrow=1) 

enter image description here

+1

Dzięki, Megatron, właśnie tego szukałem! – Luis