2013-06-01 5 views
7

Um Pfeile in ggplot zu zeichnen, verwende ich geom_segment und arrow = arrow(). Ich möchte, dass die Pfeilhöhe der Segmentbreite (oder -größe) entspricht. Der Pfeil erkennt jedoch keine Variablen direkt aus dem Datenargument in ggplot und man muss data.frame angeben, der die Variable mit dem Operator $ enthält. Dies führt zu einer Disjunktion zwischen den Werten, die zum Zeichnen der Linie verwendet werden, und denjenigen, die zum Zeichnen der Pfeilspitze verwendet werden (der größte Pfeilkopf kann sich auf dem dünnsten Segment befinden).Erstellen eines Pfeilkopfes mit passender Größe (oder lwd) in ggplot2

Beispiel:

d <- structure(list(Process = structure(c(2L, 1L, 1L, 1L, 2L, 2L, 
1L, 1L, 2L, 1L, 2L), .Label = c("First", "Second"), class = "factor"), 
x.sink = c(1, 3, 1, 2, 2, 3, 3, 2, 2, 2, 2), y.sink = c(1, 
1, 1, 2, 2, 1, 1, 1, 1, 2, 2), x.source = c(2, 2, 2, 2, 2, 
2, 2, 1, 1, 1, 3), y.source = c(2, 2, 2, 1, 1, 1, 1, 1, 1, 
2, 1), offset = c(1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1), 
Std.Flux = c(0.179487179487179, 0.170940170940171, 0.944444444444444, 
0.0854700854700855, 0.726495726495726, 0.128205128205128, 
0.213675213675214, 0.213675213675214, 0.128205128205128, 
0.106837606837607, 1)), .Names = c("Process", "x.sink", "y.sink", 
"x.source", "y.source", "offset", "Std.Flux"), class = "data.frame", row.names = c(NA, 
-11L)) 


p <- qplot(data=d, 
      #alpha=I(0.4), 
      colour=Process, 
      size=Std.Flux, 
      xlim=c(0,4), 
      ylim=c(0,3), 
      x=x.source+as.numeric(Process)/10, 
      y=y.source+as.numeric(Process)/10, 
      xend=x.sink+as.numeric(Process)/10, 
      yend=y.sink+as.numeric(Process)/10, 
      geom="segment", 
      arrow = arrow(type="closed", 
         length = unit(d$Std.Flux,"cm"))) 
print(p) 

Disjunct arrow heads

Irgendwelche Vorschläge?

+2

Ich rechne damit, es ist ein Versehen; es lohnt sich, eine Feature-Anfrage auf GitHub – baptiste

Antwort

0

Hier ist eine Möglichkeit:

require(ggplot2) 

df <- mtcars 

arrow_pos <- data.frame(y = 250) 

ggplot(df, aes(x=factor(cyl), y=mpg)) + 
    geom_bar(width = .4, stat="identity", fill="darkblue") + 
    geom_segment(data=arrow_pos, 
       aes(x=1.526, xend=1.01, y=y + 90.02, yend=y + 0.25), 
       arrow=arrow(length=unit(4.2, "mm")), lwd=2, 
       color="black") + 
    geom_segment(data=arrow_pos, 
       aes(x=1.525, xend=1.01, y=y + 90, yend=y + 0.25), 
       arrow=arrow(length=unit(4, "mm")), lwd=1, 
       color="gold2") + 
    annotate("text", x=2.39, y=360, 
      label='This arrow points to the highest MPG.') + 
    scale_y_continuous(limits = c(0,400)) + 
    xlab('CYL') + ylab('MPG') 

Ausgang:

enter image description here

+0

@Etienne Low-Décarie - Hallo, bist du noch auf der Suche nach einer Antwort auf diese Frage oder wurde es gelöst? Wenn dies Ihre Frage beantwortet, wählen Sie sie bitte als eine Lösung aus, um der Community zu zeigen, dass sie gelöst wurde, und anderen zu helfen, ihre Antwort noch schneller zu finden. Vielen Dank. – www