2017-05-07 13 views
7

Użyłem linii Tufte z ggplot2 od lat, ale zawsze zastanawiałem się, czy istnieje automatyczny sposób ich narysowania, więc odpowiadają one tikom osi.ggplot2 Linie Tufte takie same jak znaki osiowe

Zwykłym sposobem ja je narysować jest tak:

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

Tu określić kleszcze z yintercept = C (5,10,15), ale ostatnio byłem budowy błyszczącą Aplikacja ze zmiennymi osiami, więc nie mogę określić stałych tyknięć.

Czy istnieje sposób, aby powiedzieć coś takiego jak yintercept = tickmarks, aby moja błyszcząca aplikacja zawsze działała bez wstępnego obliczania i ręcznego definiowania osi i linii Tufte?

Odpowiedz

6

Można użyć ggplot_build wyodrębnić stanowiska tickmark jako wektor, a następnie przekazać, że do yintercept argument geom_hline:

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

Dzięki. Właśnie tego szukałem. Chociaż rozwiązanie eipi10 również działa. Zastanawiam się, dlaczego ta opcja nie jest zaimplementowana w podstawowej funkcji. – magasr

5

Oto funkcja, która oblicza pozycje przerwę i następnie stosuje je zarówno scale_y_continuous i 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) 
} 

teraz przetestować funkcję:

fnc(mtcars, "mpg", "cyl") 
fnc(mtcars, "mpg", "cyl", nbreaks=2) 

fnc(iris, "Petal.Width", "Petal.Length", breaks=seq(0,80,20)) 
fnc(iris, "Petal.Width", "Petal.Length", nbreaks=6, lwd=1) 

enter image description here