2016-06-23 7 views
0

私はdfが変化しており、異なる値をグループ化していますc。私は今、私はプロットgroup cvaluelabelの各geom_smoothラインに表示するgeom_smooth行の動的ラベルを作成する

ggplot(aes(x = a, y = b, group = c)) + 
    geom_point(shape = 1, aes(color = c), alpha = alpha) + 
    geom_smooth(method = "lm", aes(group = c, color = c), se = F) 

多重線形回帰直線(geom_smooth)とscatterplottを取得するには、次のコードでそれらをプロットggplot2で 。 dfが変更されたときに新しいコードを書き込めないので、これは動的でなければなりません。


例:私のdfだからこのケースでは、私は別の色でプロットの3つのgeom_smoothラインになるだろう。この

a  b  c 
---------------- 
1.6 24 100 
-1.4 43 50 
1  28 100 
4.3 11 50 
-3.45 5.2 50 

のように見えます。

今、私は単にグループc = 50のためのラインに"50"でグループc = 100とテキストラベルとgeom_smooth隣"100"でプロットにテキストラベルを追加したい、というように...新しいグループが取得するとdfに導入された新しいgeom_smooth行がプロットされ、ラベル付けする必要があります。


プロットのための全コード:

ggplot(aes(x = a, y = b, group = c), data = df, na.rm = TRUE) + 
    geom_point(aes(color = GG, size = factor(c)), alpha=0.3) + 
    scale_x_continuous(limits = c(-200,2300))+ 
    scale_y_continuous(limits = c(-1.8,1.5))+ 
    geom_hline(yintercept=0, size=0.4, color="black") + 
    scale_color_distiller(palette="YlGnBu", na.value="white") + 
    geom_smooth(method = "lm", aes(group = factor(GG), color = GG), se = F) + 
    geom_label_repel(data = labelInfo, aes(x= max, y = predAtMax, label = label, color = label)) 

答えて

1

場所を選ぶ場合は、それを行うことができますおそらくあなたは、標識された行をしたいです。以下は、私はそれぞれの行の右端にラベル付けするためにそれらを設定し、ラベルを重ならないようにggrepelを使用:

library(ggplot2) 
library(ggrepel) 
library(dplyr) 

set.seed(12345) 

df <- 
    data.frame(
    a = rnorm(100,2,0.5) 
    , b = rnorm(100, 20, 5) 
    , c = factor(sample(c(50,100,150), 100, TRUE)) 
) 

labelInfo <- 
    split(df, df$c) %>% 
    lapply(function(x){ 
    data.frame(
     predAtMax = lm(b~a, data=x) %>% 
     predict(newdata = data.frame(a = max(x$a))) 
     , max = max(x$a) 
    )}) %>% 
    bind_rows 

labelInfo$label = levels(df$c) 

ggplot(
    df 
    , aes(x = a, y = b, color = c) 
) + 
    geom_point(shape = 1) + 
    geom_smooth(method = "lm", se = F) + 
    geom_label_repel(data = labelInfo 
        , aes(x= max 
         , y = predAtMax 
         , label = label 
         , color = label)) 
+0

おかげで、巧妙な解決策!私はかなり新しいですが、私はいくつかの 'NA'を' a'、 'b''と' c''を持っているのでDFで動作しません。あなたのコードの前に 'filter(!is.na(a))%>%'できませんでしたか? – Max

+0

私は 'level(df $ c)'できません - それはNULLを返します(約10の値でなければなりません) – Max

+0

'levels(df $ c)'変数がファクタである場合にのみ機能します(私は、 )。 –

関連する問題