Gee*_*cid 4 r data-visualization panel bar-chart lattice
在我发表论文的绝望尝试中,我试图用一个简单的数据制作一个花哨的信息图表,毫无结果地希望能够吸引具有吸引力图像的评论者.作为一种选择,我在每个栏的底部制作带有延长线的条形图,类似于Nicholas Felton在这个例子中创建的那些.
总的来说,它的进展顺利.但我正在使用一个非常便宜的技巧在每个栏的底部创建那些"扩展边框" - 我添加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))
})
Run Code Online (Sandbox Code Playgroud)
这导致了这个条形图

现在,它还可以,但是我想制作一些这样的条形图,所以我很可能不得不panel.abline根据尺寸,变量数量等对每个条形图进行一些小的调整.另外,它不是一个完美的叠加.所以我想知道是否有一些简洁的选项可以破解border参数(transparent目前正在进行)或任何其他参数,以便像专业人士那样在条形图底部创建那些"扩展线".只有格子的建议请.
如果您还知道如何摆脱在x = 0处垂直运行的灰线,那将是一个奖励.
您需要创建一个自定义面板功能,该功能会考虑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)
}
Run Code Online (Sandbox Code Playgroud)
试试吧:
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)
}
)
Run Code Online (Sandbox Code Playgroud)

它还适用于更多数据点和不同的数据点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)
}
)
Run Code Online (Sandbox Code Playgroud)
