如何让用户在散点图上手动画一条线,并在R中使用shiny和I或plotly打印斜率和截距?

jrcvhitl  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(124)

我第一次问,所以请裸露与我!我试图得到斜率和截距时,用户手动绘制一条线的散点图。
我尝试使用layout(dragmode = 'drawline'),但它不起作用。相反,我使用layout(dragmode = 'select'),它可以获得斜率和截距。但不允许用户画线。
我是这么试的

library(shiny)
library(plotly)

ui <- fluidPage(
  plotlyOutput("plot"),
  verbatimTextOutput("output")
)

server <- function(input, output) {
  output$plot <- renderPlotly({
    plot_ly(mtcars, x = ~wt, y = ~mpg) %>%
      add_markers() %>%
      layout(dragmode = "select")
  })
  
  output$output <- renderPrint({
    d <- event_data("plotly_selected")
    if (is.null(d)) "Select a region by clicking and dragging on the scatter plot"
    else {
      x <- d$x
      y <- d$y
      coef(lm(y ~ x))
    }
  })
}

shinyApp(ui, server)

任何帮助,建议或不同的方式来做它将不胜感激!
我试图让一条线正在绘制的用户('手动'),并得到斜率和截距打印。

enyaitl3

enyaitl31#

有很多种方法可以做到这一点,在我的代码中,我保留了你所要求的输出,斜率和截距都是按字面意思表示的,另外,我添加了最佳拟合线红色。
我还在代码中添加了一些注解来解释代码的用途,因为它实际上只是重新安排您已经编写的内容,所以应该相当简单。
目前,该最佳拟合线只会扩展选定数据点的大小,但它可以扩展到整个图表。如果我遗漏了什么,或者您在看到此内容后想到了什么,请告诉我。

library(shiny)
library(plotly)

ui <- fluidPage(
  plotlyOutput("plot"),
  verbatimTextOutput("output")
)

server <- function(input, output) {
  output$plot <- renderPlotly({
    d <- event_data("plotly_selected") # make event data available within render
    if(!is.null(d)) {
      x <- d$x
      y <- d$y
      coefs <- coef(lm(y~x))
    }
    
    plt <- plot_ly(mtcars, x = ~wt, y = ~mpg, name = "Points") %>%
      add_markers() %>%
      layout(dragmode = "select") 
    
    if (!is.null(d)) {           # if there's been a selection
      plt <- plt %>% 
        add_lines(data = data.frame(x = x,           # add line based on selection
                                    y = coefs[2] * x + coefs[1]), # mx + b
                  x = ~x, y = ~y, color = "red", name = "Line of<br>Fit")
    }
    plt                          # send plot to output
  })
  
  output$output <- renderPrint({
    d <- event_data("plotly_selected")
    if (is.null(d)) "Select a region by clicking and dragging on the scatter plot"
    else {
      x <- d$x
      y <- d$y
      coef(lm(y ~ x))
    }
  })
}

shinyApp(ui, server)

顺便说一句,对于你的第一个问题-这是太棒了!

相关问题