ggplot2でgeom_pointのNPC座標

LBogaardt:

どのように私は得ることができますのxyの座標geom_pointggplot参照フレームが全体のプロットイメージですか、?

私は作成することができggplotをいくつかとgeom_pointの使用します:

library(ggplot2)

my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
             geom_point(aes(x, y), color = "red")

これは与える:

ここでは、画像の説明を入力します。

これを変換することでグロブ、私はこれについていくつかの追加情報を抽出することができますggplot紫色の矢印でマークされ、プロットパネルに関して座標、などを、。しかし、これは軸に巻き取られた空間を無視します。

my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native 
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native

どのように私はの値を取得することができますのxyの私は緑の矢印でマークされた画像全体の左下隅から測定を開始するときの座標を?

それが可能だ場合、私は考慮に入れるためのソリューションたいテーマggplotを追加テーマのような+ theme_void()軸に影響を与え、また、全体のプロットされた画像に対する点の位置をシフトさせます。

アップデート:私は気づいたの相対的な大きさに影響を与えるプロットの幅と高さに応じて、軸が変化し、フォントサイズプロットパネルをだから、場所を提供するのは簡単ではありませんNPCの定義せずにユニットプロット幅プロットの高さを可能な場合は、の位置与えるgeom_pointsの関数としてプロット幅及びプロットの高さ

アランキャメロン:

あなたがggplotのサイズを変更すると、パネル内の要素の位置は、NPCスペース内の固定位置ではありません。これは、デバイスのサイズに応じてプロットの構成要素のいくつかはサイズが固定されているためであり、そのうちのいくつか(例えば、パネル)の変化の大きさ。

この手段は、任意の解決策は、アカウントに、デバイスのサイズを取らなければならないということ、そしてあなたは、プロットのサイズを変更したい場合は、再計算を実行する必要があります。(物事の音によるあなた、を含む)ほとんどのアプリケーションで、これは問題ではない、と述べました。

もう一つの問題は、あなたがパネルグロブ内の正しいgrobsを特定していることを確認することであり、簡単に一般化することができるか見ることは困難です。リストのサブセット機能を使用する[[6]]と、[[3]]あなたの例では、他のプロットに一般化ではありません。

とにかく、この溶液はgtable内パネルのサイズと位置を測定し、NPC空間へ変換するmilimetresのプロット寸法で割る前milimetresにすべてのサイズを変換することによって動作します。私は名前ではなく数値インデックスによってパネルとポイントを抽出することによって、それはもう少し一般的にするために試してみました。

library(ggplot2)
library(grid)
require(gtable)

get_x_y_values <- function(gg_plot)
{
  img_dim      <- grDevices::dev.size("cm") * 10
  gt           <- ggplot2::ggplotGrob(gg_plot)
  to_mm        <- function(x) grid::convertUnit(x, "mm", valueOnly = TRUE)
  n_panel      <- which(gt$layout$name == "panel")
  panel_pos    <- gt$layout[n_panel, ]
  panel_kids   <- gtable::gtable_filter(gt, "panel")$grobs[[1]]$children
  point_grobs  <- panel_kids[[grep("point", names(panel_kids))]]
  from_top     <- sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
  from_left    <- sum(to_mm(gt$widths[seq(panel_pos$l - 1)]))
  from_right   <- sum(to_mm(gt$widths[-seq(panel_pos$l)]))
  from_bottom  <- sum(to_mm(gt$heights[-seq(panel_pos$t)]))
  panel_height <- img_dim[2] - from_top - from_bottom
  panel_width  <- img_dim[1] - from_left - from_right
  xvals        <- as.numeric(point_grobs$x)
  yvals        <- as.numeric(point_grobs$y)
  yvals        <- yvals * panel_height + from_bottom
  xvals        <- xvals * panel_width + from_left
  data.frame(x = xvals/img_dim[1], y = yvals/img_dim[2])
}

今、私たちはあなたの例でそれをテストすることができます。

my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
             geom_point(aes(x, y), color = "red")

my.points <- get_x_y_values(my.plot)
my.points
#>           x         y
#> 1 0.1252647 0.1333251
#> 2 0.5004282 0.2330669
#> 3 0.9479917 0.9442339

そして、私たちは、これらの値は、NPCの座標として私達の値を使用して、あなたの赤の点の上にいくつかのポイントgrobsをプロットすることにより、正しい確認することができます。

my.plot
grid::grid.draw(pointsGrob(x = my.points$x, y = my.points$y, default.units = "npc"))

2020年3月25日に作成されたreprexパッケージ(v0.3.0)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=370039&siteId=1
おすすめ