私はデータのプレゼンテーションに取り組んでおり、積み上げられた棒グラフで箱ひげ図を並行してプロットする必要があります。
領域をカバーするポイントの割合で異なる色合いの色で着色されています。どうすればプロットできますか?
私はデータのプレゼンテーションに取り組んでおり、積み上げられた棒グラフで箱ひげ図を並行してプロットする必要があります。
領域をカバーするポイントの割合で異なる色合いの色で着色されています。どうすればプロットできますか?
ここでは、並列パーセント ボックスをラティス ボウプロットに追加するために使用できる一般的なソリューションを示します。boxplot の正確なパーセント記述部分 (ひげと主要部分) を計算します。
ソリューションは grid パッケージに基づいています。ビューポートの操作は、ggplot2 よりもラティスの方が簡単です。そのため、bwplot を選択します。
私はいくつかのサンプルデータを生成します:
df <- data.frame(cond = factor( rep(c("A"), each=200) ),
rating = c(rnorm(200),rnorm(200, mean=.8)))
library(lattice)
bwplot(cond ~ rating, data=df,gp=gpar(fill='blue'),
par.settings = list( box.umbrella=list(col= c( "red")),
box.dot=list(col= c("green")),
box.rectangle = list(fill= c( "blue"),alpha=0.6)))
メインビューポートをキャッチ
downViewport("plot_01.panel.1.1.vp")
次に、ひげの寸法と四肢のボックスプロットの位置を保存します。
segs <- grid.get('segments',grep=T)
cap.segs <- grid.get('cap.segments',grep=T)
関数 drawBox は、パーセントでテキストを含む四角形を描画します。ボックスごとに3回呼び出します。
drawbox <- function(x0 = segs$x0[1] , col ='red',
width.vp = segs$x0[2] - segs$x0[1]){
vpd <- viewport(
x = x0 ,
y = cap.segs$y1[2] + unit(0.5,'native'),
width = width.vp,
height = unit(2,'cm'),
just = c('left','bottom'),
name = 'vpd')
pushViewport(vpd)
grid.rect(gp=(gpar(fill=col)))
# The compute of percent is a little bit tricky due we can't apply '/'
value <- as.numeric(convertUnit(width.vp,'native'))
value <- value/as.numeric(convertUnit(cap.segs$x0[2]- cap.segs$x0[1],'native'))
grid.text(label = paste(round(value*100),'%',sep='') , gp= gpar(cex=3))
upViewport(1)
}
関数 drawbox は 3 回呼び出されます。
drawbox()
drawbox(col='yellow',width=segs$x0[1] - cap.segs$x0[1], x0= cap.segs$x0[1])
drawbox(col='green',width.vp= cap.segs$x0[2]- segs$x0[2],x0 = segs$x0[2])
boxplot()
1 つの可能性は、関数と関数を組み合わせることrect()
です。の座標rect()
は、関心のある分位数として計算されます。この例では、25% と 60% の分位数 (25% と 35% の合計) を使用しました。text()
名前を設定する関数。
set.seed(123)
x<-rnorm(100)
boxplot(x,horizontal=TRUE,axes=FALSE)
rect(min(x),1.5,quantile(x,0.25),1.4,col="red")
rect(quantile(x,0.25),1.5,quantile(x,0.60),1.4,col="green")
rect(quantile(x,0.60),1.4,max(x),1.5,col="yellow")
text(-1.5,1.45,"25%")
text(0,1.45,"35%")
text(1.1,1.45,"40%")