在ecdf线图上突出显示点

4
我正在使用ggplot和stat_ecdf函数创建频率图。我想在图表中为特定的X值添加Y值,但是我不知道如何做到。geom_point或geom_text似乎是可行的选择,但由于stat_ecdf自动计算Y值,我不知道如何在geom_point / text映射中调用该值。
我的初始绘图示例代码如下:
x = as.data.frame(rnorm(100))
ggplot(x, aes(x)) + 
stat_ecdf()

现在我该如何在这里添加特定的y-x点,例如,在x = -1时的y值。
2个回答

5

最简单的方法是预先使用stats包中的ecdf()函数创建ecdf函数,然后使用geom_label()绘制它。

library(ggplot2)
# create a data.frame with column name
x = data.frame(col1 = rnorm(100))
# create ecdf function
e = ecdf(x$col1)

# plot the result
ggplot(x, aes(col1)) + 
  stat_ecdf() +
  geom_label(aes(x = -1, y = e(-1)), 
             label = e(-1))

enter image description here


太好了,谢谢!这很有道理,看起来相当简单。现在将尝试在我的实际数据上执行。 - Gerard

3
您可以尝试:
library(tidyverse)
# data
set.seed(123)
df = data.frame(x=rnorm(100))
# Plot
Values <- c(-1,0.5,2) 
df %>% 
  mutate(gr=FALSE) %>% 
  bind_rows(data.frame(x=Values,gr=TRUE)) %>% 
  mutate(y=ecdf(x)(x)) %>%  
  mutate(xmin=min(x)) %>% 
  ggplot(aes(x, y)) +
   stat_ecdf() +
   geom_point(data=. %>% filter(gr), aes(x, y)) + 
   geom_segment(data=. %>% filter(gr),aes(y=y,x=xmin, xend=x,yend=y), color="red")+
   geom_segment(data=. %>% filter(gr),aes(y=0,x=x, xend=x,yend=y), color="red") +
   ggrepel::geom_label_repel(data=. %>% filter(gr), 
                             aes(x, y, label=paste("x=",round(x,2),"\ny=",round(y,2)))) 

在这里输入图片描述

这个想法是在开头添加y值,以及指定要显示哪些Values的索引gr

编辑:

由于此代码向实际数据添加点可能会对曲线造成错误影响,因此应该考虑在ecdf函数中至少删除这些点:stat_ecdf(data=. %>% filter(!gr))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接