2017-05-07 21 views
7

Yıllarca ggplot2 ile Tufte satırları kullandım, ancak bunları çizmenin otomatik bir yolu olup olmadığını her zaman merak ettim, bu nedenle eksen tiklerine karşılık geliyorlar.ggplot2 Eksen kenarı ile aynı Tufte çizgileri

Onları çizmek zamanki gibi şu şekildedir:

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

Tufte lines

Ben yintercept = c (5,10,15) ile kene belirtmek, ancak son zamanlarda ben Parlak inşa ediyordu eksenleri değiştirerek uygulama, bu yüzden sabit keneler belirtemiyorum.

Yintercept = tickmarks gibi bir şey söyleyebilmemin bir yolu var mı? Böylece, Parlak uygulamam her zaman hem eksen hem de Tufte hatlarının manuel olarak hesaplanmadan ve tanımlanmadan çalışacak?

cevap

6

Sen geom_hline ait yintercept argüman bu geçiş daha sonra bir vektör olarak onay işareti pozisyonları ayıklamak ve ggplot_build kullanabilirsiniz: Burada

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

teşekkürler. Tam olarak aradığım şey buydu. Eipi10'un çözümü de işe yarıyor. Bu seçeneğin çekirdek işlevde neden uygulanmadığını merak ediyorum. – magasr

5

mola pozisyonlarını hesaplayan bir fonksiyon olduğunu ve daha sonra her iki scale_y_continuous uygular ve 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) 
} 

Şimdi fonksiyonunu test:

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

İlgili konular