2013-06-01 38 views
7

Để vẽ mũi tên trong ggplot, tôi sử dụng geom_segment và arrow = arrow(). Tôi muốn kích thước đầu mũi tên khớp với chiều rộng phân đoạn (hoặc kích thước). Tuy nhiên, mũi tên không nhận biết biến trực tiếp từ đối số dữ liệu trong ggplot và phải chỉ định data.frame chứa biến bằng toán tử $. Điều này gây ra sự ngắt quãng giữa các giá trị được sử dụng để vẽ đường kẻ và các giá trị được sử dụng để vẽ đầu mũi tên (đầu mũi tên lớn nhất có thể nằm trên đoạn mỏng nhất).Tạo kích thước khớp đầu mũi tên (hoặc lwd) trong ggplot2

Ví dụ:

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

Bất kỳ lời đề nghị?

+2

tôi nghĩ đó là một sự giám sát; đáng để đăng một yêu cầu tính năng trên github – baptiste

Trả lời

0

Dưới đây là một cách:

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') 

Output:

enter image description here

+0

@Etienne Low-Décarie - Xin chào, bạn vẫn đang tìm câu trả lời cho câu hỏi này hay đã được giải quyết chưa? Nếu điều này trả lời câu hỏi của bạn, vui lòng chọn câu hỏi đó làm giải pháp để giúp cộng đồng biết rằng câu hỏi đã được giải quyết và giúp người khác tìm câu trả lời của họ nhanh hơn nữa. Cảm ơn. – www