2012-09-13 14 views
43

Ich möchte Stichprobengrößenwerte mit Punkten auf einem Diagramm verknüpfen. Ich kann geom_text verwenden, 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.ggplot2 - Anmerkungen außerhalb des Plots

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) 

die in diesem Plot produziert: enter image description here

Ich würde dies etwas mehr wie bevorzugen: enter image description here

Ich weiß, dass ich ein zweites Grundstück erstellen und verwenden Sie grid.arrange (a la this 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!

+1

Dieser mit sekundärer Achse getan werden könnte, was ich denke, es ist in Entwicklung. Aber wenn Sie es versuchen möchten, folgen Sie diesem Link https://groups.google.com/forum/?fromgroups=#!topic/ggplot2/_3Pm-JEoCqE –

+0

Hmm interessant ... Ich fragte mich, ob Hadley wollte dies umsetzen. Allerdings bekomme ich einige seltsame Fehler beim Laden von 'Devtools':' call: if (! Version_match) {Fehler: Argument hat die Länge Null. – jslefche

+0

Ich kann nur sagen, dass Devtools für mich funktioniert. Sie sollten versuchen, eine Frage zu stellen, wenn Sie sie nicht lösen können. –

Antwort

42

Sie müssen keine zweite Zeichnung zeichnen. Sie können annotation_custom verwenden, um Grobpositionen innerhalb oder außerhalb des Zeichenbereichs zu 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 klammert ggplot2 Clips an den Plotbereich, aber der Ausschnitt kann außer Kraft gesetzt werden. Der entsprechende Spielraum muss erweitert werden, um Platz für das Grob zu schaffen. Die folgenden (mit ggplot2 0.9.2) gibt einen Plot ähnlich wie Ihr zweites Grundstück:

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) 

enter image description here

+8

ist es nicht einfacher, eine Geom_text-Schicht bei x = Inf zu haben , hjust> = 1, und Clipping ausschalten? – baptiste

+0

Funktioniert gut, danke @ Sandy-Muspratt! – jslefche

+11

@jslefche, sollten Sie beachten, dass die von @baptiste angebotene Lösung viel einfacher ist. 'p = p + geom_text (aes (Markierung = n, x = Inf, y = y), hjust = -1)'. Dann schalten Sie den Clipping aus. Obwohl die Ausrichtung leicht abweichen kann. –

2

Einfachere Lösung auf Basis von 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")) 
Verwandte Themen