首页 > 解决方案 > R ggplot - 计算多条绘制曲线和 geom_hline 的截距

问题描述

我想用 geom_hline 计算这些线的插值 x 截距:

样本图

library(dplyr)
library(ggplot2)

g1=data.frame(grp="1", x=seq(1,50,1), y=rnorm(50,5,1))
g2=data.frame(grp="2", x=seq(1,30,1), y=rnorm(30,8,2))
g3=data.frame(grp="3", x=seq(1,45,1), y=rnorm(45,10,1))
comb.dat=rbind(g1,g2,g3)
plot.dat=comb.dat %>% group_by(grp) %>% mutate(cum=cumsum(y)/sum(y))

p1=ggplot(plot.dat, aes(x = x, y = cum, color=grp)) +geom_line()+ geom_hline(yintercept=.5, linetype="dashed", color = "black")

print(p1)

hline=data.frame(plot.dat %>% group_by(grp) %>% mutate(test=cum>0.49 & cum<0.51))#
print(hline[hline$test==T,])# only works when an exact value in the range exists

F1=approxfun(plot.dat$cum,plot.dat$x,ties=mean)
#data.frame(plot.dat %>% group_by(grp) %>% mutate(F1(0.50)))#works only on first group

g1b=plot.dat[plot.dat$grp=="1",]
F2=approxfun(g1b$cum,g1b$x)
F2(0.5)#works but inefficient

我有很多这样的图,我正在寻找最有效的方法来找到每个因子水平的水平线的 x 截距,以便可以将截距值相互比较并注释到图上。我认为有一种逻辑方法,但后来我意识到我需要插值,可能使用 approxfun。我还没有找到一种方法来做到这一点,而不会将组从数据框架中分离出来并一个一个地做......谢谢你让我直截了当。

标签: rggplot2

解决方案


这是使用 base::approx 的 dplyr 方法。

x_seq = seq(1, 50, by = 0.01)
intersections <- plot.dat %>%
  group_by(grp) %>%
  summarise(interpolated = approx(x = x, y = cum, xout = x_seq)$y) %>%
  mutate(x_seq = x_seq) %>%
  slice_min(abs(interpolated - 0.5))

ggplot(plot.dat, aes(x = x, y = cum, color=grp)) +
  geom_line() + 
  geom_hline(yintercept=.5, linetype="dashed", color = "black") +
  geom_point(data = intersections, aes(x_seq, interpolated), size = 3) +
  geom_text(data = intersections, aes(x_seq, interpolated, label = x_seq), vjust = -1)

在此处输入图像描述


推荐阅读