gpt4 book ai didi

r - 为 geom_smooth 线创建动态标签

转载 作者:行者123 更新时间:2023-12-02 21:01:34 27 4
gpt4 key购买 nike

我有一个不断变化的 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 线上显示一个带有 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 线。

现在我只想在带有 c = 100 组的 geom_smooth 旁边添加一个带有 "100" 的文本标签和一个带有 的文本标签>“50”到组c = 50的线,依此类推...随着新组在 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))

最佳答案

如果您选择要标记线条的位置,则可能可以做到这一点。下面,我将它们设置为每行最右端的标签,并使用 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))

关于r - 为 geom_smooth 线创建动态标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37995552/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com