8

グリッド ウィンドウのプロット エリアの幅を取得する方法はありますか? たとえば、plot.marginが変更されたり、y 軸ラベルのフォント サイズが大きくなったりすると、拡大または縮小します。のどこかに隠されていstr(p)ますか?

任意のサイズ測定が機能します。Y軸ラベルのフォントサイズの変更など、さまざまなシナリオでプロット領域の幅の相対的な変化を測定できる必要があります。

ここに画像の説明を入力

df = data.frame(x = (1:3),One=c(12, 8, 13),Two=c(13, 7, 11),Three=c(11, 9, 11))
df.melt = melt(df, id.vars="x")

p = ggplot(df.melt, aes(x=x, y=value, color=variable)) + 
  geom_line() +
  coord_cartesian(xlim=c(min(df.melt$x),max(df.melt$x))) +
  theme(legend.position="none", plot.margin = unit(c(1, 4, 1, 1), "cm")) 
p

更新 – 明確にするために: 計算を手伝ってくださいa/b

ここに画像の説明を入力

p = ggplot(df.melt, aes(x=x, y=value, color=variable)) + 
  geom_line() + coord_cartesian(xlim=c(min(df.melt$x),max(df.melt$x))) +
  theme(legend.position="none")

p1 = p + theme(plot.margin=unit(c(1,1,1,1),"cm"), axis.text.y=element_text(size=10))
p2 = p + theme(plot.margin=unit(c(1,1,1,2),"cm"), axis.text.y=element_text(size=30))
grid.arrange(p1, p2, ncol=2)
4

3 に答える 3

15

ggplot2 のプロットは、グリッド グラフィックを使用します。グリッド グラフィックス パッケージを使用して作成されたグラフィカル シーンは、グロブとビューポートで構成されます。

Grobs の検査にはgridDebugパッケージを使用できます。

  1. showGrob シーンの描画に使用されたグロブの場所と名前を表示します

          showGrob()
    
  2. グロブの gpath を取得する

      sceneListing <- grid.ls(viewports=T, print=FALSE)
      do.call("cbind", sceneListing)
    
       name                                gPath                                                      
    [1,] "ROOT"                              ""                                                         
    [2,] "GRID.gTableParent.45019"           ""                                                         
    [3,] "background.1-5-6-1"                "GRID.gTableParent.45019"                                  
    [4,] "spacer.4-3-4-3"                    "GRID.gTableParent.45019"                                  
    [5,] "panel.3-4-3-4"                     "GRID.gTableParent.45019"                                  
    [6,] "grill.gTree.44997"                 "GRID.gTableParent.45019::panel.3-4-3-4"                   
    
  3. ゴーブを回収する

    h <- grid.get(gPath="GRID.gTableParent.45019")
    
  4. h プロパティを取得する (例)

    h$layoutvp$width
    

応用:

grid.get('x',grep=TRUE,global=T)
(polyline[panel.grid.minor.x.polyline.21899], polyline[panel.grid.major.x.polyline.21903], gTableChild[axis-l.3-3-3-3], gTableChild[axis-b.4-4-4-4], gTableChild[xlab.5-4-5-4]) 
>  grid.get('x',grep=TRUE,global=T)[[3]]
gTableChild[axis-l.3-3-3-3] 
>  xx <- grid.get('x',grep=TRUE,global=T)[[3]]
> grobWidth(xx)
[1] sum(1grobwidth, 0.15cm+0.1cm)
于 2012-12-13T21:03:28.837 に答える
9

これは私にそれをより深く調べるのに十分興味をそそられました。関数が情報を取得するために正しいビューポートに移動するための情報を提供することを期待していましgrid.lsたが、あなたの例では、「...」に置き換えられるステップがたくさんあり、それを変更する方法がわかりませんでした扱いやすいものを与えるために。ただし、grid.lsまたは他のツールを使用すると、さまざまなビューポートの名前を確認できます。対象のビューポートは両方とも「panel.3-4-3-4」という名前です。たとえば、以下は1番目に移動し、インチ単位で幅を見つけ、2番目に移動して、その幅を見つけるコードです。インチで。

