2015-07-04 86 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」)謝謝! –