2016-09-07 1 views
1

annotate을 사용하여 직선 세그먼트에 라벨을 지정하려고합니다. 그러나 주석의 각도를 선의 기울기로 설정하면 주석이 선 세그먼트에 정렬되지 않습니다.ggplot2 : 왜 내 텍스트 주석이 올바르게 정렬되지 않습니까?

library(ggplot2) 

ggplot(data.frame(x = seq(0, 14, 0.1)), aes(x = x)) + 
    stat_function(fun = function(x) { 
    14 - x 
    }, geom = "line") + 
    theme_bw() + 
    annotate(
    geom = "text", 
    x = 7.5, y = 7.5, 
    label = "x + y = 14", 
    angle = -45) # NISTunits::NISTradianTOdeg(atan(-1)) 

이 제공 :

enter image description here

누군가가이 현상을 설명하는 데 도움이, 어떻게이 문제를 해결하기 위해, 즉, 선분과 동일한 각도를 가지고있는 주석을 정렬 할 수 있습니까?

+3

x 축이 Y 축으로 동일한 길이를 갖고 있지 않기 때문이다. 따라서 각도가 45가 아닙니다! 두 축의 스케일이 같을 경우 100 % 작동합니다. – Kabulan0lak

+0

@ Kabulan0lak 훌륭합니다. 그래서 앵글에 뷰포트의 가로 세로 비율을 곱해야한다는 제안이 있습니까? 프로그래밍 방식으로 어떻게 할 수 있습니까? – tchakravarty

+1

보기의 크기가 고정되어 있습니까? 그렇다면 축 x와 축 y의 비율을 적절한 각도로 계산할 수 있습니다 (예). – Kabulan0lak

답변

2

나는 이것이 당신이 원하는 것을 줄 것이라고 믿습니다. 참조 용 Get width of plot area in ggplot2에 대한 답변을 참조하십시오.

#Plot so we can reference the viewport 
ggplot(data.frame(x = seq(0, 14, 0.1)), aes(x = x)) + 
    stat_function(fun = function(x) { 
    14 - x 
    }, geom = "line") 

#Get the currentVPtree and then convert the VP's height/width to inches 
current.vpTree() 
a <- convertWidth(unit(1,'npc'), 'inch', TRUE) 
b <- convertHeight(unit(1,'npc'), 'inch', TRUE) 

#Replot using the ratio of a/b to get the appropriate angle 
ggplot(data.frame(x = seq(0, 14, 0.1)), aes(x = x)) + 
    stat_function(fun = function(x) { 
    14 - x 
    }, geom = "line") + 
    theme_bw()+ 
    annotate(
    geom = "text", 
    x = 7.5, y = 7.5, 
    label = "x + y = 14", 
    angle = (atan(a/b) * 180/pi) + 270) 

우리는 기본적으로 뷰포트 너비/높이를 얻고 (우리는 삼각형의 양쪽이 있기 때문에 역 탄젠트), 행의 실제 각도가 무엇인지 계산하는 간단한 형상을 사용합니다.

결과 :

enter image description here

+0

나에게 좋을 것 같은데 ... 어떤면에서 비뚤어진 것으로 생각합니까? –

관련 문제