在我发表论文的绝望尝试中,我试图用简单的数据制作一个花哨的信息图,毫无结果地希望能够吸引具有吸引力的图像的评论者。作为一种选择,我在每个栏的底部制作带有延长线的条形图,类似于Nicholas Felton in this example创建的条形图。
总的来说,它的进展顺利。但我使用一种非常便宜的技巧来创造那些扩展的边界'在每个栏的底部 - 我在任意位置添加panel.abline(...)
,大致与每个栏的底部重叠。让我来说明一下:
data <- t(data.frame(urban = 10, suburban = 6, rural = 4))#exmaple data
barchart(d, col="orange", xlim=c(0,15),
scales=list(y=list(alternating=0)),#get rid of y-axis labels,
border = "transparent",#make bars borders transprent
par.settings = list(axis.line = list(col = "transparent")),
panel = function(x,y,...) {
panel.barchart(x,y,...)
panel.abline(h=seq(0.66, 3.66,1), col="orange", lwd=0.7)#pathetic hack
panel.axis(side=c("left"), at=1:3, half=F, ticks = F,
outside=F, labels=rownames(d))
})
导致此条形图
现在,没关系,但是我想制作一些这样的条形图,所以我很可能不得不对每个panel.abline
进行一些小的调整,具体取决于大小,变量数量等等,它不是一个完美的叠加。所以我想知道是否有一些简洁的选项来破解border
参数(目前是transparent
)或任何其他参数,以创建那些扩展的行&# 39;在酒吧的底部像专业人士。只有格子的建议请。
如果您还知道如何摆脱在x = 0处垂直运行的灰线,那将是一个奖励。
答案 0 :(得分:7)
您需要创建一个自定义面板函数,该函数会考虑条形的box.width
。经过一些实验,我想出了这个,这似乎有效:
panel = function(x, y, ...) {
dots <- list(...)
br <- dots$box.ratio
panel.barchart(x, y, ...)
panel.abline(h = seq_along(x) - 0.5*(br/(br+1)), col="orange", lwd=0.7)
}
试一试:
d <- t(data.frame(urban = 10, suburban = 6, rural = 4, other=5))
barchart(d, col="orange", xlim=c(0, 15), box.ratio=5,
scales=list(y=list(alternating=0)),
border = "transparent",
par.settings = list(axis.line = list(col = "transparent")),
panel = function(x, y, ...) {
dots <- list(...)
br <- dots$box.ratio
panel.barchart(x, y, ...)
panel.abline(h = seq_along(x) - 0.5*(br/(br+1)), col="orange", lwd=0.7)
}
)
它也适用于更多数据点和不同的box.ratio
:
d <- t(data.frame(urban = 10, suburban = 6, rural = 4, other=5, rubbish=7))
barchart(d, col="orange", xlim=c(0, 15), box.ratio=9,
scales=list(y=list(alternating=0)),
border = "transparent",
par.settings = list(axis.line = list(col = "transparent")),
panel = function(x, y, ...) {
dots <- list(...)
br <- dots$box.ratio
panel.barchart(x, y, ...)
panel.abline(h = seq_along(x) - 0.5*(br/(br+1)), col="orange", lwd=0.7)
}
)