2017-05-07 94 views
7

我现在用了gfplot2的Tufte线多年,但我总是想知道是否有自动绘制它们的方法,所以它们对应于轴的抽搐。ggplot2 Tufte线与轴刻度相同

的常用方法我画他们是这样的:

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

在这里,我指定与y截距= C(5,10,15)的蜱,但最近我建造了一座闪亮应用程序改变轴,所以我不能指定固定滴答。

有没有办法让我说出类似于yintercept = tickmarks的内容,这样我的Shiny应用程序将始终工作,无需预先计算并手动定义轴和Tufte行?

回答

6

您可以使用ggplot_build提取对勾标记位置作为载体,然后传递到yintercept说法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

Thanks。这正是我正在寻找的。尽管eipi10的解决方案也适用。我想知道为什么这个选项没有在核心功能中实现。 – magasr

5

下面是计算分隔位置的功能,然后将它们适用于scale_y_continuousgeom_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