これを行う方法が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
注一般的に、これは任意のカテゴリのx軸ラベルの素敵な取り扱いを壊しなること
今、私たちは2つの最終修正を行います。したがって、連続したx軸を使用してプロットを行う必要がある場合が多く、カテゴリラベルが必要な場合は手動で追加します。
ここでこれを行いますか?彼らが新しいと思うものを見つけてください...その質問をして、それに答えてください...それらの甘い甘いインターネットポイントのすべて? – cory
@cory Um ... [はい](http://meta.stackexchange.com/a/2729/164376)、そうです。しかし、失礼で、コメントで納得していることは、一般的に嫌にされています。 (でも、やっぱりやってます) – joran
クール、私は失礼ではありません。私はちょうど知らなかった。あなたの甘い甘いインターネットポイントを尊重します。本当です。私はあなたをアップアップしました。 – cory