2016-05-13 12 views
4
aktualisieren

Ich versuche, eine lineare Trendlinie zu einem Plotplot in einer glänzenden App hinzuzufügen. Wenn ich die Auswahlparameter ändere, sehe ich, dass sich die Koeffizienten des linearen Modells ändern (unter Verwendung observe(print(summary(l)). Jedoch scheint die tatsächliche Linie auf der Handlung an der gleichen Stelle zu bleiben.Plotly lineare Trendlinie nicht in glänzend

Hier ist ein Diagramm, wo die Trendlinie bei scheint dest in der Nähe der beiden Punkte zu schneidenden: enter image description here

In einem anderen Grundstück, ist die Trendlinie bei weitem nicht dem ersten Punktes: enter image description here

hier ein minimales Arbeitsbeispiel ist:

library(dplyr) 
library(shiny) 
library(plotly) 

df <- as.data.frame(list("UserID"=c(1,1,1,1,2,2,2,2), 
          "QuestionID"=c(4,4,5,5,4,4,6,6), 
          "KeystrokeRate"=c(8,4,6,15,8,6,7,8), 
          "cumul.ans.keystroke"=c(1,7,1,5,1,14,1,9), 
       "Relative.Time.Progress"=c(0.1,1.0,0.4,1.0,0.8,1.0,0.8,1.0) 
        )) 

ui <- (fluidPage(
    sidebarLayout(
    sidebarPanel(
     selectInput("userInput","Select User", sort(unique(df$UserID)), 
        selected = sort(unique(df$UserID))[1]), 
     uiOutput("answerOutput")#, 
    ), 

    mainPanel(
     plotlyOutput("mainPlot")#, 
    ) 
) 
)) 

server <- function(input, output, session) { 

    # filter only based on selected user 
    filteredForUser <- reactive({ 
    try(
     df %>% 
     filter(
      UserID == input$userInput 
     ), silent=T) 
    }) 

    # filter for both user and answer 
    filteredFull <- reactive({ 
    try (
     df %>% 
     filter(
      UserID == input$userInput, 
      QuestionID == input$answerInput 
     ), silent=T) 
    }) 

    # filter answer choices based on user 
    output$answerOutput <- renderUI({ 
    df.u <- filteredForUser() 
    if(!is.null(df)) { 
     selectInput("answerInput", "Select A Typing Session", 
        sort(unique(df.u$QuestionID))) 
    } 
    }) 

    output$mainPlot <- renderPlotly({ 

    if (class(filteredForUser()) == "try-error" || 
     class(filteredFull()) == "try-error") { 
     return(geom_blank()) 
    } else { 
     # plot scatter points and add trend lines 
     p <- plot_ly(filteredFull(), x=Relative.Time.Progress, y=cumul.ans.keystroke, 
         mode='markers', color=KeystrokeRate, size=KeystrokeRate, 
         marker=list(sizeref=100), type='scatter') 
     l <- lm(cumul.ans.keystroke ~ Relative.Time.Progress, 
        data=filteredFull()) 
     observe(print(summary(l))) 
      p <- add_trace(p, y= fitted(l)) 
      p 
    } 
    })  
} 

shinyApp(ui, server) 

Antwort

2

Das Problem ist mit der add_trace Funktionalität. Sie müssen die X-Achse angeben, damit das Ergebnis lm korrekt dargestellt werden kann.

p <- add_trace(p, y = fitted(l), x = Relative.Time.Progress) 

Um das Problem klarer zu sehen, visualisieren Sie die Ergebnisse mit dem gesamten Datensatz.

p <- plot_ly(df, x=Relative.Time.Progress, y=cumul.ans.keystroke, 
      mode='markers', color=KeystrokeRate, size=KeystrokeRate, 
      marker=list(sizeref=100), type='scatter') 
p 

enter image description here

l <- lm(cumul.ans.keystroke ~ Relative.Time.Progress, 
     data=df) 
p <- add_trace(p, y = fitted(l)) 
p 

enter image description here

p <- plot_ly(df, x=Relative.Time.Progress, y=cumul.ans.keystroke, 
      mode='markers', color=KeystrokeRate, size=KeystrokeRate, 
      marker=list(sizeref=100), type='scatter') 
l <- lm(cumul.ans.keystroke ~ Relative.Time.Progress, 
     data=df) 
p <- add_trace(p, y = fitted(l), x = Relative.Time.Progress) 
p 

enter image description here

So wie Sie sehen würden, add_trace wurde die fitted(y) richtig aufgetragen, aber unter Verwendung der x-Achse c(0:7) zu sein . Ich nehme an, es ist ein Standard, der an add_trace übergeben wurde, aber ich habe das "Warum" nicht gründlich untersucht. Der Datensatz df hat acht Punkte. Sie mussten stattdessen die tatsächlichen Werte Relative.Time.Progress auf der x-Achse eingeben, um die fitted(y) w.r.t. tatsächliche x Werte. Hoffe das klärt auf.

+0

Ahh, danke! Also was genau macht es, indem man die X-Achse hinzufügt? –

+1

Bearbeitete die Antwort, dauerte eine Weile, um es herauszufinden, da es das erste Mal ist, dass ich mit 'plotly()' arbeite. Ich dachte, es wäre ein "glänzendes" Thema. – Divi

+0

Danke für die Klarstellung! Macht Sinn. Plotly braucht wirklich eine bessere Dokumentation! –