2013-12-18 2 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