2016-03-24 23 views
4

geom_violinプロットをに入力するにはどうすればいいですか?ggplot2固定カットオフに基づいて色分けしますか?例えばgeom_violinプロットで特定の領域を塗りつぶす

、セットアップ与えられた:

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

と単純異なっゼロの上方および下方色の各バイオリンを持っている:私はこの基本的なプロットを取るしたいと思います

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')) 

を。ナイーブfill美学をマッピングし、しようとするもので、分割やバイオリンプロットをかわし:

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

私が欲しいものではありません。それぞれxの値で1つのヴァイオリンプロットが欲しいですが、内部はゼロより上下の異なる色で塗りつぶされています。

+1

ここでこれを行いますか?彼らが新しいと思うものを見つけてください...その質問をして、それに答えてください...それらの甘い甘いインターネットポイントのすべて? – cory

+1

@cory Um ... [はい](http://meta.stackexchange.com/a/2729/164376)、そうです。しかし、失礼で、コメントで納得していることは、一般的に嫌にされています。 (でも、やっぱりやってます) – joran

+1

クール、私は失礼ではありません。私はちょうど知らなかった。あなたの甘い甘いインターネットポイントを尊重します。本当です。私はあなたをアップアップしました。 – cory

答えて

6

これを行う方法が1つあります。

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

次我々はgeom_violinためsource codeを見てみるならば、我々はそれことを参照してください。

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))) 

まず、バイオリンプロットをプロットに入るすべての計算の変数をキャプチャするためにggplot::ggplot_buildを使用しますこの計算されたデータフレームのいくつかの特定の変換を行ってからgeom_polygonに渡して、バイオリン領域の実際の輪郭を描画します。

だから我々はそのプロセスを模倣するだろうと単純に手動で塗りつぶされた多角形を描く:

#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)) 

私は多角形であることを保証するために、最初の行を複製については、ソースコードから小さなディテールを省略しています閉まっている。

#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))) 

そして最後にプロット:

#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

注一般的に、これは任意のカテゴリのx軸ラベルの素敵な取り扱いを壊しなること

今、私たちは2つの最終修正を行います。したがって、連続したx軸を使用してプロットを行う必要がある場合が多く、カテゴリラベルが必要な場合は手動で追加します。

関連する問題