r - 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。我还没有找到一种方法来做到这一点,而不会将组从数据框架中分离出来并一个一个地做......谢谢你让我直截了当。
解决方案
这是使用 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)
推荐阅读
- sql - 为什么在 mdb 中搜索 unicode 文本时会抛出 OleDbException?如何搜索 unicode 文本?
- linux - 拆分排序文件而不切割块
- python - Apple 使用 rest-social-auth Python 库的 Redirect_uri 问题
- firebase - 尝试从 Firebase FireStore 文档中检索数据时出错
- docker - Docker 离线时的 GCP 日志
- javascript - 如果不单击多次,React 提交表单按钮将不起作用
- powershell - PowerShell 和 WinSCP 脚本检查 SFTP 远程目录中是否有超过 4 个文件
- reactjs - 添加 Onchange 时,MUI TextField 会破坏验证模式
- python-3.x - XML容错漂亮打印Python3
- google-bigquery - 在 BigQuery 中批量删除数据传输