在格子条形图功能中获取分组条的中点值

Max*_*x C 7 r lattice

我试图弄清楚如何确定分组条的中点值,即每个条的中心的实际X位置.这是很容易在基础R完成barplot功能,但是我希望能够做到这一点的格子barchart.我的目标是在相应的栏顶部显示文本列的值.

只要我不使用子组,下面的代码允许我将文本放在条形图的顶部.我试过在互联网上搜索解决方案,但似乎没有任何效果.从图中可以看出,中点仅针对整个组的中心确定.

谢谢!

library(lattice)

test= data.frame(
  group=c("WK 1", "WK 1", "WK 1",  "WK 2", "WK 2", "WK 2", "WK 3", "WK 3", "WK 3"),
  subgroup=c(1,2,3,1,2,3,1,2,3)  ,
  percent=c(60,50,80,55,56,65,77,65,86),
  text=c("n=33", "n=37","n=39","n=25","n=27","n=22","n=13","n=16","n=11")
  )

barchart(data=test, 
         percent~group,
         groups=subgroup,

            panel = function(x,y,...){
              panel.barchart(x, y, ...)
              panel.text( x=unique(test$group), 
                          y=test$percent, 
                          label=unique(test$text) 
                          )

            }
         )
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Ben*_*nes 7

一种快速而肮脏的方式是改变panel.barchart绘制条形图的位置,包括在适当的位置绘制文本.

创建一个新的面板功能(一般来说这是一个好主意,因为原来的功能仍然存在,以防你需要像我一样多次重启)

myPanelBarchart <- panel.barchart
Run Code Online (Sandbox Code Playgroud)

更改面板功能的相应部分(请记住:如果您不再有组,如果您水平绘图,或者如果您堆叠,这将不再起作用).在这里,我添加了一个调用panel.textif if myPanelBarchart传递一个名为的参数printVals,但它不是FALSE.此参数将是您要在每个条形图上方打印的字符向量.它需要与绘制的条形数量以及与数据对应的顺序相同.我没有添加任何东西来检查这是否属实.

body(myPanelBarchart)[[10]][[4]][[2]][[4]][[4]][[9]]<-substitute(for (i in unique(x)) {
    ok <- x == i
    nok <- sum(ok, na.rm = TRUE)
    panel.rect(x = (i + width * (groups[ok] - (nvals + 1)/2)), 
        y = rep(origin, nok), col = col[groups[ok]], border = border[groups[ok]], 
        lty = lty[groups[ok]], lwd = lwd[groups[ok]], width = rep(width, 
            nok), height = y[ok] - origin, just = c("centre", 
            "bottom"), identifier = identifier)
# This is the added part (adjust parameters as you see fit):
    if(!identical(printVals, FALSE)){
      panel.text(x = (i + width * (groups[ok] - (nvals + 1)/2)), y = y[ok],
        label = printVals[ok], adj = c(0.5, -1), identifier = identifier)
    }        

})
Run Code Online (Sandbox Code Playgroud)

更改新函数的形式参数列表以添加参数printVals并为其指定默认值.

formals(myPanelBarchart) <- c(formals(panel.barchart), printVals = FALSE)
Run Code Online (Sandbox Code Playgroud)

使用新参数使用新面板函数绘制数据

barchart(data=test, 
         percent~group,
         groups=subgroup,

            panel = function(x,y,...){
              myPanelBarchart(x, y, ..., printVals = test$text, )
            }
         )
Run Code Online (Sandbox Code Playgroud)

哪个应该给你

修改后的条形图

因此,它的长短是x位置是根据你的情节的方向和构成来确定的.在垂直,非堆叠,分组条形图的情况下,x位置在中确定body(myPanelBarchart)[[10]][[4]][[2]][[4]][[4]][[9]].