在glineplot2上的绘图点平滑vline交叉点上的回归

时间:2016-11-11 13:25:17

标签: r ggplot2

我想在4000万个数据点中创建一个(时间序列)图,以显示两条回归线,每条回归线上有两个特定事件(首次出现时间序列中的最佳值)。 目前,我绘制回归线并向其添加geom_vline以指示事件。

由于我想独立于绘图中的颜色,如果我可以将标记geom_vline绘制为回归线上的一个点,那将是有益的。

你知道怎么用ggplot2解决这个问题吗?

我目前的方法是这里(用测试数据替换数据点):

library(ggplot2)

# Generate data
m1 <- "method 1"
m2 <- "method 2"
data1 <- data.frame(Time=seq(100), Value=sample(1000, size=100), Type=rep(as.factor(m1), 100))
data2 <- data.frame(Time=seq(100), Value=sample(1000, size=100), Type=rep(as.factor(m2), 100))
df <- rbind(data1, data2)
rm(data1, data2)

# Calculate first minima for each Type
m1_intercept <- df[which(df$Type == m1), ][which.min(df[which(df$Type == m1), ]$Value),]
m2_intercept <- df[which(df$Type == m2), ][which.min(df[which(df$Type == m2), ]$Value),]

# Plot regression and vertical lines
p1 <- ggplot(df, aes(x=Time, y=Value, group=Type, colour=Type), linetype=Type) + 
    geom_smooth(se=F) + 
    geom_vline(aes(xintercept=m1_intercept$Time, linetype=m1_intercept$Type)) + 
    geom_vline(aes(xintercept=m2_intercept$Time, linetype=m2_intercept$Type)) + 
    scale_linetype_manual(name="", values=c("dotted", "dashed")) + 
    guides(colour=guide_legend(title="Regression"), linetype=guide_legend(title="First occurrence of optimum")) + 
    theme(legend.position="bottom")
ggsave("regression.png", plot=p1, height=5, width=7)

生成此图: Generated plot

我想要的情节是这样的: Desired plot

所以我的问题是

  1. 在回归线上指出最小值是否有意义? y轴位置的值实际上是错误的,只是为了表示时间点?
  2. 如果是,我该如何实现这种行为?
  3. 如果不是,你认为会有什么更好的?
  4. 非常感谢您提前! 罗宾

1 个答案:

答案 0 :(得分:1)

如果您首次仅使用ggplot()运行geom_smooth()来电,则可以通过ggplot_build()访问绘制的值,然后我们可以使用这些值绘制两条拟合线上的点。例如:

# Create initial plot
p1<-ggplot(df, aes(x=Time, y=Value, colour=Type)) + 
  geom_smooth(se=F)

# Now we can access the fitted values
smooths <- ggplot_build(p1)$data[[1]]
smooths_1 <- smooths[smooths$group==1,] # First group (method 1)
smooths_2 <- smooths[smooths$group==2,] # Second group (method 2)

# Then we find the closest plotted values to the minima
smooth_1_x <- smooths_1$x[which.min(abs(smooths_1$x - m1_intercept$Time))] 
smooth_2_x <- smooths_2$x[which.min(abs(smooths_2$x - m2_intercept$Time))]  

# Subset the previously defined datasets for respective closest values
point_data1 <- smooths_1[smooths_1$x==smooth_1_x,]
point_data2 <- smooths_1[smooths_2$x==smooth_2_x,]

现在我们使用point_data1point_data2将积分放在你的情节上:

ggplot(df, aes(x=Time, y=Value, colour=Type)) + 
  geom_smooth(se=F) + 
  geom_point(data=point_data1, aes(x=x, y=y), colour = "red",size = 5) + 
  geom_point(data=point_data2, aes(x=x, y=y), colour = "red", size = 5)

enter image description here

要重现此图,您可以使用set.seed(42)进行数据生成步骤。