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

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处垂直运行的灰线,那将是一个奖励.

And*_*rie 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)
}
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)

在此输入图像描述

  • 想出来 - 需要将`reference.line = list(col ="transparent")`添加到`par.settings`列表中. (3认同)