获取lattice barchart函数中分组条中点值

7
我正在尝试确定分组条形图的中点值,即每个条形的实际X位置。这在基本的R barplot函数中很容易实现,但是我想在latticebarchart中实现它。我的目标是在相应的条形上方显示文本列的值。
下面的代码允许我将文本放置在条形上方,只要我不使用子组。我已经尝试在互联网上搜索解决方案,但似乎没有什么能够解决问题。从图表中可以看出,中点仅针对整个组的中心确定。
谢谢!
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) 
                          )

            }
         )

enter image description here


不一定是你的答案,但我有一个关于ggplot的同样问题,可能对你有用,可以在(这里)找到。 - Tyler Rinker
是的,我知道ggplot可以做这样的事情,但我有点不愿意在这个时候使用GGPLOT。我想能够在TRELLIS中完成它。我还有一个在基本R中解决此问题的程序。非常感谢。 - Max C
1个回答

7

一种快速而简单的方法是改变画柱形图的 panel.barchart 函数的主体,使得在相应位置可以绘制文字。

创建一个新的面板函数(通常是个好主意,因为这样原始函数仍然存在,以防您像我一样需要重新开始多次)。

myPanelBarchart <- panel.barchart

更改面板函数的相应部分(请记住:如果您不再拥有组,如果您水平绘图或堆叠,则此方法将不再起作用)。在这里,如果myPanelBarchart传递了一个名为printVals的参数且不是FALSE,我添加了对panel.text的调用。该参数将是您想要打印在每个条形图上方的字符向量。它需要与绘制的条形图数量长度相同,并按照您的数据顺序排列。我没有添加任何内容来检查这些是否正确。
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)
    }        

})

将新函数的形式参数列表更改以添加参数printVals并给它设置默认值。

formals(myPanelBarchart) <- c(formals(panel.barchart), printVals = FALSE)

使用新的参数和新的面板函数绘制数据。
barchart(data=test, 
         percent~group,
         groups=subgroup,

            panel = function(x,y,...){
              myPanelBarchart(x, y, ..., printVals = test$text, )
            }
         )

这应该会为您提供:

修改后的条形图

所以,长话短说,x 位置是根据绘图的方向和组成决定的。在垂直、非堆叠、分组柱状图的情况下,x 位置是由 body(myPanelBarchart)[[10]][[4]][[2]][[4]][[4]][[9]] 确定的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接