2016-03-24 16 views
4

ggplot2geom_violin plot'unu sabit bir eşiğe göre farklı renklerle nasıl doldurabilirim? Ben bu temel arsa almak istiyorumgeom_violin arsadaki belirli bölgeleri doldurun

library(ggplot2) 

set.seed(123) 
dat <- data.frame(x = rep(1:3,each = 100), 
        y = c(rnorm(100,-1),rnorm(100,0),rnorm(100,1))) 
dat$f <- with(dat,ifelse(y >= 0,'Above','Below')) 

:

ggplot() + 
    geom_violin(data = dat,aes(x = factor(x),y = y)) 

ve sadece her keman üstünde ve sıfırın altında farklı renkteki gelmiş kurulum verilen Örneğin

. naif şey fill estetik, bölünmeler haritalama, denemek ve keman araziler soluklaştırır için:

ggplot() + 
    geom_violin(data = dat,aes(x = factor(x),y = y, fill = f)) 

ne istiyorum olmadığı. Her bir x değerinde tek bir keman çizimi istiyorum, ancak iç kısımda sıfırın üstünde ve altında farklı renkler var.

+1

Bunu insanlar mı yapıyor? Yeni olduğunu düşündükleri bir şey bul ... bunun için bir soru sor ve cevap ver ... tüm bu tatlı tatlı internet noktaları için? – cory

+1

@cory Um ... [evet] (http://meta.stackexchange.com/a/2729/164376), evet öyle. Ancak, kaba ve yorumlarda küçümseyen olmak, genellikle, sadece bildiğiniz gibi, üzerinde kaşlarını çattı. (Yine de hepimiz yapıyoruz.) – joran

+1

Cool, kaba olma niyetinde değildim. Ben sadece bilmiyordum. Tatlı tatlı internet noktalarına saygı duyuyorum. Gerçekten yaptım. Seni reddettim, sen daha da fazlasını al. – cory

cevap

6

Bunu yapmanın bir yolu.

p <- ggplot() + 
    geom_violin(data = dat,aes(x = factor(x),y = y)) 
p_build <- ggplot2::ggplot_build(p)$data[[1]] 

Sonra geom_violin için source code bakmak eğer, bunu görüyoruz:

library(ggplot2) 
library(plyr) 

#Data setup 
set.seed(123) 
dat <- data.frame(x = rep(1:3,each = 100), 
        y = c(rnorm(100,-1),rnorm(100,0),rnorm(100,1))) 

Önce keman arsa komplo götüren tüm hesaplanan değişkenler yakalamak için ggplot::ggplot_build kullanacağız Bu hesaplanan veri çerçevesinin bazı spesifik dönüşümleri, keman bölgelerinin gerçek anahatlarını çizmek için geom_polygon'a göndermeden önce yapar.

yüzden bu süreci taklit edeceğiz ve sadece elle doldurulmuş çokgenler çizmek:

#This comes directly from the source of geom_violin 
p_build <- transform(p_build, 
        xminv = x - violinwidth * (x - xmin), 
        xmaxv = x + violinwidth * (xmax - x)) 

p_build <- rbind(plyr::arrange(transform(p_build, x = xminv), y), 
       plyr::arrange(transform(p_build, x = xmaxv), -y)) 

Ben poligon olmasını sağlamak amacıyla ilk satırı çoğaltma konusunda kaynak kodundan küçük bir ayrıntıyı ihmal ediyorum kapalı.

#Add our fill variable 
p_build$fill_group <- ifelse(p_build$y >= 0,'Above','Below') 
#This is necessary to ensure that instead of trying to draw 
# 3 polygons, we're telling ggplot to draw six polygons 
p_build$group1 <- with(p_build,interaction(factor(group),factor(fill_group))) 

Ve nihayet arsa:

#Note the use of the group aesthetic here with our computed version, 
# group1 
p_fill <- ggplot() + 
    geom_polygon(data = p_build, 
       aes(x = x,y = y,group = group1,fill = fill_group)) 
p_fill 

enter image description here

Not genel olarak, bu herhangi bir kategorik x ekseni etiket güzel işlenmesini clobber edeceğini

Şimdi iki son değişiklikler yapmak . Bu yüzden, sürekli bir x eksenini kullanarak arsa yapmayı ve sonra da kategorik etiketlere ihtiyacınız varsa bunları manuel olarak eklemeniz gerekir.