Frage ggplot2 kommentiert die Layerposition in R


In meinem Plot habe ich sowohl Legenden als auch Textanmerkungen. Für Legenden kann ich angeben

legend.justification=c(1,0), legend.position=c(1,0) 

um die Position relativ zu dem Zeichenbereich zu lokalisieren (z. B. oben rechts, unten links). Wenn ich jedoch eine Annotate-Schicht (http://docs.ggplot2.org/0.9.3.1/annotate.html), scheint es, dass ich nur die Koordinaten des Textes angeben kann

annotate("text", x = 8e-7, y = 1e-5, label=data.note, size = 5) 

anstelle der Position der Zeichenregion (Ich möchte den Text in die untere linke Ecke setzen). Die Länge des Textes (label) kann für verschiedene Parzellen variieren. Gibt es einen Weg, dies zu erreichen? Vielen Dank!


5
2018-03-18 18:56


Ursprung


Antworten:


Ist das was du suchst?

set.seed(1)
df <- data.frame(x=rnorm(100),y=rnorm(100))
ggplot(df, aes(x,y)) +geom_point()+
  annotate("text",x=min(df$x),y=min(df$y),hjust=.2,label="Text annotation")

Es wird wahrscheinlich ein bisschen experimentieren mit hjust=... benötigt, um genau das unten links zu bekommen.


3
2018-03-18 19:22



Sie können die Tatsache nutzen, dass -Inf und Inf werden zu den Extremen der Positionsskalen gemappt, ohne sie zu verlängern, um sie in der unteren linken Ecke zu platzieren. hjust und vjust werden benötigt, um den Bezugspunkt in der unteren linken Ecke Ihres Textes zu setzen. [mit jlhowards Scheindaten]

set.seed(1)
df <- data.frame(x=rnorm(100),y=rnorm(100))

ggplot(df, aes(x,y)) +geom_point()+
  annotate("text",x=-Inf,y=-Inf,hjust=0,vjust=0,label="Text annotation")

enter image description here


5
2018-03-18 22:15



Die "Inf" -Lösung hat Probleme, wenn Sie mehrzeiligen Text wünschen. Außerdem gibt es keinen Rand zwischen dem Text und der Panel-Kante, was hässlich ist. Die andere Lösung erfordert eine explizite Erwähnung der Daten, die ebenfalls nicht gut sind.

Der gewünschte Effekt kann schön mit annotation_custom (oder in meinem Beispiel dem Proto Geom direkt) erreicht werden. Sie haben konfigurierbare Rand-, Text- und Box-Ausrichtung. Der hinzugefügte Bonus im folgenden Code ist, dass Sie angeben können, welche Facette mit etwas wie Anmerkungen versehen werden soll facets=data.frame(cat1='blue', cat2='tall').

library("ggplot2")
annotate_textp <- function(label, x, y, facets=NULL, hjust=0, vjust=0, color='black', alpha=NA,
                          family=thm$text$family, size=thm$text$size, fontface=1, lineheight=1.0,
                          box_just=ifelse(c(x,y)<0.5,0,1), margin=unit(size/2, 'pt'), thm=theme_get()) {
  x <- scales::squish_infinite(x)
  y <- scales::squish_infinite(y)
  data <- if (is.null(facets)) data.frame(x=NA) else data.frame(x=NA, facets)

  tg <- grid::textGrob(
    label, x=0, y=0, hjust=hjust, vjust=vjust,
    gp=grid::gpar(col=alpha(color, alpha), fontsize=size, fontfamily=family, fontface=fontface, lineheight=lineheight)
  )
  ts <- grid::unit.c(grid::grobWidth(tg), grid::grobHeight(tg))
  vp <- grid::viewport(x=x, y=y, width=ts[1], height=ts[2], just=box_just)
  tg <- grid::editGrob(tg, x=ts[1]*hjust, y=ts[2]*vjust, vp=vp)
  inner <- grid::grobTree(tg, vp=grid::viewport(width=unit(1, 'npc')-margin*2, height=unit(1, 'npc')-margin*2))

  layer(
    data = NULL,
    stat = StatIdentity,
    position = PositionIdentity,
    geom = GeomCustomAnn,
    inherit.aes = TRUE,
    params = list(
      grob=grid::grobTree(inner), 
      xmin=-Inf, 
      xmax=Inf, 
      ymin=-Inf, 
      ymax=Inf
    )
  )
}

qplot(1:10,1:10) + annotate_text2('some long text\nx = 1', x=0.5, y=0.5, hjust=1)

4
2018-03-19 08:36