2017-02-20 66 views
0

我想在R中的plot_ly()周围编写一个自定义函数。这样,​​我可以使用一系列散点图相同的格式和样式,但不重复的代码。 I used this page as a guide.此代码再现错误:使用add_lines()拟合(lm(y〜x))的plot_ly()附近的自定义R函数

library(plotly) 
my_plot <- function(x, y, ...) { 
    require(broom) 
    plot_ly(data = mtcars, y = y, x = x, showlegend = FALSE, ...) %>% 
    add_markers(y = y) %>% 
    add_lines(y = ~fitted(lm(y ~ x))) %>% 
    add_ribbons(data = augment(lm(y ~ x, data = mtcars)), 
       ymin = ~.fitted - 1.96 * .se.fit, 
       ymax = ~.fitted + 1.96 * .se.fit, 
       line = list(color = 'rgba(7, 164, 181, 0.05)'), 
       fillcolor = 'rgba(7, 164, 181, 0.2)', 
       name = "Standard Error") 
} 
my_plot(y = ~mpg, x = ~disp) 

问题行是:

add_lines(y = ~fitted(lm(y ~ x))) %>% 

我尝试使用as.formula(),但该错误消息是类似的。

add_lines(y = ~fitted(lm(as.formula("y ~ x"))) %>% 

以下是错误消息:

Error in model.frame.default(formula = y ~ x, data = mtcars, drop.unused.levels = TRUE) : object is not a matrix

代码工作时,它不是一个功能:

library(plotly) 
library(broom) 
plot_ly(data = mtcars, y = ~mpg, x = ~disp, showlegend = FALSE) %>% 
    add_markers(y = ~mpg) %>% 
    add_lines(y = ~fitted(lm(mpg ~ disp))) %>% 
    add_ribbons(data = augment(lm(mpg ~ disp, data = mtcars)), 
      ymin = ~.fitted - 1.96 * .se.fit, 
      ymax = ~.fitted + 1.96 * .se.fit, 
      line = list(color = 'rgba(7, 164, 181, 0.05)'), 
      fillcolor = 'rgba(7, 164, 181, 0.2)', 
      name = "Standard Error") 

回答

0

可能性之一是通过这两个数据框和列名字到你的功能,例如

library(plotly) 

my_plot <- function(data, x, y, ...) { 
    require(broom) 
    plot_ly(y = data[[y]], x = data[[x]], showlegend = FALSE, ...) %>% 
    add_markers(y = data[[y]]) %>% 
    add_lines(y = ~fitted(lm(data[[y]] ~ data[[x]]))) %>% 
    add_ribbons(data = augment(lm(data[[y]] ~ data[[x]])), 
       ymin = ~.fitted - 1.96 * .se.fit, 
       ymax = ~.fitted + 1.96 * .se.fit, 
       line = list(color = 'rgba(7, 164, 181, 0.05)'), 
       fillcolor = 'rgba(7, 164, 181, 0.2)', 
       name = "Standard Error") 
} 
my_plot(data = mtcars, y = 'mpg', x = 'disp') 

或只是列本身。

library(plotly) 

my_plot <- function(x, y, ...) { 
    require(broom) 
    plot_ly(y = y, x = x, showlegend = FALSE, ...) %>% 
    add_markers(y = y) %>% 
    add_lines(y = ~fitted(lm(y ~ x))) %>% 
    add_ribbons(data = augment(lm(y ~ x)), 
       ymin = ~.fitted - 1.96 * .se.fit, 
       ymax = ~.fitted + 1.96 * .se.fit, 
       line = list(color = 'rgba(7, 164, 181, 0.05)'), 
       fillcolor = 'rgba(7, 164, 181, 0.2)', 
       name = "Standard Error") 
} 
my_plot(y = mtcars$mpg, x = mtcars$disp)