ggplot:将 geom_smooth / stat_smooth 值标记为正确值
ggplot: labelling geom_smooth / stat_smooth values at correct value
我正在尝试让标签与平滑线上的值对齐。虽然我看到的其他答案建议创建预测值的数据列,但我正在寻找一种更简洁的替代方法,它使用已经为 ggplot 生成的数据。
请参阅下面的问题示例:
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) 处的平滑线值?
我不确定这是否真的更优雅,但一切都在一个管道中。我手边没有 "repel" 版本,但思路是一样的。
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 链中更高的地方做一次,然后只使用图中其余部分的输出。
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)}
我正在尝试让标签与平滑线上的值对齐。虽然我看到的其他答案建议创建预测值的数据列,但我正在寻找一种更简洁的替代方法,它使用已经为 ggplot 生成的数据。
请参阅下面的问题示例:
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) 处的平滑线值?
我不确定这是否真的更优雅,但一切都在一个管道中。我手边没有 "repel" 版本,但思路是一样的。
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 链中更高的地方做一次,然后只使用图中其余部分的输出。
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)}