2016-03-24 10 views
4

Моя цель состоит в том, чтобы использовать геометрию geom_density2d() для рисования уровней контуров на участке разброса в определенных точках. Рассмотрим следующий код:geom_statdensity2d с конкретными контурами?

library(ggplot2) 
n = 100 
df = data.frame(x = c(rnorm(n, 0, .5), rnorm(n, 3, .5)), 
       y = c(rnorm(n, 1, .5), rnorm(n, 0, .5))) 

ggplot(df, aes(x = x, y = y)) + 
    geom_density2d() + 
    geom_point() 

enter image description here

Это производит стандартный контур участка, но там не кажется, способ ручного управления, который очерчивает втянуться. Необязательные биты параметров и h внутри могут в некоторой степени контролировать контурные линии (передается в kde2d из MASS, который я предполагаю), но результирующие строки не кажутся интерпретируемыми.

В идеале я смог бы воспроизвести функциональность plot.kde из библиотеки ks, где они могут управляться с помощью этого аргумента cont.

library(ks) 
est = kde(df) 
plot(est, cont = c(50, 95)) 

enter image description here

+0

Возможно, это полезно: http://stackoverflow.com/questions/23437000/how-to-plot-a-contour-line-showing-where-95-of-values- осень-внутри-в-р-и-в – Jimbou

ответ

0

Это моя наивная попытка, так как я почти не пишу пользовательские функции. Таким образом, следующее не может быть хорошим подходом. По крайней мере, код выполняет эту работу. Мой трюк заключается в использовании набора данных, созданного ggplot. Во-первых, вы рисуете графику и получаете данные, используемые для графики, которые вы можете найти от ggplot_build(g)$data[1]. В этом столбце можно найти столбец level. Используя столбец, вы можете подмножать данные для каждой контурной линии. В myfun() вам нужно указать, какие уровни вы хотите. Функция подмножает данные с указанными уровнями и рисует фигуру.

setseed(111) 
mydf = data.frame(x = c(rnorm(100, 0, .5), rnorm(100, 3, .5)), 
        y = c(rnorm(100, 1, .5), rnorm(100, 0, .5))) 

g <- ggplot(mydf, aes(x = x, y = y)) + 
      geom_density2d() + 
      geom_point() 

### Get a list containing data used for drawing g. 

temp <- as.data.frame(ggplot_build(g)$data[1]) 

### Check which levels you have in g 

ind <- unique(temp$level) 

ind 
#[1] 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.20 


myfun <- function(...){ 
       ana <- c(...) 
       foo <- subset(temp, level %in% ana) 

       g <- ggplot() + 
       geom_path(data = foo, aes(x = x, y = y, group = group), colour = "red") 

       print(g) 

       } 

### Run myfun by specify levels you want. 
myfun(0.02, 0.10, 0.18) 

enter image description here

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