在ggplot2中使用grconvertX/grconvertY

Max*_*x C 8 r ggplot2 lattice

我想弄清楚如何在ggplot中使用grconvertX/grconvertX.我的最终目标是使用和从用户坐标到设备坐标向ggplot2图形(可能是晶格)添加注释.我知道它可以用grobs完成,但我想知道是否有更简单的方法.grid.textgrid.lines

以下代码允许我将值从用户坐标传递到ndc坐标,并使用这些值来注释绘图grid.text.

graphics.off()      # close graphics windows   

library(grid)
library(gridBase)


test= data.frame(
  x = c(1,2,3),
  y = c(12,10,3),
  n = c(75,76,73)
  )

par(mar = c(13,5,2,3))

plot(test$y ~ test$x,type="b", ann=F)

for (i in 1:nrow(test))

{
  X=grconvertX(i , from="user", to="ndc")
  grid.text(x=X, y =0.2, label=paste("GRID.text at\nuser.x=", i, "\n", "ndc.x=", (signif( X, 5))   ) ) 
  grid.lines(x=c(X, X), y = c(0.28, 0.33) )
}
#add some code to save as PDF ...
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

该代码基于我以前的一篇文章的解决方案:混合X和Y坐标系.您可以看到原始图中的x坐标是如何转换为ndc的.这种方法的优点是我可以使用Y的设备坐标.

我假设我可以轻松地在ggplot2(也可能在格子中)做同样的事情.

library(ggplot2)
graphics.off()      # close graphics windows   

qplot(x=x, y=y, data=test)+geom_line()+  opts(plot.margin = unit(c(1,3,8,1), "lines"))

for (i in 1:nrow(test))

{
  X=grconvertX(i , from="user", to="ndc")
  grid.text(x=X, y =0.2, label=paste("GRID.text at\nuser.x=", i, "\n", "ndc.x=", (signif( X, 5))   ) ) 
  grid.lines(x=c(X, X), y = c(0.28, 0.33) )
}

#add some code to save as PDF...
Run Code Online (Sandbox Code Playgroud)

但是,它无法正常工作.坐标似乎有点偏.垂直线和文本与绘图上的刻度标签不对应.谁能告诉我如何解决它?非常感谢提前.

在此输入图像描述

Gre*_*now 11

这些grconvertXgrconvertY函数与基本图形一起使用,而ggplot2使用网格图形.一般来说,2个不同的图形引擎不能很好地协同工作(尽管你已经演示了使用gridBase帮助).您的第一个示例有效,因为您使用基本图形开始,因此用户坐标系与基本图形一起存在并grconvertX从中进行转换.在第二种情况下,用户坐标系统从未在基本图形中设置,因此看起来它可能使用默认坐标0,1,它们与顶部视口坐标相似但不完全相同,因此您得到的内容类似但不完全正确(我真的很惊讶你没有得到错误或警告

通常对于网格图形,在坐标之间进行转换的等效方法是仅使用感兴趣的坐标系创建新视口(或使用正确的坐标系推送/弹出到现有视口),然后在该视口中添加注释.

下面是一个创建绘图的示例,然后向下移动到包含主绘图的视口,创建一个具有相同尺寸但关闭剪裁的新视口,x刻度基于数据,y刻度为0,1 ,然后相应地添加一些文字:

library(ggplot2)
library(grid)

test= data.frame(   x = c(1,2,3),   y = c(12,10,3),   n = c(75,76,73)   )  

qplot(x=x, y=y, data=test)+geom_line()+  opts(plot.margin = unit(c(1,3,8,1), "lines"))  

current.vpTree()
downViewport('panel-3-4')
pushViewport(dataViewport( test$x, clip='off',yscale=c(0,1)))

for (i in 1:nrow(test))  {
    grid.text(x=i, y = -0.2, default.units='native',
        label=paste("GRID.text at\nuser.x=", i, "\n"   ) )
        grid.lines(x=c(i, i), y = c(-0.1, 0), default.units='native' )
 } 
Run Code Online (Sandbox Code Playgroud)

其中一个棘手的问题是ggplot2没有设置视口比例以匹配正在绘制的数据,但转换本身.在这种情况下,根据工作的x数据设置比例,但如果ggplot2做了更好的事情,那么这可能不起作用.我们需要的是从ggplot2获取反向转换坐标以在grid.text调用中使用的某种方法.