使用分面在ggplot中绘制垂直线

时间:2020-12-21 18:25:28

标签: r ggplot2

我有 y 与 x 的线图。 y 是 sigmoid,从 0 到 1 变化。

  1. 确定 x 的值,其中 y = 0.5 或通过插值非常接近。
  2. 在 x 处绘制垂直线,其中 y = 0.5
library(tidyverse)

# continuous variables
x <- seq(-5, 5, 0.1)

# compute y1
error_term <- runif(1, min = -2, max = 2)
y1 <- 1/(1 + exp(-x + error_term))

# compute y2
error_term <- runif(1, min = -2, max = 2)
y2 <- 1/(1 + exp(-x + error_term))

# merge y
y <- c(y1, y2)
x <- c(x, x)
# categorical variable
a <- c(rep(0, 101), rep(1, 101))

tbl <- tibble(x, a, y)

# TASK
# 1. determine values of x at which y = 0.5 for all categories and store them in variable x0
# 2. Use x0 to draw vertical lines in plots at x where y is 0.5

# ggplot
ggplot(data = tbl,
       aes(x = x,
           y = y)) + 
  geom_line() + 
  theme_bw() +
  facet_grid(a ~ .)

1 个答案:

答案 0 :(得分:1)

这真的不是 ggplot 内置的东西,所以你需要在绘图之前自己总结数据。您可以编写一个辅助函数,然后为这些行创建所需的数据

find_intersect <- function(x,y, target=0.5) {
  optimize(function(z) (approxfun(x,y)(z)-target)^2, x)$minimum
}
line_data <- tbl %>% 
  group_by(a) %>% 
  summarize(xint=find_intersect(x,y))

然后用

绘图
ggplot(data = tbl,
       aes(x = x,
           y = y)) + 
  geom_line() + 
  theme_bw() +
  geom_vline(aes(xintercept=xint), data=line_data) + 
  facet_grid(a ~ .)

enter image description here