grid.ls(view=TRUE,grob=FALSE)
current.vpTree()
seekViewport('panel.3-4-3-4')
a <- convertWidth(unit(1,'npc'), 'inch', TRUE)
popViewport(1)
seekViewport('panel.3-4-3-4')
b <- convertWidth(unit(1,'npc'), 'inch', TRUE)
a/b

最初のパネルをポップせずに2番目のパネルに到達する簡単な方法を見つけることができませんでした。これは機能し、必要な情報を提供します。残念ながら、最初のパネルがリストから外れるため、そこに戻って追加情報を見つけたり、変更したりすることはできません。しかし、これはあなたが求めた情報を提供し、それは将来のプロットで使用される可能性があります。

たぶん、他の誰かが、最初のパネルをポップせずに、または各パネルの完全なvpPathを取得して直接ナビゲートすることなく、2番目のパネルにナビゲートする方法を知っています。

于 2012-12-15T18:09:13.770 に答える
5

この回答は、主に @java_xof によるコメントへの返信です。返信が長すぎてコードが含まれているため、コメントに収まりません。ただし、元の質問にも役立つ場合があります(または少なくとも出発点を提供します)。

関数とそれを使用するコードを次に示します (tcltk および tkrplot パッケージが必要です)。

library(ggplot2)
library(tkrplot)
TkPlotLocations <- function(FUN) {
    require(tkrplot)

    cl <- substitute(FUN)
    replot <- function() eval(cl)

    tt <- tktoplevel()
    img <- tkrplot(tt, replot, vscale=1.5, hscale=1.5)
    tkpack(img)

    tkpack(xfr <- tkframe(tt), side='left')
    tkpack(yfr <- tkframe(tt), side='left')

    xndc <- tclVar()
    yndc <- tclVar()
    xin <- tclVar()
    yin <- tclVar()

    tkgrid(tklabel(xfr, text='x ndc'), tklabel(xfr, textvariable=xndc))
    tkgrid(tklabel(yfr, text='y ndc'), tklabel(yfr, textvariable=yndc))
    tkgrid(tklabel(xfr, text='x inch'), tklabel(xfr, textvariable=xin))
    tkgrid(tklabel(yfr, text='y inch'), tklabel(yfr, textvariable=yin))

    iw <- as.numeric(tcl("image","width", tkcget(img, "-image")))
    ih <- as.numeric(tcl("image","height",tkcget(img, "-image")))

    cc <- function(x,y) {
        x <- (as.real(x)-1)/iw
        y <- 1-(as.real(y)-1)/ih
        c(x,y)
    }

    mm <- function(x, y) {
        xy <- cc(x,y)
        tclvalue(xndc) <- xy[1]
        tclvalue(yndc) <- xy[2]
        tclvalue(xin) <- grconvertX(xy[1], from='ndc', to='inches')
        tclvalue(yin) <- grconvertY(xy[2], from='ndc', to='inches')
    }

    tkbind( img, "<Motion>", mm)

    invisible()
}


x <- runif(25)
y <- rnorm(25, x, 0.25)
plot(x,y)
par()$pin
par()$plt
TkPlotLocations(plot(x,y))
qplot(x,y)
par()$pin
par()$plt
TkPlotLocations(print(qplot(x,y)))
qplot(x,y) + xlab('Multi\nline\nx\nlabel')
par()$pin
par()$plt
TkPlotLocations(print(qplot(x,y) + xlab('Multi\nline\nx\nlabel')))

上記の関数を定義し、次の行を実行すると、同じランダム データの 3 つのプロットが生成されます。par()$pinおよびpar()$plt(およびその他のパラメーター) の結果は、プロット領域がプロットで異なっていても、3 つのプロットでまったく同じであることがわかります。

また、3 つの新しいウィンドウがポップアップ表示されます。ウィンドウでは、マウス ポインターをグラフ上に移動できます。ウィンドウの下部には、ポインターの現在の位置が正規化されたデバイス座標とインチで表​​示されます (両方ともデバイス領域の左下隅)。マウス ポインターをグラフの隅 (またはその他の部分) に合わせると、値が表示され、3 つのグラフを比較できます。

これは、元の質問の少なくとも一部に答えるのに十分かもしれません(プログラム的にではなく、より便利です)。関数を変更して、他の測定値も印刷することができます。他の人が興味を持っている場合は、これを拡張して将来パッケージに含めることができます。

于 2012-12-14T18:19:39.840 に答える