9

ggplotでgrconvertX/grconvertXを使用する方法を理解しようとしています。私の最終的な目標は、ユーザー座標からデバイス座標に移動することで、 ggplot2フィギュア(および場合によってはラティス)に注釈を追加することです。私はそれがグロブでできることを知っていますが、もっと簡単な方法があるかどうか疑問に思っています。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 ...

ここに画像の説明を入力してください

このコードは、以前の投稿の1つであるX座標系とY座標系の混合のソリューションに基づいています。元のプロットのx座標がどのようにndcに変換されたかを確認できます。このアプローチの利点は、Yにデバイス座標を使用できることです。

私はggplot2(そしておそらくlattice)でも同じことが簡単にできると思いました。

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...

ただし、正しく機能しません。座標が少しずれているようです。垂直線とテキストは、プロットの目盛りラベルに対応していません。誰かがそれを修正する方法を教えてもらえますか?よろしくお願いします。

ここに画像の説明を入力してください

4

1 に答える 1

12

grconvertXおよび関数はgrconvertY基本グラフィックで動作しますが、ggplot2 はグリッド グラフィックを使用します。一般に、2 つの異なるグラフィックス エンジンは一緒にうまく動作しません (ただし、使用gridBaseして役立つことを実証しました)。最初の例は、基本グラフィックから開始したため、ユーザー座標系が基本グラフとともに存在し、grconvertXそこから変換されるため機能します。2 番目のケースでは、ユーザー座標系がベース グラフィックスに設定されていないため、トップ ビューポート座標と似ていますが同一ではないデフォルトの座標 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' )
 } 

ここで注意が必要なことの 1 つは、ggplot2 がプロットされるデータに合わせてビューポートのスケールを設定せず、変換自体を行うことです。この場合、x データに基づいてスケールを設定することはできましたが、ggplot2 がより凝った処理を行う場合、これは機能しない可能性があります。必要なのは、ggplot2 から逆変換された座標を取得して、grid.text の呼び出しで使用する方法です。

于 2012-05-10T17:36:54.263 に答える