自定义格子条形图中条形的边框绘制

时间:2014-12-09 13:50:22

标签: r panel bar-chart data-visualization lattice

在我发表论文的绝望尝试中,我试图用简单的数据制作一个花哨的信息图,毫无结果地希望能够吸引具有吸引力的图像的评论者。作为一种选择,我在每个栏的底部制作带有延长线的条形图,类似于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))

         })

导致此条形图

enter image description here

现在,没关系,但是我想制作一些这样的条形图,所以我很可能不得不对每个panel.abline进行一些小的调整,具体取决于大小,变量数量等等,它不是一个完美的叠加。所以我想知道是否有一些简洁的选项来破解border参数(目前是transparent)或任何其他参数,以创建那些扩展的行&# 39;在酒吧的底部像专业人士。只有格子的建议请。

如果您还知道如何摆脱在x = 0处垂直运行的灰线,那将是一个奖励。

1 个答案:

答案 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)
         }
)

enter image description here


它也适用于更多数据点和不同的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)
         }
)

enter image description here