使用网格修改vcd :: mosaic图

时间:2015-04-10 22:35:35

标签: r plot categorical-data r-grid mosaic-plot

我想使用grid修改我使用vcd包创建的马赛克图。具体来说,我想添加精确定位的线段。这是一个最小的例子:

library(vcd)
myDF <- expand.grid(fac1 = c('a', 'b', 'c', 'a'), fac2 = c('y', 'z'))
mosaic(fac2 ~ fac1, data = myDF, pop = FALSE)

结果是这个情节:

minimal mosaic plot

我想使用grid.segments()在“fac2”标签下绘制一个水平线段,并与绘制的单元格一样宽。如果我可以使用seekViewport()导航到包含“fac2”标签的视口,这将很简单。但我不能。这是问题所在:

> getNames()
> [1] "rect:fac1=a,fac2=y" "rect:fac1=a,fac2=z" "rect:fac1=b,fac2=y" "rect:fac1=b,fac2=z" 
  [5] "rect:fac1=c,fac2=y" "rect:fac1=c,fac2=z" "GRID.text.1"        "GRID.text.2"        
  [9] "GRID.text.3"        "GRID.text.4"        "GRID.text.5"        "GRID.text.6"        
 [13] "GRID.text.7" 

当我运行seekViewport("cell:GRID.text.2")或类似的内容时,我收到一条错误消息:

Error in grid.Call.graphics(L_downviewport, name$name, strict) : 
  Viewport 'cell:GRID.text.2' was not found

(“cell:”前缀是vcd视口命名方案的一部分。相比之下,像seekViewport("cell:fac1=a,fac2=y")这样的命令可以很好地工作。)

有没有办法导航到包含“fac2”标签的视口?如果没有,那么将线段精确定位在该标签下方的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

在上面的评论中,@user20650提供了必要的信息。除此之外,原始帖子中的代码存在问题,因为getNames()返回了grob名称,而不是视口名称。

绘制线段的最简单方法是绘制上图,然后

nn <- seekViewport("margin_top")  ## Drill down to the viewport[margin_top]
grid.segments(0, .5, 1, .5)
upViewport(nn)                    ## Return to top level viewport, here viewport[ROOT]

结果是这个情节:

mosaic plot with line segment between x–axis labels