2014-12-06 5 views
3

Я хочу создать ggplot, в котором статистический параметр изменяется в соответствии с эстетически отображаемым фактором. В частности, я хотел бы создать контурный график с использованием stat_density2d(), я бы хотел отобразить дискретный коэффициент в цвет, и я бы хотел указать разные значения разрыва для каждого уровня фактора.ggplot2: может ли неэстетичный параметр варьироваться в зависимости от фактора?

Вот минимальный рабочий пример:

d <- data.frame(x=c(rnorm(500), rnorm(500, 2)), y=rnorm(1000), z=c(rep("a", 500), rep("b", 500))) 

ggplot(d, aes(x, y, fill=z)) + 
     stat_density2d(breaks=.05, geom="polygon", alpha=.5) 

enter image description here

Это то, что я буду за исключением перерывов идентичны по факторам. Я ищу способ указать разные значения разрыва для каждого фактора. Один из способов сделать это было бы создать отдельный слой для каждого фактора:

ggplot() + 
     stat_density2d(data=d[d$z=="a",], aes(x, y), breaks=.05, geom="polygon", alpha=.5, fill="red") + 
     stat_density2d(data=d[d$z=="b",], aes(x, y), breaks=.1, geom="polygon", alpha=.5, fill="blue") 

enter image description here

Но это не работоспособна, потому что я потерял легенду, и это слишком громоздким для случаев с более чем два фактора уровни.

Я хотел бы объединить преимущества этих двух случаев. Я почти уверен, что видел способ сделать то, что я пытаюсь сделать, но теперь, похоже, не могу найти его, поскольку это актуально. У кого-нибудь есть мысли о возможном решении?

+1

Я ничего не видел, как способ сделать это внутри ggplot, но Я думаю, вы могли бы сделать это довольно легко либо путем (а) предварительной обработки ваших данных, либо (б) преобразования ваших данных. – Gregor

ответ

5

Remebered это от пары лет назад - поэтому принимать решение непосредственно из Kohske's answer

# Data 
set.seed(1)  
d <- data.frame(x=c(rnorm(500), rnorm(500, 2)), y=rnorm(1000), 
            z=c(rep("a", 500), rep("b", 500))) 

library(plyr) 
library(ggplot2) 

hls <- mapply(function(x, b) stat_density2d(data = x, breaks = b, 
        geom="polygon", alpha=.5), dlply(d, .(z)), c(0.05, 0.1)) 

ggplot(d, aes(x, y, fill=z)) + hls + scale_fill_manual(values=c("red", "blue")) 

enter image description here

# Compare 
ggplot() + 
    stat_density2d(data=d[d$z=="a",], aes(x, y), breaks=.05, geom="polygon", 
                 alpha=.5, fill="red") + 
    stat_density2d(data=d[d$z=="b",], aes(x, y), breaks=.1, geom="polygon", 
                alpha=.5, fill="blue") 
+0

Красивая! Большое спасибо. – mmk

+1

Добро пожаловать, но все они отвечают за ответ Kohske – user20650

+1

Это еще одна вещь, которую вы узнаете сегодня. Я тоже проверю сообщение Кохске. Спасибо, что разделили эту идею. – jazzurro

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