Ich möchte Stichprobengrößenwerte mit Punkten in einem Diagramm verknüpfen. Ich kann geom_text
die Zahlen in der Nähe der Punkte positionieren, aber das ist chaotisch. Es wäre viel sauberer, sie am äußeren Rand des Grundstücks 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)
Welches produziert diese Handlung:
Ich würde so etwas bevorzugen:
Ich weiß, dass ich ein zweites Diagramm erstellen und verwenden kann grid.arrange
(a la this post ), aber es wäre mühsam, den Abstand der textGrobs zu bestimmen, um mit der y-Achse übereinzustimmen. Gibt es einen einfacheren Weg, dies zu tun? Vielen Dank!
r
annotations
ggplot2
jslefche
quelle
quelle
devtools
:call: if (!version_match) { error: argument is of length zero
.Antworten:
Sie müssen kein zweites Diagramm zeichnen. Sie können
annotation_custom
Grobs überall innerhalb oder außerhalb des Plotbereichs positionieren. Die Positionierung der Grobs erfolgt anhand der Datenkoordinaten. Unter der Annahme, dass "5", "10", "15" mit "cat1", "cat2", "cat3" übereinstimmen, wird für die vertikale Positionierung der textGrobs gesorgt - die y-Koordinaten Ihrer drei textGrobs werden durch die angegeben y-Koordinaten der drei Datenpunkte. Standardmäßig werdenggplot2
Clips in den Plotbereich eingefügt, der Ausschnitt kann jedoch überschrieben werden. Der relevante Spielraum muss erweitert werden, um Platz für den Grob zu schaffen. Das Folgende (unter Verwendung von ggplot2 0.9.2) ergibt ein Diagramm, das Ihrem zweiten Diagramm ähnlich ist: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)
quelle
p = p + geom_text(aes(label = n, x = Inf, y = y), hjust = -1)
. Schalten Sie dann den Ausschnitt aus. Obwohl die Ausrichtung leicht abweichen kann.xlim.range <- ggplot_build(plot)$panel$ranges[[1]]$x.range
. Dann benutze ich dies als x Position:x = xlim.range[1] - diff(xlim.range)/10
und es funktioniert!Dies ist jetzt mit ggplot2 3.0.0 unkompliziert, da das Ausschneiden jetzt in Plots deaktiviert werden kann, indem das
clip = 'off'
Argument in Koordinatenfunktionen wiecoord_cartesian(clip = 'off')
oder verwendet wirdcoord_fixed(clip = 'off')
. Hier ist ein Beispiel unten.# 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
quelle
ylim
stattdessenxlim
clip = off
kann auch @ genannt werdencoord_flip
(und ich nehme auch coord_ x an). Das Hinzufügencoord_cartesian(clip = 'off')
war für mich keine Lösung, wie ich es brauchtecoord_flip
.coord_polar
Einfachere Lösung basierend auf
grid
require(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")) p grid.text("20", x = unit(0.91, "npc"), y = unit(0.80, "npc")) grid.text("15", x = unit(0.91, "npc"), y = unit(0.56, "npc")) grid.text("5", x = unit(0.91, "npc"), y = unit(0.31, "npc"))
quelle