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
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.
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
@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
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