2015-07-04 55 views
-1
data <- dput(data): structure(list(x = 1:16, y = c(-79.62962963, -84.72222222, -88.42592593, -74.07407407, -29.62962963, 51.38888889, 79.62962963, 96.2962963, 87.96296296, 88.42592593, 73.14814815, 12.96296296, -63.42592593, -87.03703704, -87.5, -87.96296296)), .Names = c("x", "y"), row.names = c(NA, 16L), class = "data.frame") 

我中的R计算与GGPLOT2平滑线为我的数据集:计算x值

p1 <- ggplot(data, aes(x=x(°), y=(%))) 

library(splines) 
library(MASS) 
(p2 <- p1 + stat_smooth(method = "lm", formula = y ~ ns(x,3)) + 
    geom_point() 
) 

如何可以计算的x值平滑线的曲线最大值?

回答

6

你需要做一些数学上的计算stat_smooth产生的data.frame:

library(ggplot2) 
library(splines) 
library(MASS) 

data <- structure(list(x = 1:16, 
         y = c(-79.62962963, -84.72222222, -88.42592593, 
          -74.07407407, -29.62962963, 51.38888889, 
          79.62962963, 96.2962963, 87.96296296, 
          88.42592593, 73.14814815, 12.96296296, 
          -63.42592593, -87.03703704, -87.5, 
          -87.96296296)), .Names = c("x", "y"), 
        row.names = c(NA, 16L), class = "data.frame") 

p1 <- ggplot(data, aes(x=x, y=y)) 
p1 <- p1 + stat_smooth(method = "lm", formula = y ~ ns(x,3)) 
p1 <- p1 + geom_point() 
p1 

enter image description here

gb <- ggplot_build(p1) 

exact_x_value_of_the_curve_maximum <- gb$data[[1]]$x[which(diff(sign(diff(gb$data[[1]]$y)))==-2)+1] 

p1 + geom_vline(xintercept=exact_x_value_of_the_curve_maximum) 

exact_x_value_of_the_curve_maximum 
[1] 9.164557 

enter image description here

more robust ways为好,但你仍然需要ggplot_build部分来获取数据。

+0

非常感谢您的帮助! 我的数据中的一个案例在x轴上只能有16个值中的一个(1,2,3,...,16)。 不幸的是,它在我的数据中不起作用:我在图上接收了几条垂直线(而不是最多一条),它们总是在我的x值上(例如x = 3)。什么地方出了错? 如何让控制台输出曲线最大值的x值? –

+0

你能提供一个'dput(data)'吗? – hrbrmstr

+0

使用我的数据和上面描述的代码,我得到了x值为8和10时的两条曲线最大值。然而,拟合线的最大值不在这两个值中的任何一个。我如何画出合适的线? dput(数据):结构(列表(x = 1:16,Y = C(-79.62962963,-84.72222222,-88.42592593, -74.07407407,-29.62962963,51.38888889,79.62962963,96.2962963, 87.96296296,88.42592593,73.14814815,12.96296296, -63.42592593, -87.03703704,-87.5,-87.96296296)),.Names = c(“x”,“y”),row.names = c(NA, 16L),class =“data.frame”)谢谢! –