为geom_smooth行创建动态标签

时间:2016-06-23 15:12:24

标签: r plot ggplot2

我有一个不断变化的df,我正在对不同的值c进行分组。 使用ggplot2,我使用以下代码绘制它们以获得具有多个线性回归线(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行显示label value group c。 这必须是动态的,因为当我的df改变时我无法编写新的代码。

示例:我的df看起来像这样

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

所以在这种情况下,我会在图中用不同的颜色获得3个geom_smooth线。

现在,我只想添加一个文字标签,其中"100"旁边有一个geom_smooth,其中包含c = 100组,另一个文本标签带有"50"到该论坛的行{ {1}},等等......随着新组在df中的引入,新的geom_smooth行被绘制并需要标记。

情节的整个代码:

c = 50

2 个答案:

答案 0 :(得分:3)

如果您选择要标记行的位置,则可以执行此操作。下面,我将它们设置为每行最右端的标签,并使用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))

答案 1 :(得分:1)

This method 可能对您有用。它使用 ggplot_build 访问实际 geom_smooth 行中最右边的点以通过它添加标签。以下是使用 Mark Peterson's example 的改编。

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

p <-
  ggplot(df, aes(x = a, y = b, color = c)) + 
  geom_point(shape = 1) +
  geom_smooth(method = "lm", se = F)

p.smoothedmaxes <- 
  ggplot_build(p)$data[[2]] %>% 
  group_by( group) %>% 
  filter( x == max(x))

p +
  geom_text_repel( data = p.smoothedmaxes, 
             mapping = aes(x = x, y = y, label = round(y,2)), 
             col = p.smoothedmaxes$colour,
             inherit.aes = FALSE)

plot result