2017-05-07 4 views
7

저는 몇 년 동안 ggplot2와 함께 Tufte 줄을 사용 했었지만, 그릴 수있는 자동화 된 방법이 있는지 항상 궁금해했습니다. 따라서 축 틱에 해당합니다.ggplot2 축 틱과 동일한 줄이 있습니다.

내가 그들을 그리는 일반적인 방법은 다음과 같이이다 :

ggplot(mtcars, aes(x=mpg, y=cyl))+ 
geom_bar(stat = "identity")+ 
theme_tufte()+ 
geom_hline(yintercept = c(5,10,15), col="white", lwd=3) 
다음

Tufte lines

내가 yintercept = C를 (5,10,15)와 진드기를 지정하지만, 최근에 나는 빛나는 구축했다 애플 리케이션을 변경 축, 그래서 고정 ticks 지정할 수 없습니다.

yintercept = tickmarks와 같은 것을 말할 수있는 방법이 있습니까? Shiny 앱은 축과 Tufte 라인을 수동으로 미리 계산하고 정의하지 않고도 작동 할 수 있습니까?

답변

6

당신은 geom_hlineyintercept 인수 되었 다음 벡터로 표시 점의 위치를 ​​추출하고 ggplot_build를 사용할 수 있습니다 여기에

p <- ggplot(mtcars, aes(x=mpg, y=cyl))+ 
    geom_bar(stat = "identity")+ 
    theme_tufte() 

tickmarks <- ggplot_build(p)$layout$panel_ranges[[1]]$y.major_source 

p + geom_hline(yintercept = tickmarks, col="white", lwd=3) 
+0

감사합니다. 이것은 내가 찾고 있었던 바로 그 것이었다. eipi10의 솔루션도 잘 작동합니다. 이 옵션이 핵심 기능에서 구현되지 않은 이유가 궁금합니다. – magasr

5

이 휴식 위치를 계산하는 함수의 다음 두 scale_y_continuous로 적용 geom_hline :

library(ggthemes) 
library(scales) 
library(lazyeval) 
library(tidyverse) 

fnc = function(data, x, y, nbreaks=5, lwd=3, breaks=NULL) { 

    if(is.null(breaks)) { 
    breaks = data %>% group_by_(x) %>% 
     summarise_(yvar=interp(~ sum(yy), yy=as.name(y))) 

    breaks = pretty_breaks(n=nbreaks)(c(0, breaks$yvar)) 
    } 

    ggplot(data, aes_string(x, y)) + 
    geom_bar(stat = "identity") + 
    theme_tufte() + 
    scale_y_continuous(breaks=breaks) + 
    geom_hline(yintercept = breaks, col="white", lwd=lwd) 
} 

이제 기능 테스트 :

012,335을

enter image description here