2017-05-07 10 views
7

मैंने कई वर्षों से ggplot2 के साथ टफटे लाइनों का उपयोग किया, लेकिन मैंने हमेशा सोचा है कि उन्हें आकर्षित करने के लिए एक स्वचालित तरीका था, इसलिए वे धुरी tics से मेल खाते हैं।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) टिक निर्दिष्ट करते हैं, लेकिन हाल ही में मैं एक चमकदार निर्माण कर रहा था बदलते अक्ष के साथ ऐप, इसलिए मैं निश्चित टिक निर्दिष्ट नहीं कर सकता।

क्या मेरे लिए yintercept = tickmarks जैसे कुछ कहने का कोई तरीका है, ताकि मेरा चमकदार ऐप हमेशा धुरी और टफेट लाइनों को मैन्युअल रूप से सटीक और परिभाषित किए बिना काम करेगा?

उत्तर

6

आप ggplot_build उपयोग कर सकते हैं एक वेक्टर के रूप tickmark पदों को निकालने और उसके बाद के लिए geom_hline की yintercept तर्क है कि पारित:

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) 
} 

अब समारोह का परीक्षण:

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

संबंधित मुद्दे