2013-12-18 47 views
4

基於ggplot2的seals example,我試圖改變箭頭的粗細,以使它們的整體大小更好地反映數據變量。我可以指定長度和厚度,但不知道如何改變箭頭的大小。非常感謝任何建議。ggplot中的按比例大小的箭頭

require(ggplot2) 
require(grid) 

d = seals[sample(1:nrow(seals), 100),] 
d$size = sqrt(sqrt(d$delta_long^2 + d$delta_lat^2)) 

ggplot(d, aes(x = long, y = lat, size = size)) + 
    geom_segment(aes(xend = long + delta_long, yend = lat + delta_lat), arrow = arrow(length = unit(0.1,"cm"))) 

enter image description here


編輯

解決方案代碼:

ggplot(d, aes(x = long, y = lat, size = size)) + 
    geom_segment(aes(xend = long + delta_long, yend = lat + delta_lat), 
       arrow = arrow(length = unit(d$size/3, "cm"), type='closed')) + 
    scale_size(range = c(0, 2)) 

回答

4

我不能說這是你的問題的完整解決方案,但至少它可以是一個開始。

ggplot(d, aes(x = long, y = lat, size = size)) + 
    geom_segment(aes(xend = long + delta_long, yend = lat + delta_lat), 
       arrow = arrow(length = unit(0.7, "cm"))) + 
    scale_size(range = c(1, 2)) 

我的更改很少:更大的箭頭和大小規模。如果您的目標是避免出現重疊繪圖,那麼尺寸上限是最重要的。

enter image description here

從現在開始,它可能是一個好主意,只留下箭頭頭,因爲線不可見時,尺寸小。下面是一個骯髒的黑客:

ggplot(d, aes(x = long, y = lat, size = size)) + 
    geom_segment(aes(xend = long + delta_long/100, yend = lat + delta_lat/100), 
       arrow = arrow(length = unit(0.7,"cm"))) + 
    scale_size(range = c(1, 2)) 

enter image description here

當然,關鍵的是要保持大,小值之間適當的視覺關係!否則,你的情節可能會產生誤導。但這取決於數據,所以我不能給你進一步的建議。對不起,如果這是一個明顯的觀點。

UPD:事實證明,unit()函數是向量化的,所以它來拯救!

ggplot(d, aes(x = long, y = lat, size = size)) + 
    geom_segment(aes(xend = long + delta_long/100, yend = lat + delta_lat/100), 
       arrow = arrow(length = unit(d$size * 5,"cm"))) + 
    scale_size(range = c(1, 2)) 

enter image description here

+0

我給你的!請參閱上面的附加代碼以獲取解 – geotheory