我有一个不断变化的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
答案 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)