2016-04-09 9 views
0

my previous questionで生成されたこのグラフにいくつかの注釈を追加したいと思います。ポイントとテキストをggplot annotation_grobに追加しますか?

set.seed(40816) 
library(ggplot2) 
library(grid) 
df.plot <- data.frame(x = rnorm(100, 0, 1)) 

strainerGrob <- function(pos=unit(4,"mm"), gp=gpar(lty=2, lwd=2)) 
segmentsGrob(0, unit(1,"npc") - pos, 1, unit(1,"npc") - pos, gp=gp) 
ggplot(df.plot, aes(x = x)) + geom_density() + 
    annotation_custom(strainerGrob(), xmin = -1, xmax = 1, ymin=-Inf, ymax=0) 

enter image description here

Iは0と0のドットのドットの上、右に1、セグメントの左側に-1を追加したいです。このすべてはyの絶対距離を使用する必要はありません。これは可能ですか?今、私はハードy

ggplot(df.plot, aes(x = x)) + geom_density() + 
    annotation_custom(strainerGrob(), xmin = -1, xmax = 1, ymin=-Inf, ymax=0) + 
    geom_point(aes(x=0, y=-0.01)) + 
    annotate("text", x = -1, y = -0.01, label = -1, hjust = 1.5) + 
    annotate("text", x = 1, y = -0.01, label = 1, hjust = -1) + 
    annotate("text", x = 0, y = 0, label = 0, vjust = 2.75) 

enter image description here

をコーディングそれを行うことができます。しかし、私はデータを変更した場合のポイントや他の注釈は、間違った場所に終わります。

df.plot <- data.frame(x = rnorm(100, 0, 4)) 
ggplot(df.plot, aes(x = x)) + geom_density() + 
    annotation_custom(strainerGrob(), xmin = -1, xmax = 1, ymin=-Inf, ymax=0) + 
    geom_point(aes(x=0, y=-0.01)) + 
    annotate("text", x = -1, y = -0.01, label = -1, hjust = 1.5) + 
    annotate("text", x = 1, y = -0.01, label = 1, hjust = -1) + 
    annotate("text", x = 0, y = 0, label = 0, vjust = 2.75) 

enter image description here

答えて

1

それはあなたが、グラフのさまざまな使用するつもり何かした場合グロブは、例えば

enter image description here

set.seed(40816) 
library(ggplot2) 
df.plot <- data.frame(x = rnorm(100, 0, 1)) 

strainerGrob <- function(range = c(-1,2), midpoint=0.35, 
         vpos=unit(5,"mm"), 
         pad = unit(1.5,"mm"), 
         gp=gpar(lty=2, lwd=2)){ 

    labels <- as.character(c(range[1], midpoint, range[2])) 
    xpos <- c(0, scales::rescale(midpoint, from=range, to=c(0,1)), 1) 
    sg <- segmentsGrob(0, unit(1,"npc") - vpos, 1, unit(1,"npc") - vpos, gp=gp) 
    tg <- textGrob(labels, x = unit(xpos, "npc") + c(-1,0,1)*pad, 
       hjust = c(1,0.5,0), 
       vjust=c(0.5,0,0.5), y=unit(1,"npc") - vpos + c(0,1,0)*pad) 
    pg <- pointsGrob(x=xpos[2], y=unit(1,"npc") - vpos, pch = 19, gp = gpar(cex=0.5)) 

    grobTree(sg, pg, tg) 
} 


# wrapper to ensure that both geom and grob are in sync with x values 
custom_range <- function(range = c(-1,2), midpoint=0.35, ...){ 
    sg <- strainerGrob(range=range, midpoint=midpoint, ...) 
    annotation_custom(sg, xmin = range[1], xmax = range[2], ymin=-Inf, ymax=0) 
} 

ggplot(df.plot, aes(x = x)) + geom_density() + 
    custom_range(c(-1, 2), 0.35) + 
    expand_limits(y=-0.1) 

、複数の子を持つgTreeすることができ例えばファセットや複数の場所で、代わりにカスタムgeomを書くことをお勧めします。 one-offの場合、annotation_customはおそらくOKです。

+0

ありがとうございます!これは素晴らしい! – Ignacio

+0

私は 'xmax'を' xmax = 2'に変更してポイントと '0'を移動させます。 'x = 0'のままにする方法を教えてください。 – Ignacio

+0

あなたの質問にあなたがしようとしていることを説明できますか?私は固定値で質問に答えましたが、私はあなたの実際の問題に何が変わるか分かりません。データ座標と他のグリッド単位を混在させるのは、一般的にはややこしいかもしれません。 – baptiste

関連する問題