2017-08-07 9 views
1

ラベルを滑らかな線から整列させようとしています。私が見た他の答えは、予測値のデータ列を作成することを示唆していますが、私はggplot用に既に作成されているデータを使用する、よりクリーンな代替方法を探しています。ggplot:正確な値でgeom_smooth/stat_smoothの値をラベルする

問題については、以下の例を参照してください:

require(tidyverse) 
require(ggrepel) 

set.seed(1) 
df <- data.frame(x = rep(1:100, 5), y = c(sample(1:20, 100, T), sample(21:40, 100, T), sample(41:60, 100, T), sample(61:80, 100, T), sample(81:100, 100, T)), group = rep(letters[1:5], each = 100)) 
df <- tbl_df(df) 

df %>% 
    ggplot(aes(x = x, y = y, label = group, color = group)) + 
    geom_smooth() + 
    guides(color = F) + 
    geom_text_repel(data = . %>% filter(x == max(x)), aes(x = x, y = y, label = group), nudge_x = 50) 

Misaligned labels

(x)はggplot_build()または別の外部、マルチステップを使用せずに、最大で滑らかなラインの値を取得するためのいくつかの方法がありますアプローチ?

答えて

3

これは本当にエレガントなのかどうかはわかりませんが、すべてが1本のパイプになっています。私は便利な "反発"バージョンを持っていなかったが、アイデアは同じです。

library(broom) 

df %>% 
    {ggplot(., aes(x, y, label = group, color = group)) + 
    geom_smooth() + 
    guides(color = F) + 
    geom_text(data = group_by(., group) %>% 
        do(augment(loess(y~x, .))) %>% 
        filter(x == max(x)), 
      aes(x, .fitted), nudge_x = 5)} 

enter image description here

あなたが最終x値でのスムーズな黄土の予測を取得する必要があるので、あなたは2回だけ、それに合わせて持っています。モデルフィッティングが遅い場合は、dplyrチェーン内で一度高くして、残りの図の出力を使用するだけです。

df %>% 
    group_by(group) %>% 
    do(augment(loess(y~x, .))) %>% 
    {ggplot(., aes(x, y, label = group, color = group)) + 
    geom_smooth() + 
    guides(color = F) + 
    geom_text(data = filter(., x == max(x)), 
      aes(x, .fitted), nudge_x = 5)} 
関連する問題