如何在箱线图中以平均面积分数绘制条形图与水平到箱形图的平行图?

时间:2012-12-18 06:26:27

标签: r plot boxplot stackedbarseries

我正在进行数据展示,我需要并行绘制带有堆积条形图的boxplot。

enter image description here

用不同颜色的颜色和覆盖面积的点的比例。我怎么画它?

2 个答案:

答案 0 :(得分:4)

这是一个通用解决方案,可用于将并行百分比框添加到晶格弓形图。它计算箱形图(晶须和主要部分)的精确百分比描述部分。

解决方案基于网格包。使用晶格比使用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])

enter image description here

答案 1 :(得分:3)

一种可能性是结合boxplot()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%")

enter image description here