A graphTV clone
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
2.9KB

  1. library(tidyverse)
  2. library(plotly)
  3. ui <- fluidPage(
  4. inputPanel(width = "20%", height = "100%",
  5. textInput("show_search", "Search show"),
  6. uiOutput("show_choice")
  7. ),
  8. plotlyOutput("show_graph", width = "100%", height = "800px")
  9. )
  10. server <- function(input, output, session)
  11. {
  12. shows <- eventReactive(input$show_search, {
  13. if(str_length(input$show_search) > 3)
  14. {
  15. src_sqlite("im.db") %>%
  16. tbl(sql(str_c("select tconst, primaryTitle from basics where titleType == 'tvSeries' and primaryTitle like '%", input$show_search, "%'"))) %>%
  17. collect -> res
  18. res$tconst %>%
  19. as.list %>%
  20. setNames(res$primaryTitle)
  21. }
  22. })
  23. output$show_choice <- renderUI({
  24. req(shows())
  25. selectizeInput("show", "Please choose…", shows())
  26. })
  27. output$show_graph <- renderPlotly({
  28. req(input$show)
  29. show_id <- input$show
  30. src_sqlite("im.db") %>%
  31. tbl("episodes") %>%
  32. filter(parentTconst == show_id) %>%
  33. select(-parentTconst) %>%
  34. collect -> episodes
  35. src_sqlite("im.db") %>%
  36. tbl("basics") %>%
  37. filter(tconst %in% episodes$tconst) %>%
  38. collect -> titles
  39. src_sqlite("im.db") %>%
  40. tbl("ratings") %>%
  41. filter(tconst %in% episodes$tconst) %>%
  42. collect -> ratings
  43. episodes %>%
  44. left_join(titles) %>%
  45. left_join(ratings) %>%
  46. select(-tconst, -titleType) %>%
  47. mutate_at(vars(seasonNumber, episodeNumber, averageRating, numVotes), as.numeric) %>%
  48. filter(!is.na(numVotes)) -> eps
  49. eps %>%
  50. by(.$seasonNumber, function(x){
  51. fit <- lm(averageRating ~ episodeNumber, data = x)
  52. x %>%
  53. plot_ly(hoverinfo = "text",
  54. text = ~str_c("S", seasonNumber, "E", episodeNumber, " - ", primaryTitle, "<br>",
  55. "Rating: ", averageRating, " (", numVotes, " votes)<br>")) %>%
  56. add_trace(data = x, x = ~episodeNumber, y = ~averageRating, mode = "markers") %>%
  57. add_trace(data = x, x = ~episodeNumber, y = fitted(fit), mode = "lines") %>%
  58. layout(xaxis = list(tick0 = 0, dtick = 1),
  59. yaxis = list(title = "Rating"))
  60. }) %>%
  61. subplot(shareY = T, nrows = 1, margin = 0) %>%
  62. hide_legend
  63. # eps %>%
  64. # arrange(seasonNumber, episodeNumber) %>%
  65. # add_rownames(var = "ep") %>%
  66. # mutate(ep = ep %>% as.numeric, seasonNumber = seasonNumber %>% as.factor) %>%
  67. # ggplot() +
  68. # aes(x = ep, y = averageRating, group = seasonNumber) +
  69. # geom_point(aes(text = primaryTitle)) +
  70. # geom_smooth(method = "lm") +
  71. # xlab("Episode") +
  72. # ylab("Rating")
  73. })
  74. }
  75. shinyApp(ui = ui, server = server)