library(sunburstR) library(pitchRx) library(dplyr)
dat <- scrape(start = "2016-08-25", end = "2016-08-25")
# use runner data to get idea of action with a runner on base # please note this will not be all action from a game # but I think it is an easier dataset to understand action <- dat$runner %>% group_by(event_num) %>% filter(row_number() == 1) %>% ungroup() %>% group_by(gameday_link, inning, inning_side) %>% summarize(event = paste(c(event),collapse="-")) sequences <- action %>% ungroup() %>% group_by(event) %>% summarize(count = n()) # sorry this is messy, but get data in a form # so sunburst can build hierarchy # which means we will sort in descending order of depth # note: this will eventually improve sequences$depth <- unlist(lapply(strsplit(sequences$event,"-"),length))
sb <- sequences %>% arrange(desc(depth), event) %>% sunburst() sb
In this commit, we added some basic event dispatch to sunburstR
that can be used in Shiny and non-Shiny contexts. We will use it to display a link to the games that fit the hovered paths.
# use sunburst event handling to provide games for hovered sequence library(htmltools) sb$x$tasks <- list(htmlwidgets::JS( ' function(){ debugger; var chart = this.instance.chart; chart.on("mouseover",mouseovered); } ' )) sb$height = 400 sb$width = 600 tagList( sb, tags$div(id="games", style="margin-top:100px"), tags$script(HTML( sprintf( ' var action = %s; function mouseovered(d){ var thiz = this; var games = action.filter(function(evt){ return evt.event === thiz.join("-"); }); var div = document.getElementById("games"); div.innerHTML = games.map(function(game){ return [ "<a href=\'http://gd2.mlb.com/components/game/mlb/year_2016/month_08/day_25/", game.gameday_link, "\'>", game.gameday_link, "</a><br/>" ].join(""); }).join("\\n"); } ', jsonlite::toJSON(action, auto_unbox=TRUE, dataframe="row") ) )) )
Dan Malter wrote a fantastic post Using Markov Chains to Predict Pitches. Let's visualize his pitch data for Jake Arrieta.
# pitch sequence data from Markov Chain # http://danmalter.github.io/r/2016/03/28/Markov-chains.html library(sunburstR) library(rvest) library(stringr) library(tidyr) library(dplyr) # get table from post to avoid having to run all the code ht <- read_html("http://danmalter.github.io/r/2016/03/28/Markov-chains.html") # get pitch type as proportion of total pitches ht_pitch_arrieta <- html_table( xml_find_first(ht,'//*[@id="jake-arrieta---overall-pitch-proportions"]/table') ) # get markov table for pitch and following pitch ht_tbl_arrieta <- html_text( xml_find_all(ht,'//*[@id="jake-arrieta---multi-class-markov-chain"]/pre/code')[2] ) ht_tbl_arrieta <- str_replace_all( ht_tbl_arrieta, c("4-seam FB"="4seamFB", "Int. Ball"="IntBall") ) tbl <- read.table( textConnection(ht_tbl_arrieta), skip=2, header=FALSE, stringsAsFactors=FALSE ) colnames(tbl) <- c("pitch",tbl[,1]) # multiple by pct of total tbl[,-1] <- tbl[,-1] * t(ht_pitch_arrieta) tbl_long <- gather(tbl, key=pitch2, value=value, -pitch)
tbl_long %>% mutate(path = paste(pitch,pitch2,sep="-")) %>% select(path, value) %>% sunburst()
Thanks so much to Kerry Rodden who provided the original sunburst on which this is based.
Thanks Mike Bostock for d3.js (please give us a way to pay you).
Thanks Tim Holman for the great github-corners.
Thanks skeleton.
Thanks Carson Sievert for pitchRx
and all your work on plotly
.
Thanks Dan Malter for the great markov pitch post.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.