two - r title center




ggplot2-kommentiert außerhalb des Diagramms (2)

Ich möchte Stichprobengrößenwerte mit Punkten auf einem Diagramm verknüpfen. Ich kann geom_text um die Zahlen in der Nähe der Punkte zu positionieren, aber das ist chaotisch. Es wäre viel sauberer, sie am äußeren Rand der Handlung auszurichten.

Zum Beispiel habe ich:

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)

Was produziert diese Handlung:

Ich würde etwas lieber so vorziehen:

Ich weiß, ich kann ein zweites Diagramm erstellen und grid.arrange (a la dieses Post ), aber es wäre mühsam, den Abstand der textGrobs zu bestimmen, um mit der y-Achse auszurichten. Gibt es einen einfacheren Weg dies zu tun? Vielen Dank!


Dies ist jetzt mit ggplot2 3.0.0 einfach, da Clipping in Plots deaktiviert werden kann, indem coord_cartesian(clip = 'off') , wie im folgenden Beispiel.

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

    # Create the plot
    ggplot(df,aes(x=x,y=y,label=n)) +
      geom_point()+
      geom_text(x = 14.25, # Set the position of the text to always be at '14.25'
                hjust = 0,
                size = 8,) +
      coord_cartesian(xlim = c(10, 14), # This focuses the x-axis on the range of interest
                      clip = 'off' # This keeps the labels from disappearing
                      ) +
      theme(plot.margin = unit(c(1,3,1,1), "lines")) # This widens the right margin


Sie müssen keine zweite Handlung zeichnen. Mit annotation_custom können Sie groabs innerhalb oder außerhalb des Plotbereichs positionieren. Die Positionierung der Grobs erfolgt in Bezug auf die Datenkoordinaten. Unter der Annahme, dass "5", "10", "15" mit "cat1", "cat2", "cat3" übereinstimmen, wird auf die vertikale Positionierung der textGrobs geachtet - die y-Koordinaten Ihrer drei textGrobs werden von der Y-Koordinaten der drei Datenpunkte. Standardmäßig werden die ggplot2 Clips an den ggplot2 angefügt, der Ausschnitt kann jedoch überschrieben werden. Der entsprechende Spielraum muss erweitert werden, um Platz für das Grob zu schaffen. Folgendes (mit ggplot2 0.9.2) ergibt eine Grafik, die der zweiten Grafik ähnelt:

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)





ggplot2