我试图弄清楚如何确定分组条的中点值,即每个条的中心的实际X位置。这很容易在基础R barplot
函数中完成,但是我希望能够在 lattice 的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)
)
}
)
答案 0 :(得分:7)
快速而肮脏的方法是更改绘制条形的panel.barchart
的主体,包括在适当的位置绘制文本。
创建一个新的面板功能(通常一个好主意,因为那时原始功能仍然存在,以防你需要像我一样多次重启)
myPanelBarchart <- panel.barchart
更改面板功能的相应部分(请记住:如果您不再拥有组,如果您水平绘图,或者如果您进行堆叠,则不再有效)。在此,如果panel.text
传递了名为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)
}
})
更改新函数的形式参数列表以添加参数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]]
中确定。