2017-05-07 74 views
7

私はgwplot2でTufte線を何年も使用していましたが、私は常にそれらを描く自動化された方法があるかどうか疑問に思っています。ggplot2軸目盛りと同じ太さの線

私はそれらを描く通常の方法は、このようなものです:私はyintercept =のC(5,10,15)とのダニを指定するが、最近私はシャイニーを構築しました。ここ

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 =目盛りのようなものを言うの方法はありますか?

答えて

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

は今すぐ機能をテスト:

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

関連する問題