首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot:以正确的值标记geom_smooth / stat_smooth值

ggplot:以正确的值标记geom_smooth / stat_smooth值
EN

Stack Overflow用户
提问于 2017-08-08 07:14:23
回答 1查看 1.6K关注 0票数 2

我试图让标签与一条平滑线上的值对齐。虽然我看到的其他答案建议创建预测值的数据列,但我正在寻找一种更干净的替代方案,它使用已经为ggplot生成的数据。

有关问题,请参见下面的示例:

代码语言:javascript
复制
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)

是否有某种方法可以在不使用ggplot_build()或其他外部多步方法的情况下获得max(x)处的平滑线值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-08 08:24:32

我不确定这是否真的更优雅,但这一切都在一个管道中。我手头没有“排斥”版本,但想法是一样的。

代码语言:javascript
复制
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)}

你需要得到最终x值下的黄土平滑度的预测值,所以你只需要对它进行两次拟合。如果模型拟合很慢,您可以在dplyr链中更高的位置执行一次,然后在图的其余部分使用输出。

代码语言:javascript
复制
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)}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45556998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档