1. ホーム
  2. r

[解決済み] ggplot2 - プロットの外側に注釈を付ける

2023-07-08 20:25:31

質問

サンプルサイズの値をプロット上の点に関連付けたい。 私は使用することができます geom_text を使って点の近くに数字を配置することができますが、これは乱雑です。 プロットの外側のエッジに沿ってそれらを並べる方がずっときれいでしょう。

例えば、私の場合

df=data.frame(y=c("cat1","cat2","cat3"),x=c(12,10,14),n=c(5,15,20))

ggplot(df,aes(x=x,y=y,label=n))+geom_point()+geom_text(size=8,hjust=-0.5)

このようなプロットを生成します。

私はもっとこのようなものを希望します。

2つ目のプロットを作成することができることは知っています。 grid.arrange (ラ この記事 のようなもの)ですが、textGrobの間隔をy軸に沿うように決めるのは面倒だと思います。もっと簡単な方法はないでしょうか? ありがとうございます。

どのように解決するのですか?

2つ目のプロットを描く必要はありません。この場合 annotation_custom を使って、プロット領域の内側または外側の任意の場所にグロブを配置することができます。グロブの位置決めはデータ座標で行います。例えば、"5", "10", "15" が "cat1", "cat2", "cat3" と一致するとすると、テキストグローブの垂直位置は、3点のテキストグローブのy座標が3点のデータポイントのy座標で与えられるということになり、非常に便利なことになります。デフォルトでは ggplot2 はグラフをプロットエリアにクリッピングしますが、クリッピングはオーバーライドすることができます。関連するマージンは、grobのためのスペースを作るために広げられる必要があります。以下は (ggplot2 0.9.2 を使って) 2番目のプロットと似たようなプロットを生成します。

library (ggplot2)
library(grid)

df=data.frame(y=c("cat1","cat2","cat3"),x=c(12,10,14),n=c(5,15,20))

p <- ggplot(df, aes(x,y)) + geom_point() +            # Base plot
     theme(plot.margin = unit(c(1,3,1,1), "lines"))   # Make room for the grob

for (i in 1:length(df$n))  {
p <- p + annotation_custom(
      grob = textGrob(label = df$n[i], hjust = 0, gp = gpar(cex = 1.5)),
      ymin = df$y[i],      # Vertical position of the textGrob
      ymax = df$y[i],
      xmin = 14.3,         # Note: The grobs are positioned outside the plot area
      xmax = 14.3)
 }    

# Code to override clipping
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)

<イグ