1<!DOCTYPE html> 2<html lang="en"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1"> 6<title>Building a Shot-Plotting App in Shiny | Hockey Graphs</title> 7<link rel="profile" href="http://gmpg.org/xfn/11"> 8<link rel="pingback" href="https://hockey-graphs.com/xmlrpc.php"> 9 10<meta name='robots' content='max-image-preview:large' /> 11 12<!-- Async WordPress.com Remote Login -->
13<script id="wpcom_remote_login_js"> 14var wpcom_remote_login_extra_auth = ''; 15function wpcom_remote_login_remove_dom_node_id( element_id ) { 16 var dom_node = document.getElementById( element_id ); 17 if ( dom_node ) { dom_node.parentNode.removeChild( dom_node ); } 18} 19function wpcom_remote_login_remove_dom_node_classes( class_name ) { 20 var dom_nodes = document.querySelectorAll( '.' + class_name ); 21 for ( var i = 0; i < dom_nodes.length; i++ ) { 22 dom_nodes[ i ].parentNode.removeChild( dom_nodes[ i ] ); 23 } 24} 25function wpcom_remote_login_final_cleanup() { 26 wpcom_remote_login_remove_dom_node_classes( "wpcom_remote_login_msg" ); 27 wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); 28 wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_validate" ); 29 wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_js" ); 30 wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_iframe" ); 31 wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_styles" ); 32} 33 34// Watch for messages back from the remote login 35window.addEventListener( "message", function( e ) { 36 if ( e.origin === "https://r-login.wordpress.com" ) { 37 var data = {}; 38 try { 39 data = JSON.parse( e.data ); 40 } catch( e ) { 41 wpcom_remote_login_final_cleanup(); 42 return; 43 } 44 45 if ( data.msg === 'LOGIN' ) { 46 // Clean up the login check iframe 47 wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); 48 49 var id_regex = new RegExp( /^[0-9]+$/ ); 50 var token_regex = new RegExp( /^.*|.*|.*$/ ); 51 if ( 52 token_regex.test( data.token ) 53 && id_regex.test( data.wpcomid ) 54 ) { 55 // We have everything we need to ask for a login 56 var script = document.createElement( "script" ); 57 script.setAttribute( "id", "wpcom_remote_login_validate" ); 58 script.src = '/remote-login.php?wpcom_remote_login=validate' 59 + '&wpcomid=' + data.wpcomid 60 + '&token=' + encodeURIComponent( data.token ) 61 + '&host=' + window.location.protocol 62 + '//' + window.location.hostname 63 + '&postid=24592' 64 + '&is_singular=1'; 65 document.body.appendChild( script ); 66 } 67 68 return; 69 } 70 71 // Safari ITP, not logged in, so redirect 72 if ( data.msg === 'LOGIN-REDIRECT' ) { 73 window.location = 'https://wordpress.com/log-in?redirect_to=' + window.location.href; 74 return; 75 } 76 77 // Safari ITP, storage access failed, remove the request 78 if ( data.msg === 'LOGIN-REMOVE' ) { 79 var css_zap = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } @media screen and ( max-width: 782px ) { html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } }'; 80 var style_zap = document.createElement( 'style' ); 81 style_zap.type = 'text/css'; 82 style_zap.appendChild( document.createTextNode( css_zap ) ); 83 document.body.appendChild( style_zap ); 84 85 var e = document.getElementById( 'wpcom_request_access_iframe' ); 86 e.parentNode.removeChild( e ); 87 88 document.cookie = 'wordpress_com_login_access=denied; path=/; max-age=31536000'; 89 90 return; 91 } 92 93 // Safari ITP 94 if ( data.msg === 'REQUEST_ACCESS' ) { 95 console.log( 'request access: safari' ); 96 97 // Check ITP iframe enable/disable knob 98 if ( wpcom_remote_login_extra_auth !== 'safari_itp_iframe' ) { 99 return; 100 } 101 102 // If we are in a "private window" there is no ITP. 103 var private_window = false; 104 try { 105 var opendb = window.openDatabase( null, null, null, null ); 106 } catch( e ) { 107 private_window = true; 108 } 109 110 if ( private_window ) { 111 console.log( 'private window' ); 112 return; 113 } 114 115 var iframe = document.createElement( 'iframe' ); 116 iframe.id = 'wpcom_request_access_iframe'; 117 iframe.setAttribute( 'scrolling', 'no' ); 118 iframe.setAttribute( 'sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-top-navigation-by-user-activation' ); 119 iframe.src = 'https://r-login.wordpress.com/remote-login.php?wpcom_remote_login=request_access&origin=' + encodeURIComponent( data.origin ) + '&wpcomid=' + encodeURIComponent( data.wpcomid ); 120 121 var css = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } @media screen and ( max-width: 660px ) { html { margin-top: 71px !important; } * html body { margin-top: 71px !important; } #wpcom_request_access_iframe { display: block; height: 71px !important; } } #wpcom_request_access_iframe { border: 0px; height: 46px; position: fixed; top: 0; left: 0; width: 100%; min-width: 100%; z-index: 99999; background: #23282d; } '; 122 123 var style = document.createElement( 'style' ); 124 style.type = 'text/css'; 125 style.id = 'wpcom_request_access_styles'; 126 style.appendChild( document.createTextNode( css ) ); 127 document.body.appendChild( style ); 128 129 document.body.appendChild( iframe ); 130 } 131 132 if ( data.msg === 'DONE' ) { 133 wpcom_remote_login_final_cleanup(); 134 } 135 } 136}, false ); 137 138// Inject the remote login iframe after the page has had a chance to load 139// more critical resources 140window.addEventListener( "DOMContentLoaded", function( e ) { 141 var iframe = document.createElement( "iframe" );
142 iframe.style.display = "none"; 143 iframe.setAttribute( "scrolling", "no" ); 144 iframe.setAttribute( "id", "wpcom_remote_login_key" ); 145 iframe.src = "https://r-login.wordpress.com/remote-login.php" 146 + "?wpcom_remote_login=key" 147 + "&origin=aHR0cHM6Ly9ob2NrZXktZ3JhcGhzLmNvbQ%3D%3D" 148 + "&wpcomid=61874218" 149 + "&time=" + Math.floor( Date.now() / 1000 ); 150 document.body.appendChild( iframe ); 151}, false ); 152</script>
152 153<link rel='dns-prefetch' href='//s1.wp.com' /> 154<link rel='dns-prefetch' href='//s2.wp.com' /> 155<link rel='dns-prefetch' href='//widgets.wp.com' /> 156<link rel='dns-prefetch' href='//fonts-api.wp.com' /> 157<link rel='dns-prefetch' href='//s0.wp.com' /> 158<link rel='dns-prefetch' href='//af.pubmine.com' /> 159<link rel="alternate" type="application/rss+xml" title="Hockey Graphs » Feed" href="https://hockey-graphs.com/feed/" /> 160<link rel="alternate" type="application/rss+xml" title="Hockey Graphs » Comments Feed" href="https://hockey-graphs.com/comments/feed/" /> 161<link rel="alternate" type="application/rss+xml" title="Hockey Graphs » Building a Shot-Plotting App in Shiny Comments Feed" href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/feed/" /> 162
162<script type="text/javascript"> 163 /* <![CDATA[ */ 164 function addLoadEvent(func) { 165 var oldonload = window.onload; 166 if (typeof window.onload != 'function') { 167 window.onload = func; 168 } else { 169 window.onload = function () { 170 oldonload(); 171 func(); 172 } 173 } 174 } 175 /* ]]> */ 176 </script>
176 177 <style id="wp-img-auto-sizes-contain-inline-css"> 178img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 179/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 180</style> 181<link crossorigin='anonymous' rel='stylesheet' id='all-css-2-1' href='/_static/??/wp-content/mu-plugins/widgets/eu-cookie-law/templates/style.css,/wp-content/mu-plugins/likes/jetpack-likes.css?m=1743883414j&cssminify=yes' type='text/css' media='all' /> 182<style id="wp-emoji-styles-inline-css"> 183 184 img.wp-smiley, img.emoji { 185 display: inline !important; 186 border: none !important; 187 box-shadow: none !important; 188 height: 1em !important; 189 width: 1em !important; 190 margin: 0 0.07em !important; 191 vertical-align: -0.1em !important; 192 background: none !important; 193 padding: 0 !important; 194 } 195/*# sourceURL=wp-emoji-styles-inline-css */ 196</style> 197<style id="wp-block-library-inline-css"> 198:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
198--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}} 199 200/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/common.min.css */ 201</style> 202<style id="wp-block-image-inline-css"> 203.wp-block-image>a,.wp-block-image>figure>a{display:inline-block}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}@media not (prefers-reduced-motion){.wp-block-image img.hide{visibility:hidden}.wp-block-image img.show{animation:show-content-image .4s}}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull>a,.wp-block-image.alignwide>a{width:100%}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-image.is-style-circle-mask img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}:root :where(.wp-block-image.is-style-rounded img,.wp-block-image .is-style-rounded img){border-radius:9999px}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;backdrop-filter:blur(16px) saturate(180%);background-color:rgba(90,90,90,.25);border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;width:20px;z-index:100}@media not (prefers-reduced-motion){.wp-lightbox-container button{transition:opacity .2s ease}}.wp-lightbox-container button:focus-visible{outline:3px auto rgba(90,90,90,.25);outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:rgba(90,90,90,.25);border:none}.wp-lightbox-overlay{box-sizing:border-box;
203cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .wp-lightbox-close-button{align-items:center;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 4px;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .wp-lightbox-close-button:focus,.wp-lightbox-overlay .wp-lightbox-close-button:hover,.wp-lightbox-overlay .wp-lightbox-close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .wp-lightbox-close-button:has(.wp-lightbox-close-text:not([hidden])) .wp-lightbox-close-icon svg{height:1em;width:1em}.wp-lightbox-overlay .wp-lightbox-close-icon svg{display:block}.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{align-items:center;bottom:16px;cursor:pointer;display:flex;font-family:inherit;gap:4px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 8px;position:absolute;z-index:2000002}.wp-lightbox-overlay .wp-lightbox-navigation-button-next[hidden],.wp-lightbox-overlay .wp-lightbox-navigation-button-prev[hidden]{display:none}@media (min-width:960px){.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{bottom:50%;transform:translateY(-50%)}}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:not(:hover):not(:active):not(.has-background),.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:not(:hover):not(:active):not(.has-background){background:none;border:none;padding:0 8px}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg{display:block;height:1.5em;width:1.5em}.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{left:calc(env(safe-area-inset-left) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-button-next{right:calc(env(safe-area-inset-right) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-icon svg{vertical-align:middle}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:2000001}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{visibility:visible}@media not (prefers-reduced-motion){.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}
203@keyframes show-content-image{0%{visibility:hidden}99%{visibility:hidden}to{visibility:visible}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}} 204/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/image/style.min.css */ 205</style> 206<style id="wp-block-paragraph-inline-css"> 207.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:var(--wp--style--block-background-padding,1.25em 2.375em)}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg} 208/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/paragraph/style.min.css */ 209</style> 210<style id="wp-block-library-inline-css-extra"> 211.has-text-align-justify { 212 text-align:justify; 213} 214.has-text-align-justify{text-align:justify;} 215/*# sourceURL=wp-block-library-inline-css */ 216</style> 217 218<style id="classic-theme-styles-inline-css"> 219.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}.wp-block-accordion-heading{margin:0}.wp-block-accordion-heading__toggle{background-color:inherit!important;color:inherit!important}.wp-block-accordion-heading__toggle:not(:focus-visible){outline:none}.wp-block-accordion-heading__toggle:focus,.wp-block-accordion-heading__toggle:hover{background-color:inherit!important;border:none;box-shadow:none;color:inherit;padding:var(--wp--preset--spacing--20,1em) 0;text-decoration:none}.wp-block-accordion-heading__toggle:focus-visible{outline:auto;outline-offset:0}.wp-block-tab:not(.has-text-color){color:inherit!important}.wp-block-tab:not(.has-background){background-color:inherit!important}.wp-block-tab:focus,.wp-block-tab:hover{text-decoration:none}.wp-block-tab:focus-visible{outline:auto;outline-offset:0} 220/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/classic.min.css */ 221</style> 222 223<style id="coblocks-inline-format-inline-css"> 224.uppercase{text-transform:uppercase} 225/*# sourceURL=coblocks-inline-format-inline-css */ 226</style> 227<link crossorigin='anonymous' rel='stylesheet' id='all-css-12-1' href='/_static/??-eJx9jEEOAiEQBD/kQECjeDC+ZWEnijIwYWA3/l72op689KFTVXplCCU3zE1z6reYRYfiUwlP0VYZpwxIJE4IFRd10HOU9iFA2iuhCiI7/ROiDt9WxfETT20jCOc4YUIa2D9t5eGA91xRBMZS7ATtPkTZvCtdzNEZt7f2fHq8Afl7R7w=&cssminify=yes' type='text/css' media='all' /> 228<style id="global-styles-inline-css"> 229:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
2290) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-family--albert-sans: 'Albert Sans', sans-serif;--wp--preset--font-family--alegreya: Alegreya, serif;--wp--preset--font-family--arvo: Arvo, serif;--wp--preset--font-family--bodoni-moda: 'Bodoni Moda', serif;--wp--preset--font-family--bricolage-grotesque: 'Bricolage Grotesque', sans-serif;--wp--preset--font-family--cabin: Cabin, sans-serif;--wp--preset--font-family--chivo: Chivo, sans-serif;--wp--preset--font-family--commissioner: Commissioner, sans-serif;--wp--preset--font-family--cormorant: Cormorant, serif;--wp--preset--font-family--courier-prime: 'Courier Prime', monospace;--wp--preset--font-family--crimson-pro: 'Crimson Pro', serif;--wp--preset--font-family--dm-mono: 'DM Mono', monospace;--wp--preset--font-family--dm-sans: 'DM Sans', sans-serif;--wp--preset--font-family--dm-serif-display: 'DM Serif Display', serif;--wp--preset--font-family--domine: Domine, serif;--wp--preset--font-family--eb-garamond: 'EB Garamond', serif;--wp--preset--font-family--epilogue: Epilogue, sans-serif;--wp--preset--font-family--fahkwang: Fahkwang, sans-serif;--wp--preset--font-family--figtree: Figtree, sans-serif;--wp--preset--font-family--fira-sans: 'Fira Sans', sans-serif;--wp--preset--font-family--fjalla-one: 'Fjalla One', sans-serif;--wp--preset--font-family--fraunces: Fraunces, serif;--wp--preset--font-family--gabarito: Gabarito, system-ui;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--ibm-plex-sans: 'IBM Plex Sans', sans-serif;--wp--preset--font-family--ibarra-real-nova: 'Ibarra Real Nova', serif;--wp--preset--font-family--instrument-serif: 'Instrument Serif', serif;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--font-family--josefin-sans: 'Josefin Sans', sans-serif;--wp--preset--font-family--jost: Jost, sans-serif;--wp--preset--font-family--libre-baskerville: 'Libre Baskerville', serif;--wp--preset--font-family--libre-franklin: 'Libre Franklin', sans-serif;--wp--preset--font-family--literata: Literata, serif;--wp--preset--font-family--lora: Lora, serif;--wp--preset--font-family--merriweather: Merriweather, serif;--wp--preset--font-family--montserrat: Montserrat, sans-serif;--wp--preset--font-family--newsreader: Newsreader, serif;--wp--preset--font-family--noto-sans-mono: 'Noto Sans Mono', sans-serif;--wp--preset--font-family--nunito: Nunito, sans-serif;--wp--preset--font-family--open-sans: 'Open Sans', sans-serif;--wp--preset--font-family--overpass: Overpass, sans-serif;--wp--preset--font-family--pt-serif: 'PT Serif', serif;--wp--preset--font-family--petrona: Petrona, serif;--wp--preset--font-family--piazzolla: Piazzolla, serif;--wp--preset--font-family--playfair-display: 'Playfair Display', serif;--wp--preset--font-family--plus-jakarta-sans: 'Plus Jakarta Sans', sans-serif;--wp--preset--font-family--poppins: Poppins, sans-serif;--wp--preset--font-family--raleway: Raleway, sans-serif;--wp--preset--font-family--roboto: Roboto, sans-serif;--wp--preset--font-family--roboto-slab: 'Roboto Slab', serif;--wp--preset--font-family--rubik: Rubik, sans-serif;--wp--preset--font-family--rufina: Rufina, serif;--wp--preset--font-family--sora: Sora, sans-serif;--wp--preset--font-family--source-sans-3: 'Source Sans 3', sans-serif;--wp--preset--font-family--source-serif-4: 'Source Serif 4', serif;--wp--preset--font-family--space-mono: 'Space Mono', monospace;--wp--preset--font-family--syne: Syne, sans-serif;--wp--preset--font-family--texturina: Texturina, serif;--wp--preset--font-family--urbanist: Urbanist, sans-serif;--wp--preset--font-family--work-sans: 'Work Sans', sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
229.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-albert-sans-font-family{font-family: var(--wp--preset--font-family--albert-sans) !important;}.has-alegreya-font-family{font-family: var(--wp--preset--font-family--alegreya) !important;}.has-arvo-font-family{font-family: var(--wp--preset--font-family--arvo) !important;}.has-bodoni-moda-font-family{font-family: var(--wp--preset--font-family--bodoni-moda) !important;}.has-bricolage-grotesque-font-family{font-family: var(--wp--preset--font-family--bricolage-grotesque) !important;}.has-cabin-font-family{font-family: var(--wp--preset--font-family--cabin) !important;}.has-chivo-font-family{font-family: var(--wp--preset--font-family--chivo) !important;}.has-commissioner-font-family{font-family: var(--wp--preset--font-family--commissioner) !important;}.has-cormorant-font-family{font-family: var(--wp--preset--font-family--cormorant) !important;}.has-courier-prime-font-family{font-family: var(--wp--preset--font-family--courier-prime) !important;}.has-crimson-pro-font-family{font-family: var(--wp--preset--font-family--crimson-pro) !important;}.has-dm-mono-font-family{font-family: var(--wp--preset--font-family--dm-mono) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-domine-font-family{font-family: var(--wp--preset--font-family--domine) !important;}.has-eb-garamond-font-family{font-family: var(--wp--preset--font-family--eb-garamond) !important;}.has-epilogue-font-family{font-family: var(--wp--preset--font-family--epilogue) !important;}.has-fahkwang-font-family{font-family: var(--wp--preset--font-family--fahkwang) !important;}.has-figtree-font-family{font-family: var(--wp--preset--font-family--figtree) !important;}.has-fira-sans-font-family{font-family: var(--wp--preset--font-family--fira-sans) !important;}.has-fjalla-one-font-family{font-family: var(--wp--preset--font-family--fjalla-one) !important;}.has-fraunces-font-family{font-family: var(--wp--preset--font-family--fraunces) !important;}.has-gabarito-font-family{font-family: var(--wp--preset--font-family--gabarito) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-ibm-plex-sans-font-family{font-family: var(--wp--preset--font-family--ibm-plex-sans) !important;}.has-ibarra-real-nova-font-family{font-family: var(--wp--preset--font-family--ibarra-real-nova) !important;}.has-instrument-serif-font-family{font-family: var(--wp--preset--font-family--instrument-serif) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-josefin-sans-font-family{font-family: var(--wp--preset--font-family--josefin-sans) !important;}.has-jost-font-family{font-family: var(--wp--preset--font-family--jost) !important;}.has-libre-baskerville-font-family{font-family: var(--wp--preset--font-family--libre-baskerville) !important;}.has-libre-franklin-font-family{font-family: var(--wp--preset--font-family--libre-franklin) !important;}.has-literata-font-family{font-family: var(--wp--preset--font-family--literata) !important;}.has-lora-font-family{font-family: var(--wp--preset--font-family--lora) !important;}.has-merriweather-font-family{font-family: var(--wp--preset--font-family--merriweather) !important;}.has-montserrat-font-family{font-family: var(--wp--preset--font-family--montserrat) !important;}.has-newsreader-font-family{font-family: var(--wp--preset--font-family--newsreader) !important;}.has-noto-sans-mono-font-family{font-family: var(--wp--preset--font-family--noto-sans-mono) !important;}.has-nunito-font-family{font-family: var(--wp--preset--font-family--nunito) !important;}.has-open-sans-font-family{font-family: var(--wp--preset--font-family--open-sans) !important;}.has-overpass-font-family{font-family: var(--wp--preset--font-family--overpass) !important;}.has-pt-serif-font-family{font-family: var(--wp--preset--font-family--pt-serif) !important;}.has-petrona-font-family{font-family: var(--wp--preset--font-family--petrona) !important;}.has-piazzolla-font-family{font-family: var(--wp--preset--font-family--piazzolla) !important;}.has-playfair-display-font-family{font-family: var(--wp--preset--font-family--playfair-display) !important;}.has-plus-jakarta-sans-font-family{font-family: var(--wp--preset--font-family--plus-jakarta-sans) !important;}.has-poppins-font-family{font-family: var(--wp--preset--font-family--poppins) !important;}.has-raleway-font-family{font-family: var(--wp--preset--font-family--raleway) !important;}.has-roboto-font-family{font-family: var(--wp--preset--font-family--roboto) !important;}.has-roboto-slab-font-family{font-family: var(--wp--preset--font-family--roboto-slab) !important;}.has-rubik-font-family{font-family: var(--wp--preset--font-family--rubik) !important;}.has-rufina-font-family{font-family: var(--wp--preset--font-family--rufina) !important;}.has-sora-font-family{font-family: var(--wp--preset--font-family--sora) !important;}.has-source-sans-3-font-family{font-family: var(--wp--preset--font-family--source-sans-3) !important;}.has-source-serif-4-font-family{font-family: var(--wp--preset--font-family--source-serif-4) !important;}.has-space-mono-font-family{font-family: var(--wp--preset--font-family--space-mono) !important;}.has-syne-font-family{font-family: var(--wp--preset--font-family--syne) !important;}.has-texturina-font-family{font-family: var(--wp--preset--font-family--texturina) !important;}.has-urbanist-font-family{font-family: var(--wp--preset--font-family--urbanist) !important;}.has-work-sans-font-family{font-family: var(--wp--preset--font-family--work-sans) !important;} 230/*# sourceURL=global-styles-inline-css */ 231</style> 232 233<link crossorigin='anonymous' rel='stylesheet' id='all-css-14-1' href='/wp-content/mu-plugins/jetpack-mu-wpcom-plugin/moon/jetpack_vendor/automattic/jetpack-mu-wpcom/src/build/verbum-comments/verbum-comments.css?m=1785895867i&cssminify=yes' type='text/css' media='all' /> 234<link rel='stylesheet' id='verbum-gutenberg-css-css' href='https://widgets.wp.com/verbum-block-editor/block-editor.css?ver=1771405207' media='all' /> 235<link crossorigin='anonymous' rel='stylesheet' id='all-css-16-1' href='/_static/??/wp-content/themes/pub/typo/style.css,/wp-content/mu-plugins/jetpack-plugin/moon/_inc/genericons/genericons/genericons.css?m=1771606380j&cssminify=yes' type='text/css' media='all' /> 236<link rel='stylesheet' id='typo-vast-shadow-css' href='https://fonts-api.wp.com/css?family=Vast+Shadow&ver=7.1.1-alpha-63587' media='all' /> 237<link rel='stylesheet' id='typo-droid-serif-css' href='https://fonts-api.wp.com/css?family=Droid+Serif:400,700,400italic,700italic&ver=7.1.1-alpha-63587' media='all' /> 238<link crossorigin='anonymous' rel='stylesheet' id='all-css-20-1' href='/_static/??-eJx9i0EKwkAMAD9kDIUV9SC+pV3iupJNQpOl9Pett3rxNgMzuBhklSAJjDc1crQ+YaymWCWjx8oEi2Vt5+x+wkPfOhj3UsVxpom17Fhwrw76byqkwJrHqCo/Ai8e6/xdn+0xpMs9pdt1SJ8NQhY/zQ==&cssminify=yes' type='text/css' media='all' /> 239<link crossorigin='anonymous' rel='stylesheet' id='print-css-21-1' href='/wp-content/mu-plugins/global-print/global-print.css?m=1465851035i&cssminify=yes' type='text/css' media='print' /> 240<style id="jetpack-global-styles-frontend-style-inline-css"> 241:root { --font-headings: unset; --font-base: unset; --font-headings-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; --font-base-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;} 242/*# sourceURL=jetpack-global-styles-frontend-style-inline-css */ 243</style> 244<link crossorigin='anonymous' rel='stylesheet' id='all-css-24-1' href='/_static/??-eJyNjcEKAjEMRH/ImhVlqwfxU6TbhrZrmhTTIv69u+JFvHgZ5sHwBh7VeOGG3KB0U6nHzAoztur87cNQRNYInVBBk7tjcCE83zVz3HrVDfxvumb2MPVMAVR8dmRIougX/DhbwrK8pwNEksnROriU884e9+PJDnaYXxwFS20=&cssminify=yes' type='text/css' media='all' />
245<script id="wpcom-actionbar-placeholder-js-extra"> 246var actionbardata = {"siteID":"61874218","postID":"24592","siteURL":"https://hockey-graphs.com","xhrURL":"https://hockey-graphs.com/wp-admin/admin-ajax.php","nonce":"ba836f7ed5","isLoggedIn":"","statusMessage":"","subsEmailDefault":"instantly","proxyScriptUrl":"https://s0.wp.com/wp-content/js/wpcom-proxy-request.js?m=1513050504i&ver=20211021","shortlink":"https://wp.me/p4bCjg-6oE","i18n":{"followedText":"New posts from this site will now appear in your \u003Ca href=\"https://wordpress.com/reader\"\u003EReader\u003C/a\u003E","foldBar":"Collapse this bar","unfoldBar":"Expand this bar","shortLinkCopied":"Copied to clipboard."}}; 247//# sourceURL=wpcom-actionbar-placeholder-js-extra 248</script>
vendor: 1 bytes, line 248
248
249<script id="jetpack-mu-wpcom-settings-js-before"> 250var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https://s1.wp.com/wp-content/mu-plugins/jetpack-mu-wpcom-plugin/moon/jetpack_vendor/automattic/jetpack-mu-wpcom/src/build/"}; 251//# sourceURL=jetpack-mu-wpcom-settings-js-before 252</script>
vendor: 1 bytes, line 252
252
253<script crossorigin='anonymous' type='text/javascript' src='/_static/??/wp-content/js/rlt-proxy.js,/wp-content/blog-plugins/wordads-classes/js/cmp/v2/cmp-non-gdpr.js?m=1780567333j'></script>
vendor: 1 bytes, line 253
253
254<script id="rlt-proxy-js-after"> 255 rltInitialize( {"token":null,"iframeOrigins":["https:\/\/widgets.wp.com"]} ); 256//# sourceURL=rlt-proxy-js-after 257</script>
257 258<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://hockeygraphsdotcom.wordpress.com/xmlrpc.php?rsd" /> 259<meta name="generator" content="WordPress.com" /> 260<link rel="canonical" href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/" /> 261<link rel='shortlink' href='https://wp.me/p4bCjg-6oE' /> 262<link rel="alternate" type="application/json+oembed" href="https://public-api.wordpress.com/oembed/?format=json&url=https%3A%2F%2Fhockey-graphs.com%2F2020%2F10%2F01%2Fbuilding-a-shot-plotting-app-in-shiny%2F&for=wpcom-auto-discovery" /><link rel="alternate" type="application/xml+oembed" href="https://public-api.wordpress.com/oembed/?format=xml&url=https%3A%2F%2Fhockey-graphs.com%2F2020%2F10%2F01%2Fbuilding-a-shot-plotting-app-in-shiny%2F&for=wpcom-auto-discovery" /> 263<!-- Jetpack Open Graph Tags --> 264<meta property="og:type" content="article" /> 265<meta property="og:title" content="Building a Shot-Plotting App in Shiny" /> 266<meta property="og:url" content="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/" /> 267<meta property="og:description" content="For me at least, hand tracking is 99% of the time born out of necessity. The only way I am ever going to get location data for shots is if I break out a multicoloured pen and write down all t…" /> 268<meta property="article:published_time" content="2020-10-01T12:00:00+00:00" /> 269<meta property="article:modified_time" content="2020-10-01T03:33:41+00:00" /> 270<meta property="og:site_name" content="Hockey Graphs" /> 271<meta property="og:image" content="https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif" /> 272<meta property="og:image:width" content="906" /> 273<meta property="og:image:height" content="572" /> 274<meta property="og:image:alt" content="" /> 275<meta property="og:locale" content="en_US" /> 276<meta property="article:publisher" content="https://www.facebook.com/WordPresscom" /> 277<meta name="twitter:text:title" content="Building a Shot-Plotting App in Shiny" /> 278<meta name="twitter:image" content="https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif?w=640" /> 279<meta name="twitter:card" content="summary_large_image" /> 280 281<!-- End Jetpack Open Graph Tags --> 282<link rel="shortcut icon" type="image/x-icon" href="https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=32" sizes="16x16" /> 283<link rel="icon" type="image/x-icon" href="https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=32" sizes="16x16" /> 284<link rel="apple-touch-icon" href="https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=114" /> 285<link rel='openid.server' href='https://hockey-graphs.com/?openidserver=1' /> 286<link rel='openid.delegate' href='https://hockey-graphs.com/' /> 287<link rel="search" type="application/opensearchdescription+xml" href="https://hockey-graphs.com/osd.xml" title="Hockey Graphs" /> 288<link rel="search" type="application/opensearchdescription+xml" href="https://s1.wp.com/opensearch.xml" title="WordPress.com" /> 289<meta name="description" content="For me at least, hand tracking is 99% of the time born out of necessity. The only way I am ever going to get location data for shots is if I break out a multicoloured pen and write down all the locations and numbers myself. Its isn't however exactly the quickest process to deal with.…" /> 290 <style type="text/css"> 291 .site-title, 292 .site-description { 293 position: absolute; 294 clip: rect(1px, 1px, 1px, 1px); 295 } 296 </style> 297 <style id="custom-background-css"> 298body.custom-background { background-image: url("https://hockeygraphsdotcom.wordpress.com/wp-content/themes/pub/typo/images/body-bg.png?m=1391152414i"); background-position: left top; background-size: auto; background-repeat: repeat; background-attachment: fixed; } 299</style>
300<script> 301var wa_client = {}; wa_client.cmd = []; wa_client.config = { 'blog_id': 61874218, 'blog_language': 'en', 'is_wordads': false, 'hosting_type': 0, 'afp_account_id': null, 'afp_host_id': 5038568878849053, 'theme': 'pub/typo', '_': { 'title': 'Advertisement', 'privacy_settings': 'Privacy Settings' }, 'formats': [ 'inline', 'belowpost', 'bottom_sticky', 'sidebar_sticky_right', 'sidebar', 'gutenberg_rectangle', 'gutenberg_leaderboard', 'gutenberg_mobile_leaderboard', 'gutenberg_skyscraper' ] }; 302</script>
302 303
303<script type="text/javascript"> 304 305 window.doNotSellCallback = function() { 306 307 var linkElements = [ 308 'a[href="https://wordpress.com/?ref=footer_blog"]', 309 'a[href="https://wordpress.com/?ref=footer_website"]', 310 'a[href="https://wordpress.com/?ref=vertical_footer"]', 311 'a[href^="https://wordpress.com/?ref=footer_segment_"]', 312 ].join(','); 313 314 var dnsLink = document.createElement( 'a' ); 315 dnsLink.href = 'https://wordpress.com/advertising-program-optout/'; 316 dnsLink.classList.add( 'do-not-sell-link' ); 317 dnsLink.rel = 'nofollow'; 318 dnsLink.style.marginLeft = '0.5em'; 319 dnsLink.textContent = 'Do Not Sell or Share My Personal Information'; 320 321 var creditLinks = document.querySelectorAll( linkElements ); 322 323 if ( 0 === creditLinks.length ) { 324 return false; 325 } 326 327 Array.prototype.forEach.call( creditLinks, function( el ) { 328 el.insertAdjacentElement( 'afterend', dnsLink ); 329 }); 330 331 return true; 332 }; 333 334 </script>
334 335 <style type="text/css" id="custom-colors-css"> .site-content:before, 336 .site-content:after, 337 .hentry-wrapper:before { 338 opacity: 0.35; 339 } 340 .format-audio .entry-content:before, 341 .format-audio .entry-content:after { 342 background-image: none; 343 } 344 .entry-title a:hover, 345 .entry-title a:focus { 346 text-shadow: none; 347 } 348.format-link .post-link a,.format-link .entry-content a:visited { color: #FFFFFF;} 349[class*="navigation"] .nav-previous a,[class*="navigation"] .nav-next a { color: #FFFFFF;} 350.comment-reply-link { color: #FFFFFF;} 351#infinite-handle span { color: #FFFFFF;} 352.page-title:after { border-color: #ffffff;} 353.page-title:after { border-color: rgba( 255, 255, 255, 0.3 );} 354.entry-title,.wp-caption { border-color: #dfdfdf;} 355.entry-title,.wp-caption { border-color: rgba( 223, 223, 223, 0.3 );} 356body { color: #555555;} 357.entry-title a:hover, .entry-title a:focus { color: #636363;} 358blockquote { color: #636363;} 359.entry-meta,.entry-meta a,.entry-meta a:visited { color: #61636A;} 360.format-audio .entry-content { color: #636363;} 361blockquote,th,td { border-color: #e4e3e3;} 362blockquote,th,td { border-color: rgba( 228, 227, 227, 0.3 );} 363.error404 .widget-title,.error404 .widgettitle { border-color: #e4e3e3;} 364.error404 .widget-title,.error404 .widgettitle { border-color: rgba( 228, 227, 227, 0.5 );} 365#respond h3 { border-color: #e4e3e3;} 366#respond h3 { border-color: rgba( 228, 227, 227, 0.3 );} 367.page-title { border-color: #dddddd;} 368.page-title { border-color: rgba( 221, 221, 221, 0.3 );} 369.format-image .entry-content img { border-color: #dddddd;} 370.format-image .entry-content img { border-color: rgba( 221, 221, 221, 0.3 );} 371body { background-color: #eeeeee;} 372.site-footer a:focus,.site-footer a:hover { color: #EEEEEE;} 373</style>
374<script type="text/javascript"> 375 window.google_analytics_uacct = "UA-52447-2"; 376</script>
376 377
378<script type="text/javascript"> 379 var _gaq = _gaq || []; 380 _gaq.push(['_setAccount', 'UA-52447-2']); 381 _gaq.push(['_gat._anonymizeIp']); 382 _gaq.push(['_setDomainName', 'none']); 383 _gaq.push(['_setAllowLinker', true]); 384 _gaq.push(['_initData']); 385 _gaq.push(['_trackPageview']); 386 387 (function() { 388 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 389 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 390 (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); 391 })(); 392</script>
392 393<link crossorigin='anonymous' rel='stylesheet' id='all-css-0-5' href='/_static/??-eJyNjMEKhDAMBX9IfaiIXsRPWdxskGqbFNPi7y+CevY4wzA4YkkqiSUh5DL6vDgxrJziTNvFCKqCjxPC1yttBjtc5L0iswLvD0F/2bOB5l2zsX+iW5zDKYx1P3RN07b1sP4BKPs7aw==&cssminify=yes' type='text/css' media='all' /> 394 395</head> 396 397<body class="wp-singular post-template-default single single-post postid-24592 single-format-standard custom-background wp-theme-pubtypo customizer-styles-applied group-blog jetpack-reblog-enabled"> 398<div id="page" class="hfeed site"> 399 <header id="masthead" class="site-header" role="banner"> 400 <a href="https://hockey-graphs.com/" rel="home"> 401 <img src="https://hockey-graphs.com/wp-content/uploads/2015/01/cropped-unnamed-1.jpg" width="1416" height="246" alt=""> 402 </a> 403 <div class="site-branding"> 404 <h1 class="site-title"><a href="https://hockey-graphs.com/" rel="home">Hockey Graphs</a></h1> 405 <h2 class="site-description">Visualizing and analyzing hockey and statistics</h2> 406 </div> 407 408 <nav id="site-navigation" class="main-navigation" role="navigation"> 409 <h1 class="menu-toggle">Menu</h1> 410 <a class="skip-link screen-reader-text" href="#content">Skip to content</a> 411 412 413 <div class="menu"><ul> 414<li ><a href="https://hockey-graphs.com/">Home</a></li><li class="page_item page-item-1"><a href="https://hockey-graphs.com/about/">About our Authors</a></li> 415<li class="page_item page-item-3109"><a href="https://hockey-graphs.com/follow-us-on-twitter-hockeygraphs/">Follow us on Twitter: @HockeyGraphs</a></li> 416<li class="page_item page-item-22497 page_item_has_children"><a href="https://hockey-graphs.com/events/">Hockey Graph Events</a> 417<ul class='children'> 418 <li class="page_item page-item-21248"><a href="https://hockey-graphs.com/events/hockey-analytics-data-sprint-v0-1/">Hockey Analytics Data Sprint v0.1</a></li> 419 <li class="page_item page-item-12644"><a href="https://hockey-graphs.com/events/vanhac/">Vancouver Hockey Analytics Conference 2017</a></li> 420 <li class="page_item page-item-22417"><a href="https://hockey-graphs.com/events/vanhac18/">Vancouver Hockey Analytics Conference 2018</a></li> 421</ul> 422</li> 423<li class="page_item page-item-21919"><a href="https://hockey-graphs.com/hockey-graphs-mentorship-program/">Hockey-Graphs Mentorship Program</a></li> 424<li class="page_item page-item-2918 page_item_has_children"><a href="https://hockey-graphs.com/interactive-nhl-graphs/">Interactive NHL Graphs</a> 425<ul class='children'> 426 <li class="page_item page-item-2926"><a href="https://hockey-graphs.com/interactive-nhl-graphs/historical-possession-2ps/">Franchise History – Possession (2pS%)</a></li> 427 <li class="page_item page-item-2951"><a href="https://hockey-graphs.com/interactive-nhl-graphs/historical-team-shooting/">Franchise History – Shooting (Sh%)</a></li> 428 <li class="page_item page-item-3144 page_item_has_children"><a href="https://hockey-graphs.com/interactive-nhl-graphs/historical-team-comparisons/">Historical Team Comparisons</a> 429 <ul class='children'> 430 <li class="page_item page-item-3149"><a href="https://hockey-graphs.com/interactive-nhl-graphs/historical-team-comparisons/team-defense/">Team Defense</a></li> 431 <li class="page_item page-item-3157"><a href="https://hockey-graphs.com/interactive-nhl-graphs/historical-team-comparisons/team-goaltending/">Team Goaltending</a></li> 432 <li class="page_item page-item-3146"><a href="https://hockey-graphs.com/interactive-nhl-graphs/historical-team-comparisons/team-offense/">Team Offense</a></li> 433 <li class="page_item page-item-3153"><a href="https://hockey-graphs.com/interactive-nhl-graphs/historical-team-comparisons/team-possession/">Team Possession</a></li> 434 <li class="page_item page-item-3155"><a href="https://hockey-graphs.com/interactive-nhl-graphs/historical-team-comparisons/team-shooting/">Team Shooting</a></li> 435 </ul> 436</li> 437 <li class="page_item page-item-2920"><a href="https://hockey-graphs.com/interactive-nhl-graphs/player-career-charting-percentage-of-team-shots-tsh-1967-68-to-2012-13/">Player Career Trends – Share of Team Shots (%Tsh)</a></li> 438 <li class="page_item page-item-2978 page_item_has_children">
438<a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/">Team Single Season Charts (1952-53 to present)</a> 439 <ul class='children'> 440 <li class="page_item page-item-3053"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/anaheim-ducks/">Anaheim Ducks</a></li> 441 <li class="page_item page-item-3116"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/arizona-coyotes-phoenix-coyotes-winnipeg-jets-i/">Arizona Coyotes – Winnipeg Jets I – Phoenix Coyotes</a></li> 442 <li class="page_item page-item-2989"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/boston-bruins/">Boston Bruins</a></li> 443 <li class="page_item page-item-3074"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/buffalo-sabres/">Buffalo Sabres</a></li> 444 <li class="page_item page-item-3051"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/calgary-flames-atlanta-flames/">Calgary Flames – Atlanta Flames</a></li> 445 <li class="page_item page-item-3083"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/carolina-hurricanes-hartford-whalers/">Carolina Hurricanes – Hartford Whalers</a></li> 446 <li class="page_item page-item-3011"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/chicago-blackhawks/">Chicago Blackhawks</a></li> 447 <li class="page_item page-item-3112"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/colorado-avalanche-quebec-nordiques/">Colorado Avalanche – Quebec Nordiques</a></li> 448 <li class="page_item page-item-3077"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/columbus-blue-jackets/">Columbus Blue Jackets</a></li> 449 <li class="page_item page-item-3089"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/dallas-stars-minnesota-north-stars/">Dallas Stars – Minnesota North Stars</a></li> 450 <li class="page_item page-item-3046"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/detroit-red-wings/">Detroit Red Wings</a></li> 451 <li class="page_item page-item-3079"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/edmonton-oilers/">Edmonton Oilers</a></li> 452 <li class="page_item page-item-3081"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/florida-panthers/">Florida Panthers</a></li> 453 <li class="page_item page-item-3087"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/los-angeles-kings/">Los Angeles Kings</a></li> 454 <li class="page_item page-item-3091"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/minnesota-wild/">Minnesota Wild</a></li> 455 <li class="page_item page-item-3044"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/montreal-canadiens/">Montreal Canadiens</a></li> 456 <li class="page_item page-item-3093"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/nashville-predators/">Nashville Predators</a></li> 457 <li class="page_item page-item-3030"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/new-jersey-devils-kansas-city-scouts-colorado-rockies/">New Jersey Devils – Kansas City Scouts – Colorado Rockies</a></li> 458 <li class="page_item page-item-3095"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/new-york-islanders/">New York Islanders</a></li> 459 <li class="page_item page-item-3021">
459<a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/new-york-rangers/">New York Rangers</a></li> 460 <li class="page_item page-item-3097"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/oakland-seals-california-golden-seals-cleveland-barons/">Oakland Seals – California Golden Seals – Cleveland Barons</a></li> 461 <li class="page_item page-item-3099"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/ottawa-senators/">Ottawa Senators</a></li> 462 <li class="page_item page-item-3101"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/philadelphia-flyers/">Philadelphia Flyers</a></li> 463 <li class="page_item page-item-3023"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/pittsburgh-penguins/">Pittsburgh Penguins</a></li> 464 <li class="page_item page-item-3114"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/san-jose-sharks/">San Jose Sharks</a></li> 465 <li class="page_item page-item-3122"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/st-louis-blues/">St. Louis Blues</a></li> 466 <li class="page_item page-item-3120"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/tampa-bay-lightning/">Tampa Bay Lightning</a></li> 467 <li class="page_item page-item-3016"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/toronto-maple-leafs/">Toronto Maple Leafs</a></li> 468 <li class="page_item page-item-3118"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/vancouver-canucks/">Vancouver Canucks</a></li> 469 <li class="page_item page-item-2980"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/washington-capitals/">Washington Capitals</a></li> 470 <li class="page_item page-item-3049"><a href="https://hockey-graphs.com/interactive-nhl-graphs/nhl-franchise-season-charts-1952-53-to-present/winnipeg-jets-ii-atlanta-thrashers/">Winnipeg Jets II – Atlanta Thrashers</a></li> 471 </ul> 472</li> 473</ul> 474</li> 475</ul></div> 476 477 478 </nav><!-- #site-navigation --> 479 </header><!-- #masthead --> 480 481 <div id="content" class="site-content"> 482 483 <div id="primary" class="content-area"> 484 <main id="main" class="site-main" role="main"> 485 486 487 <div class="hentry-wrapper"> 488 <article id="post-24592" class="post-24592 post type-post status-publish format-standard hentry category-resources tag-data-visualization"> 489 <header class="entry-header"> 490 <h1 class="entry-title">Building a Shot-Plotting App in Shiny</h1> 491 <div class="entry-meta"> 492 <span class="posted-on"><a href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/" rel="bookmark"><time class="entry-date published" datetime="2020-10-01T07:00:00-05:00">October 1, 2020</time><time class="updated" datetime="2020-09-30T22:33:41-05:00">September 30, 2020</time></a></span><span class="byline"><span class="author vcard"><a class="url fn n" href="https://hockey-graphs.com/author/aklongmuir/">aklongmuir</a></span></span> <span class="cat-links"> 493 <a href="https://hockey-graphs.com/category/resources/" rel="category tag">Resources</a> </span> 494 495 <span class="tags-links"> 496 Tags: <a href="https://hockey-graphs.com/tag/data-visualization/" rel="tag">Data Visualization</a> </span> 497 498 </div><!-- .entry-meta --> 499 </header><!-- .entry-header --> 500 501 <div class="entry-content"> 502 503<p class="wp-block-paragraph">For me at least, hand tracking is 99% of the time born out of necessity. </p> 504 505 506 507<p class="wp-block-paragraph">The only way I am ever going to get location data for shots is if I break out a multicoloured pen and write down all the locations and numbers myself. Its isn’t however exactly the quickest process to deal with.</p> 508 509 510 511<p class="wp-block-paragraph">I actually really enjoy hand tracking is the thing, It keeps me focused on the game at hand and stops my mind from wandering. The issue comes when it’s time to digitise that information for analysis. I have written about this before over at <a href="https://www.theicegarden.com/2019/1/27/18185866/analytics-odyssey-womens-hockey-awihl-australia-statistics-analysis-data-tracking">The Ice Garden</a>, back when I tracked an entire season of the Australian Womens Hockey League. That season it took me around an hour of straight work to plug in every piece of information so that tableau could process it and as my life got busier, the amount of free time I could dedicate got less and less. </p> 512 513 514 515<p class="wp-block-paragraph">The idea to force a shiny app to do something it has no right to do came out of necessity. Parti
515ally because I wanted to be able to show heat maps to the Head Coach of the local team I work with during intermission, but mostly because my Masters project consists of getting school kids ages 11+ involved in sports analytics and I really wanted them to be able to produce their own heat maps and yet I really did not want to attempt to explain the complexities of Kernel Density Charts to a collection of 12-year-olds.</p> 516 517 518 519<p class="wp-block-paragraph">So here we are. </p> 520 521 522 523<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="https://aklongmuir.shinyapps.io/HockeyPlotter/" target="_blank">The Hockey Plotter 1.1</a></p> 524 525 526<p><span id="more-24592"></span></p> 527 528 529<p class="wp-block-paragraph">The applications works based on a combination of the reactiveValues and observeEvent objects with everything feeding into the other. The main aspect of the app is the interactive rink which allows you to plot shot locations based on player, team, and event type (a simple single click for a shot, and a double click for a goal). With each input the app stitches another row onto the bottom of the existing values data table from which everything is run. </p> 530 531 532 533<figure class="wp-block-image size-large"><img data-attachment-id="24597" data-permalink="https://hockey-graphs.com/singly-click-shot/" data-orig-file="https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif" data-orig-size="906,572" data-comments-opened="1" data-image-title="singly-click-shot" data-image-description="" data-image-caption="" data-large-file="https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif?w=615" width="906" height="572" src="https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif?w=906" alt="" class="wp-image-24597" srcset="https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif 906w, https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif?w=150 150w, https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif?w=300 300w, https://hockey-graphs.com/wp-content/uploads/2020/09/singly-click-shot.gif?w=768 768w" sizes="(max-width: 906px) 100vw, 906px" /><figcaption>Input shots by Player # and Team</figcaption></figure> 534 535 536 537<figure class="wp-block-image size-large"><img data-attachment-id="24598" data-permalink="https://hockey-graphs.com/dblclick/" data-orig-file="https://hockey-graphs.com/wp-content/uploads/2020/09/dblclick.gif" data-orig-size="906,572" data-comments-opened="1" data-image-title="dblclick" data-image-description="" data-image-caption="" data-large-file="https://hockey-graphs.com/wp-content/uploads/2020/09/dblclick.gif?w=615" width="906" height="572" src="https://hockey-graphs.com/wp-content/uploads/2020/09/dblclick.gif?w=906" alt="" class="wp-image-24598" srcset="https://hockey-graphs.com/wp-content/uploads/2020/09/dblclick.gif 906w, https://hockey-graphs.com/wp-content/uploads/2020/09/dblclick.gif?w=150 150w, https://hockey-graphs.com/wp-content/uploads/2020/09/dblclick.gif?w=300 300w, https://hockey-graphs.com/wp-content/uploads/2020/09/dblclick.gif?w=768 768w" sizes="(max-width: 906px) 100vw, 906px" /><figcaption>Input shots by Player # and Team</figcaption></figure> 538 539 540 541<figure class="wp-block-image size-large"><img data-attachment-id="24600" data-permalink="https://hockey-graphs.com/download-pbp/" data-orig-file="https://hockey-graphs.com/wp-content/uploads/2020/09/download-pbp.gif" data-orig-size="906,562" data-comments-opened="1" data-image-title="download-pbp" data-image-description="" data-image-caption="" data-large-file="https://hockey-graphs.com/wp-content/uploads/2020/09/download-pbp.gif?w=615" width="906" height="562" src="https://hockey-graphs.com/wp-content/uploads/2020/09/download-pbp.gif?w=906" alt="" class="wp-image-24600" srcset="https://hockey-graphs.com/wp-content/uploads/2020/09/download-pbp.gif 906w, https://hockey-graphs.com/wp-content/uploads/2020/09/download-pbp.gif?w=150 150w, https://hockey-graphs.com/wp-content/uploads/2020/09/download-pbp.gif?w=300 300w, https://hockey-graphs.com/wp-content/uploads/2020/09/download-pbp.gif?w=768 768w" sizes="(max-width: 906px) 100v
541w, 906px" /><figcaption>Download PbP data for storage + further analysis</figcaption></figure> 542 543 544 545<figure class="wp-block-image size-large"><img data-attachment-id="24603" data-permalink="https://hockey-graphs.com/shot-map/" data-orig-file="https://hockey-graphs.com/wp-content/uploads/2020/09/shot-map.gif" data-orig-size="906,562" data-comments-opened="1" data-image-title="shot-map" data-image-description="" data-image-caption="" data-large-file="https://hockey-graphs.com/wp-content/uploads/2020/09/shot-map.gif?w=615" loading="lazy" width="906" height="562" src="https://hockey-graphs.com/wp-content/uploads/2020/09/shot-map.gif?w=906" alt="" class="wp-image-24603" srcset="https://hockey-graphs.com/wp-content/uploads/2020/09/shot-map.gif 906w, https://hockey-graphs.com/wp-content/uploads/2020/09/shot-map.gif?w=150 150w, https://hockey-graphs.com/wp-content/uploads/2020/09/shot-map.gif?w=300 300w, https://hockey-graphs.com/wp-content/uploads/2020/09/shot-map.gif?w=768 768w" sizes="auto, (max-width: 906px) 100vw, 906px" /><figcaption>Add Headings and customise density map by team, and event type</figcaption></figure> 546 547 548 549<p class="wp-block-paragraph">In terms of further work theres lots I still want to add. A player filter that can be toggled on or off is the big one that I’m currently working on. As well as a way users to upload their own data and customise the team names.</p> 550 551 552 553<p class="wp-block-paragraph">Regardless of how far it still perhaps has to go, I think it’s neat. </p> 554 555 556 557<p class="wp-block-paragraph">And I really truly hope that in some way it can help lower the entry barrier to shot tracking and allow more teams in fringe leagues to get access to this type of data</p> 558 559 560 561<p class="wp-block-paragraph">The code and a more in depth description of how it works can be found on my <a href="https://github.com/Aklongmuir/HockeyPlotter/blob/master/README.md">Github</a>.</p> 562<div id="atatags-370373-6ab580d00d83c"> 563
563<script type="text/javascript"> 564 __ATA = window.__ATA || {}; 565 __ATA.cmd = window.__ATA.cmd || []; 566 __ATA.cmd.push(function() { 567 __ATA.initVideoSlot('atatags-370373-6ab580d00d83c', { 568 sectionId: '370373', 569 format: 'inread' 570 }); 571 }); 572 </script>
572 573 </div><span id="wordads-inline-marker" style="display: none;"></span><div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-twitter"><a rel="nofollow noopener noreferrer" 574 data-shared="sharing-twitter-24592" 575 class="share-twitter sd-button share-icon" 576 href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/?share=twitter" 577 target="_blank" 578 aria-labelledby="sharing-twitter-24592" 579 > 580 <span id="sharing-twitter-24592" hidden>Share on X (Opens in new window)</span> 581 <span>X</span> 582 </a></li><li class="share-facebook"><a rel="nofollow noopener noreferrer" 583 data-shared="sharing-facebook-24592" 584 class="share-facebook sd-button share-icon" 585 href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/?share=facebook" 586 target="_blank" 587 aria-labelledby="sharing-facebook-24592" 588 > 589 <span id="sharing-facebook-24592" hidden>Share on Facebook (Opens in new window)</span> 590 <span>Facebook</span> 591 </a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-61874218-24592-6ab580d00e2f9' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=61874218&post_id=24592&origin=hockeygraphsdotcom.wordpress.com&obj_id=61874218-24592-6ab580d00e2f9&domain=hockey-graphs.com' data-name='like-post-frame-61874218-24592-6ab580d00e2f9' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div><!-- .entry-content --> 592 593 <footer class="entry-meta"> 594 </footer><!-- .entry-meta --> 595 </article><!-- #post-## --> 596</div><!-- .hentry-wrapper --> 597 598 <nav role="navigation" id="nav-below" class="post-navigation"> 599 <h1 class="screen-reader-text">Post navigation</h1> 600 601 602 <div class="nav-previous"><a href="https://hockey-graphs.com/2020/09/30/chatter-charts-visualizing-real-time-fan-reactions/" rel="prev"><span class="meta-nav">←</span> Chatter Charts – Visualizing Real-Time Fan Reactions</a></div> <div class="nav-next"><a href="https://hockey-graphs.com/2021/01/11/how-canada-and-the-us-differ-in-their-roster-philosophies-during-olympic-cycles/" rel="next">How Canada and the US differ in their roster philosophies during Olympic cycles <span class="meta-nav">→</span></a></div> 603 604 </nav><!-- #nav-below --> 605 606 607<div id="comments" class="comments-area"> 608 609 610 <h2 class="comments-title"> 611 4 thoughts on “<span>Building a Shot-Plotting App in Shiny</span>” </h2> 612 613 614 <ol class="comment-list"> 615 616 <li id="comment-37085" class="comment even thread-even depth-1"> 617 <article id="div-comment-37085" class="comment-body clear"> 618 <div class="comment-content"> 619 <p>This is really cool! I’m actually trying to get into analytics myself, so I might wind up using this.</p> 620 <div class="reply clear"><a rel="nofollow" class="comment-reply-link" href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/?replytocom=37085#respond" data-commentid="37085" data-postid="24592" data-belowelement="div-comment-37085" data-respondelement="respond" data-replyto="Reply to Matt" aria-label="Reply to Matt">Reply</a></div> </div><!-- .comment-content --> 621 <footer class="comment-meta"> 622 <img referrerpolicy="no-referrer" alt='Matt's avatar' src='https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=32&d=identicon&r=G' srcset='https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=32&d=identicon&r=G 1x, https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=48&d=identicon&r=G 1.5x, https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=64&d=identicon&r=G 2x, https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=96&d=identicon&r=G 3x, https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=128&d=identicon&r=G 4x' class='avatar avatar-32' height='32' width='32' loading='lazy' decoding='async' /> 623 <div class="comment-metadata"> 624 <div class="comment-author vcard"> 625 <cite class="fn">Matt</cite> </div><!-- .comment-author --> 626 <a href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/#comment-37085"> 627 <time datetime="2020-10-02T07:56:09-05:00"> 628 October 2, 2020 at 7:56 am </time> 629 </a> 630 </div><!-- .comment-metadata --> 631 632 </footer><!-- .comment-meta --> 633 634 </article><!-- .comment-body --> 635 636 </li><!-- #comment-## --> 637
638 <li id="comment-37132" class="comment odd alt thread-odd thread-alt depth-1"> 639 <article id="div-comment-37132" class="comment-body clear"> 640 <div class="comment-content"> 641 <p>this is a phenomenal tool. really appreciate you making this.</p> 642 <div class="reply clear"><a rel="nofollow" class="comment-reply-link" href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/?replytocom=37132#respond" data-commentid="37132" data-postid="24592" data-belowelement="div-comment-37132" data-respondelement="respond" data-replyto="Reply to Spizzwolf (@Spizzwolf)" aria-label="Reply to Spizzwolf (@Spizzwolf)">Reply</a></div> </div><!-- .comment-content --> 643 <footer class="comment-meta"> 644 <img referrerpolicy="no-referrer" alt='Spizzwolf (@Spizzwolf)'s avatar' src='https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=32%2C32&ssl=1' srcset='https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=32%2C32&ssl=1 1x, https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=48%2C48&ssl=1 1.5x, https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=64%2C64&ssl=1 2x, https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=96%2C96&ssl=1 3x, https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=128%2C128&ssl=1 4x' class='avatar avatar-32' height='32' width='32' loading='lazy' decoding='async' /> 645 <div class="comment-metadata"> 646 <div class="comment-author vcard"> 647 <cite class="fn"><a href="http://twitter.com/Spizzwolf" class="url" rel="ugc external nofollow">Spizzwolf (@Spizzwolf)</a></cite> </div><!-- .comment-author --> 648 <a href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/#comment-37132"> 649 <time datetime="2020-10-07T16:17:26-05:00"> 650 October 7, 2020 at 4:17 pm </time> 651 </a> 652 </div><!-- .comment-metadata --> 653 654 </footer><!-- .comment-meta --> 655 656 </article><!-- .comment-body --> 657 658 </li><!-- #comment-## --> 659 660 <li id="comment-49065" class="comment even thread-even depth-1"> 661 <article id="div-comment-49065" class="comment-body clear"> 662 <div class="comment-content"> 663 <p class="wp-block-paragraph">Hi, this looks great but unfortunately not seeing the actual code for it in github – only see the old faithful demo. Would love to start using this for my son’s team!</p> 664 <div class="reply clear"><a rel="nofollow" class="comment-reply-link" href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/?replytocom=49065#respond" data-commentid="49065" data-postid="24592" data-belowelement="div-comment-49065" data-respondelement="respond" data-replyto="Reply to Will Gifford" aria-label="Reply to Will Gifford">Reply</a></div> </div><!-- .comment-content --> 665 <footer class="comment-meta"> 666 <img referrerpolicy="no-referrer" alt='Will Gifford's avatar' src='https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=32&d=identicon&r=G' srcset='https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=32&d=identicon&r=G 1x, https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=48&d=identicon&r=G 1.5x, https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=64&d=identicon&r=G 2x, https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=96&d=identicon&r=G 3x, https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=128&d=identicon&r=G 4x' class='avatar avatar-32' height='32' width='32' loading='lazy' decoding='async' /> 667 <div class="comment-metadata"> 668 <div class="comment-author vcard"> 669 <cite class="fn">Will Gifford</cite> </div><!-- .comment-author --> 670 <a href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/#comment-49065"> 671 <time datetime="2024-10-28T11:49:51-05:00"> 672 October 28, 2024 at 11:49 am </time> 673 </a> 674 </div><!-- .comment-metadata --> 675 676 </footer><!-- .comment-meta --> 677 678 </article><!-- .comment-body --> 679 680 </li><!-- #comment-## --> 681
682 <li id="comment-49090" class="comment odd alt thread-odd thread-alt depth-1"> 683 <article id="div-comment-49090" class="comment-body clear"> 684 <div class="comment-content"> 685 <p class="wp-block-paragraph"><a href="https://www.kulturelyon.com/" rel="nofollow ugc">Situs Bentengtogel</a></p> 686 <div class="reply clear"><a rel="nofollow" class="comment-reply-link" href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/?replytocom=49090#respond" data-commentid="49090" data-postid="24592" data-belowelement="div-comment-49090" data-respondelement="respond" data-replyto="Reply to Fionna" aria-label="Reply to Fionna">Reply</a></div> </div><!-- .comment-content --> 687 <footer class="comment-meta"> 688 <img referrerpolicy="no-referrer" alt='Fionna's avatar' src='https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=32&d=identicon&r=G' srcset='https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=32&d=identicon&r=G 1x, https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=48&d=identicon&r=G 1.5x, https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=64&d=identicon&r=G 2x, https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=96&d=identicon&r=G 3x, https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=128&d=identicon&r=G 4x' class='avatar avatar-32' height='32' width='32' loading='lazy' decoding='async' /> 689 <div class="comment-metadata"> 690 <div class="comment-author vcard"> 691 <cite class="fn"><a href="https://www.kulturelyon.com/" class="url" rel="ugc external nofollow">Fionna</a></cite> </div><!-- .comment-author --> 692 <a href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/#comment-49090"> 693 <time datetime="2025-09-29T16:01:35-05:00"> 694 September 29, 2025 at 4:01 pm </time> 695 </a> 696 </div><!-- .comment-metadata --> 697 698 </footer><!-- .comment-meta --> 699 700 </article><!-- .comment-body --> 701 702 </li><!-- #comment-## --> 703 </ol><!-- .comment-list --> 704 705 706 707 708 <div id="respond" class="comment-respond"> 709 <h3 id="reply-title" class="comment-reply-title">Leave a comment <small><a rel="nofollow" id="cancel-comment-reply-link" href="/2020/10/01/building-a-shot-plotting-app-in-shiny/#respond" style="display:none;">Cancel reply</a></small></h3><form action="https://hockey-graphs.com/wp-comments-post.php" method="post" id="commentform" class="comment-form"> 710 711 712<div class="comment-form__verbum transparent"></div><div class="verbum-form-meta"><input type='hidden' name='comment_post_ID' value='24592' id='comment_post_ID' /> 713<input type='hidden' name='comment_parent' id='comment_parent' value='0' /> 714 715 <input type="hidden" name="highlander_comment_nonce" id="highlander_comment_nonce" value="3dff5f3ccb" /> 716 <input type="hidden" name="verbum_show_subscription_modal" value="" /></div><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="9178a954e0" /></p><p style="display: none !important;" class="akismet-fields-container" data-prefix="ak_"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="29"/>
716<script> 717document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() ); 718</script>
718 719</p></form> </div><!-- #respond --> 720 721</div><!-- #comments --> 722 723 724 </main><!-- #main --> 725 </div><!-- #primary --> 726 727 728 </div><!-- #content --> 729 730 <footer id="colophon" class="site-footer" role="contentinfo"> 731 <div id="secondary" class="widget-areas clear" role="complementary"> 732 <div class="first widget-area"> 733 734 <aside id="recent-posts-2" class="widget widget_recent_entries"> 735 <h1 class="widget-title">Recent Posts</h1> 736 <ul> 737 <li> 738 <a href="https://hockey-graphs.com/2022/07/07/behind-the-numbers-where-analytics-and-scouts-get-the-draft-wrong/">Behind the Numbers: Where analytics and scouts get the draft wrong</a> 739 </li> 740 <li> 741 <a href="https://hockey-graphs.com/2021/08/09/bayesian-space-time-models-for-expected-possession-added-value-part-2-of-2/">Bayesian Space-Time Models for Expected Possession added Value – Part 2 of 2</a> 742 </li> 743 <li> 744 <a href="https://hockey-graphs.com/2021/07/13/data-may-not-drive-play-but-it-should-drive-decisions/">Data May Not Drive Play, But It Should Drive Decisions</a> 745 </li> 746 <li> 747 <a href="https://hockey-graphs.com/2021/07/06/bayesian-space-time-models-for-expected-possession-added-value-part-1-of-2/">Bayesian Space-Time Models for Expected Possession added Value – Part 1 of 2</a> 748 </li> 749 <li> 750 <a href="https://hockey-graphs.com/2021/04/14/how-important-are-faceoffs-to-possession-in-womens-hockey/">How important are faceoffs to possession in women’s hockey?</a> 751 </li> 752 </ul> 753 754 </aside> </div> 755 <div class="second widget-area"> 756 </div> 757 <div class="third widget-area"> 758 <aside id="archives-2" class="widget widget_archive"><h1 class="widget-title">Archives</h1> 759 <ul> 760 <li><a href='https://hockey-graphs.com/2022/07/'>July 2022</a></li> 761 <li><a href='https://hockey-graphs.com/2021/08/'>August 2021</a></li> 762 <li><a href='https://hockey-graphs.com/2021/07/'>July 2021</a></li> 763 <li><a href='https://hockey-graphs.com/2021/04/'>April 2021</a></li> 764 <li><a href='https://hockey-graphs.com/2021/03/'>March 2021</a></li> 765 <li><a href='https://hockey-graphs.com/2021/02/'>February 2021</a></li> 766 <li><a href='https://hockey-graphs.com/2021/01/'>January 2021</a></li> 767 <li><a href='https://hockey-graphs.com/2020/10/'>October 2020</a></li> 768 <li><a href='https://hockey-graphs.com/2020/09/'>September 2020</a></li> 769 <li><a href='https://hockey-graphs.com/2020/08/'>August 2020</a></li> 770 <li><a href='https://hockey-graphs.com/2020/07/'>July 2020</a></li> 771 <li><a href='https://hockey-graphs.com/2020/06/'>June 2020</a></li> 772 <li><a href='https://hockey-graphs.com/2020/05/'>May 2020</a></li> 773 <li><a href='https://hockey-graphs.com/2020/04/'>April 2020</a></li> 774 <li><a href='https://hockey-graphs.com/2020/03/'>March 2020</a></li> 775 <li><a href='https://hockey-graphs.com/2019/12/'>December 2019</a></li> 776 <li><a href='https://hockey-graphs.com/2019/10/'>October 2019</a></li> 777 <li><a href='https://hockey-graphs.com/2019/09/'>September 2019</a></li> 778 <li><a href='https://hockey-graphs.com/2019/08/'>August 2019</a></li> 779 <li><a href='https://hockey-graphs.com/2019/07/'>July 2019</a></li> 780 <li><a href='https://hockey-graphs.com/2019/05/'>May 2019</a></li> 781 <li><a href='https://hockey-graphs.com/2019/04/'>April 2019</a></li> 782 <li><a href='https://hockey-graphs.com/2019/03/'>March 2019</a></li> 783 <li><a href='https://hockey-graphs.com/2019/02/'>
783February 2019</a></li> 784 <li><a href='https://hockey-graphs.com/2019/01/'>January 2019</a></li> 785 <li><a href='https://hockey-graphs.com/2018/12/'>December 2018</a></li> 786 <li><a href='https://hockey-graphs.com/2018/11/'>November 2018</a></li> 787 <li><a href='https://hockey-graphs.com/2018/10/'>October 2018</a></li> 788 <li><a href='https://hockey-graphs.com/2018/08/'>August 2018</a></li> 789 <li><a href='https://hockey-graphs.com/2018/06/'>June 2018</a></li> 790 <li><a href='https://hockey-graphs.com/2018/05/'>May 2018</a></li> 791 <li><a href='https://hockey-graphs.com/2018/04/'>April 2018</a></li> 792 <li><a href='https://hockey-graphs.com/2018/03/'>March 2018</a></li> 793 <li><a href='https://hockey-graphs.com/2018/02/'>February 2018</a></li> 794 <li><a href='https://hockey-graphs.com/2018/01/'>January 2018</a></li> 795 <li><a href='https://hockey-graphs.com/2017/12/'>December 2017</a></li> 796 <li><a href='https://hockey-graphs.com/2017/11/'>November 2017</a></li> 797 <li><a href='https://hockey-graphs.com/2017/10/'>October 2017</a></li> 798 <li><a href='https://hockey-graphs.com/2017/09/'>September 2017</a></li> 799 <li><a href='https://hockey-graphs.com/2017/08/'>August 2017</a></li> 800 <li><a href='https://hockey-graphs.com/2017/07/'>July 2017</a></li> 801 <li><a href='https://hockey-graphs.com/2017/06/'>June 2017</a></li> 802 <li><a href='https://hockey-graphs.com/2017/05/'>May 2017</a></li> 803 <li><a href='https://hockey-graphs.com/2017/04/'>April 2017</a></li> 804 <li><a href='https://hockey-graphs.com/2017/03/'>March 2017</a></li> 805 <li><a href='https://hockey-graphs.com/2017/02/'>February 2017</a></li> 806 <li><a href='https://hockey-graphs.com/2017/01/'>January 2017</a></li> 807 <li><a href='https://hockey-graphs.com/2016/12/'>December 2016</a></li> 808 <li><a href='https://hockey-graphs.com/2016/11/'>November 2016</a></li> 809 <li><a href='https://hockey-graphs.com/2016/10/'>October 2016</a></li> 810 <li><a href='https://hockey-graphs.com/2016/09/'>September 2016</a></li> 811 <li><a href='https://hockey-graphs.com/2016/08/'>August 2016</a></li> 812 <li><a href='https://hockey-graphs.com/2016/07/'>July 2016</a></li> 813 <li><a href='https://hockey-graphs.com/2016/06/'>June 2016</a></li> 814 <li><a href='https://hockey-graphs.com/2016/05/'>May 2016</a></li> 815 <li><a href='https://hockey-graphs.com/2016/04/'>April 2016</a></li> 816 <li><a href='https://hockey-graphs.com/2016/03/'>March 2016</a></li> 817 <li><a href='https://hockey-graphs.com/2016/02/'>February 2016</a></li> 818 <li><a href='https://hockey-graphs.com/2016/01/'>January 2016</a></li> 819 <li><a href='https://hockey-graphs.com/2015/12/'>December 2015</a></li> 820 <li><a href='https://hockey-graphs.com/2015/11/'>November 2015</a></li> 821 <li><a href='https://hockey-graphs.com/2015/10/'>October 2015</a></li> 822 <li><a href='https://hockey-graphs.com/2015/09/'>September 2015</a></li> 823 <li><a href='https://hockey-graphs.com/2015/08/'>August 2015</a></li> 824 <li><a href='https://hockey-graphs.com/2015/07/'>July 2015</a></li> 825 <li><a href='https://hockey-graphs.com/2015/06/'>June 2015</a></li> 826 <li><a href='https://hockey-graphs.com/2015/05/'>May 2015</a></li> 827 <li><a href='https://hockey-graphs.com/2015/04/'>April 2015</a></li> 828 <li><a href='https://hockey-graphs.com/2015/03/'>March 2015</a></li> 829 <li><a href='https://hockey-graphs.com/2015/02/'>February 2015</a></li> 830 <li><a href='https://hockey-graphs.com/2015/01/'>January 2015</a></li> 831 <li><a href='https://hockey-graphs.com/2014/12/'>December 2014</a></li> 832 <li><a href='https://hockey-graphs.com/2014/11/'>November 2014</a></li> 833 <li><a href='https://hockey-graphs.com/2014/10/'>October 2014</a></li> 834 <li><a href='https://hockey-graphs.com/2014/09/'>September 2014</a></li> 835 <li><a href='https://hockey-graphs.com/2014/08/'>August 2014</a></li> 836 <li><a href='https://hockey-graphs.com/2014/07/'>July 2014</a></li> 837 <li><a href='https://hockey-graphs.com/2014/06/'>June 2014</a></li> 838 <li><a href='https://hockey-graphs.com/2014/05/'>May 2014</a></li> 839 <li><a href='https://hockey-graphs.com/2014/04/'>April 2014</a></li> 840 <li><a href='https://hockey-graphs.com/2014/03/'>March 2014</a></li> 841 <li><a href='https://hockey-graphs.com/2014/02/'>February 2014</a></li> 842 <li><a href='https://hockey-graphs.com/2014/01/'>January 2014</a></li> 843 </ul> 844 845 </aside> </div> 846 </div><!-- #secondary --> 847 848 <div class="site-info"> 849 <div class="footer-search"> 850 <form role="search" method="get" class="search-form" action="https://hockey-graphs.com/"> 851 <label> 852 <span class="screen-reader-text">Search for:</span> 853 <input type="search" class="search-field" placeholder="Search …" value="" name="s"> 854 </label> 855 <input type="submit" class="search-submit" value="Search"> 856</form> 857 </div> 858 <div class="footer-credits"> 859 <a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a> 860 861 </div> 862 </div><!-- .site-info --> 863 </footer><!-- #colophon --> 864</div><!-- #page --> 865 866<!-- -->
867<script type="speculationrules"> 868{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/files/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/pub/typo/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 869</script>
vendor: 1 bytes, line 869
869
870<script id="grofiles-cards-js" src="//0.gravatar.com/js/hovercards/hovercards.min.js?ver=202639d1133547e8a1f2801609f51cef12522abe7f6647d869e9fbc974fe356a37e613"></script>
vendor: 1 bytes, line 870
870
871<script id="wpgroho-js-extra"> 872var WPGroHo = {"my_hash":""}; 873//# sourceURL=wpgroho-js-extra 874</script>
vendor: 1 bytes, line 874
874
875<script crossorigin='anonymous' type='text/javascript' src='/wp-content/mu-plugins/gravatar-hovercards/wpgroho.js?m=1610363240i'></script>
875 876 877
877<script> 878 // Initialize and attach hovercards to all gravatars 879 ( function() { 880 function init() { 881 if ( typeof Gravatar === 'undefined' ) { 882 return; 883 } 884 885 if ( typeof Gravatar.init !== 'function' ) { 886 return; 887 } 888 889 Gravatar.profile_cb = function ( hash, id ) { 890 WPGroHo.syncProfileData( hash, id ); 891 }; 892 893 Gravatar.my_hash = WPGroHo.my_hash; 894 Gravatar.init( 895 'body', 896 '#wp-admin-bar-my-account', 897 { 898 i18n: { 899 'Edit your profile →': 'Edit your profile →', 900 'View profile →': 'View profile →', 901 'Contact': 'Contact', 902 'Send money': 'Send money', 903 'Sorry, we are unable to load this Gravatar profile.': 'Sorry, we are unable to load this Gravatar profile.', 904 'Gravatar not found.': 'Gravatar not found.', 905 'Too Many Requests.': 'Too Many Requests.', 906 'Internal Server Error.': 'Internal Server Error.', 907 'Is this you?': 'Is this you?', 908 'Claim your free profile.': 'Claim your free profile.', 909 'Email': 'Email', 910 'Home Phone': 'Home Phone', 911 'Work Phone': 'Work Phone', 912 'Cell Phone': 'Cell Phone', 913 'Contact Form': 'Contact Form', 914 'Calendar': 'Calendar', 915 }, 916 } 917 ); 918 } 919 920 if ( document.readyState !== 'loading' ) { 921 init(); 922 } else { 923 document.addEventListener( 'DOMContentLoaded', init ); 924 } 925 } )(); 926 </script>
926 927 928 <div style="display:none"> 929 <div class="grofile-hash-map-45d03599b059424a6601fdaef5ef5cc0"> 930 </div> 931 <div class="grofile-hash-map-c96719fa80df622d1e59d61a474b353f"> 932 </div> 933 <div class="grofile-hash-map-5361aa659e95cdf4493f0f4421bb1558"> 934 </div> 935 <div class="grofile-hash-map-bacc65b3103f3d86bfabf03b6c688d88"> 936 </div> 937 </div> 938 <!-- CCPA [start] --> 939
939<script type="text/javascript"> 940 ( function () { 941 942 var setupPrivacy = function() { 943 944 // Minimal Mozilla Cookie library 945 // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie/Simple_document.cookie_framework 946 var cookieLib = window.cookieLib = {getItem:function(e){return e&&decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null},setItem:function(e,o,n,t,r,i){if(!e||/^(?:expires|max\-age|path|domain|secure)$/i.test(e))return!1;var c="";if(n)switch(n.constructor){case Number:c=n===1/0?"; expires=Fri, 31 Dec 9999 23:59:59 GMT":"; max-age="+n;break;case String:c="; expires="+n;break;case Date:c="; expires="+n.toUTCString()}return"rootDomain"!==r&&".rootDomain"!==r||(r=(".rootDomain"===r?".":"")+document.location.hostname.split(".").slice(-2).join(".")),document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(o)+c+(r?"; domain="+r:"")+(t?"; path="+t:"")+(i?"; secure":""),!0}}; 947 948 // Implement IAB USP API. 949 window.__uspapi = function( command, version, callback ) { 950 951 // Validate callback. 952 if ( typeof callback !== 'function' ) { 953 return; 954 } 955 956 // Validate the given command. 957 if ( command !== 'getUSPData' || version !== 1 ) { 958 callback( null, false ); 959 return; 960 } 961 962 // Check for GPC. If set, override any stored cookie. 963 if ( navigator.globalPrivacyControl ) { 964 callback( { version: 1, uspString: '1YYN' }, true ); 965 return; 966 } 967
968 // Check for cookie. 969 var consent = cookieLib.getItem( 'usprivacy' ); 970 971 // Invalid cookie. 972 if ( null === consent ) { 973 callback( null, false ); 974 return; 975 } 976 977 // Everything checks out. Fire the provided callback with the consent data. 978 callback( { version: 1, uspString: consent }, true ); 979 }; 980 981 // Initialization. 982 document.addEventListener( 'DOMContentLoaded', function() { 983 984 // Internal functions. 985 var setDefaultOptInCookie = function() { 986 var value = '1YNN'; 987 var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; 988 cookieLib.setItem( 'usprivacy', value, 365 * 24 * 60 * 60, '/', domain ); 989 }; 990 991 var setDefaultOptOutCookie = function() { 992 var value = '1YYN'; 993 var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; 994 cookieLib.setItem( 'usprivacy', value, 24 * 60 * 60, '/', domain ); 995 }; 996 997 var setDefaultNotApplicableCookie = function() { 998 var value = '1---'; 999 var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; 1000 cookieLib.setItem( 'usprivacy', value, 24 * 60 * 60, '/', domain ); 1001 }; 1002 1003 var setCcpaAppliesCookie = function( applies ) { 1004 var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; 1005 cookieLib.setItem( 'ccpa_applies', applies, 24 * 60 * 60, '/', domain ); 1006 } 1007 1008 var maybeCallDoNotSellCallback = function() { 1009 if ( 'function' === typeof window.doNotSellCallback ) { 1010 return window.doNotSellCallback(); 1011 } 1012 1013 return false; 1014 } 1015 1016 // Look for usprivacy cookie first. 1017 var usprivacyCookie = cookieLib.getItem( 'usprivacy' ); 1018 1019 // Found a usprivacy cookie. 1020 if ( null !== usprivacyCookie ) { 1021 1022 // If the cookie indicates that CCPA does not apply, then bail. 1023 if ( '1---' === usprivacyCookie ) { 1024 return; 1025 } 1026 1027 // CCPA applies, so call our callback to add Do Not Sell link to the page. 1028 maybeCallDoNotSellCallback(); 1029 1030 // We're all done, no more processing needed. 1031 return; 1032 } 1033 1034 // We don't have a usprivacy cookie, so check to see if we have a CCPA applies cookie. 1035 var ccpaCookie = cookieLib.getItem( 'ccpa_applies' ); 1036 1037 // No CCPA applies cookie found, so we'll need to geolocate if this visitor is from California. 1038 // This needs to happen client side because we do not have region geo data in our $SERVER headers, 1039 // only country data -- therefore we can't vary cache on the region. 1040 if ( null === ccpaCookie ) { 1041 1042 var request = new XMLHttpRequest(); 1043 request.open( 'GET', 'https://public-api.wordpress.com/geo/', true ); 1044 1045 request.onreadystatechange = function () { 1046 if ( 4 === this.readyState ) { 1047 if ( 200 === this.status ) { 1048 1049 // Got a geo response. Parse out the region data. 1050 var data = JSON.parse( this.response ); 1051 var region = data.region ? data.region.toLowerCase() : ''; 1052 var ccpa_applies = ['california', 'colorado', 'connecticut', 'delaware', 'indiana', 'iowa', 'montana', 'new jersey', 'oregon', 'tennessee', 'texas', 'utah', 'virginia'].indexOf( region ) > -1; 1053 // Set CCPA applies cookie. This keeps us from having to make a geo request too frequently. 1054 setCcpaAppliesCookie( ccpa_applies ); 1055 1056 // Check if CCPA applies to set the proper usprivacy cookie. 1057 if ( ccpa_applies ) { 1058 if ( maybeCallDoNotSellCallback() ) { 1059 // Do Not Sell link added, so set default opt-in. 1060 setDefaultOptInCookie(); 1061 } else { 1062 // Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe. 1063 setDefaultOptOutCookie(); 1064 } 1065 } else { 1066 // CCPA does not apply. 1067 setDefaultNotApplicableCookie(); 1068 } 1069 } else { 1070 // Could not geo, so let's assume for now that CCPA applies to be safe. 1071 setCcpaAppliesCookie( true ); 1072 if ( maybeCallDoNotSellCallback() ) { 1073 // Do Not Sell link added, so set default opt-in. 1074 setDefaultOptInCookie(); 1075 } else { 1076 // Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe. 1077 setDefaultOptOutCookie(); 1078 } 1079 } 1080 } 1081 }; 1082 1083 // Send the geo request. 1084 request.send(); 1085 } else { 1086 // We found a CCPA applies cookie. 1087 if ( ccpaCookie === 'true' ) { 1088 if ( maybeCallDoNotSellCallback() ) { 1089 // Do Not Sell link added, so set default opt-in. 1090 setDefaultOptInCookie(); 1091 } else { 1092 // Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe. 1093 setDefaultOptOutCookie(); 1094 } 1095 } else { 1096 // CCPA does not apply. 1097 setDefaultNotApplicableCookie(); 1098 } 1099 } 1100 } ); 1101 }; 1102 1103 // Kickoff initialization. 1104 if ( window.defQueue && defQueue.isLOHP && defQueue.isLOHP === 2020 ) { 1105 defQueue.items.push( setupPrivacy ); 1106 } else { 1107 setupPrivacy(); 1108 } 1109 1110 } )(); 1111 </script>
1111 1112 1113 <!-- CCPA [end] --> 1114 <div class="widget widget_eu_cookie_law_widget"> 1115<div 1116 class="hide-on-button ads-active" 1117 data-hide-timeout="30" 1118 data-consent-expiration="180" 1119 id="eu-cookie-law" 1120 style="display: none" 1121> 1122 <form method="post"> 1123 <input type="submit" value="Close and accept" class="accept" /> 1124 1125 Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use. <br /> 1126To find out more, including how to control cookies, see here: 1127 <a href="https://automattic.com/cookies/" rel="nofollow"> 1128 Cookie Policy </a> 1129 </form> 1130</div> 1131</div> <div id="actionbar" dir="ltr" style="display: none;" 1132 class="actnbr-pub-typo" role="region" aria-label="Site actions"> 1133 <span class="actnbr-live" aria-live="polite"></span> 1134 <ul> 1135 <li class="actnbr-btn"> 1136 <a class="actnbr-action actnbr-actn-comment" href="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/#comments"> 1137 <svg class="actnbr-icon actnbr-icon-comment" width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path d="M18 4H6c-1.1 0-2 .9-2 2v12.9c0 .6.5 1.1 1.1 1.1.3 0 .5-.1.8-.3L8.5 17H18c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm.5 11c0 .3-.2.5-.5.5H7.9l-2.4 2.4V6c0-.3.2-.5.5-.5h12c.3 0 .5.2.5.5v9z"/></svg> <span>Comment </span> 1138 </a> 1139 </li> 1140 <li class="actnbr-btn"> 1141 <a class="actnbr-action actnbr-actn-reblog" href="" role="button"> 1142 <svg class="actnbr-icon actnbr-icon-reusable-block" width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path d="M7 7.2h8.2L13.5 9l1.1 1.1 3.6-3.6-3.5-4-1.1 1 1.9 2.3H7c-.9 0-1.7.3-2.3.9-1.4 1.5-1.4 4.2-1.4 5.6v.2h1.5v-.3c0-1.1 0-3.5 1-4.5.3-.3.7-.5 1.2-.5zm13.8 4V11h-1.5v.3c0 1.1 0 3.5-1 4.5-.3.3-.7.5-1.3.5H8.8l1.7-1.7-1.1-1.1L5.9 17l3.5 4 1.1-1-1.9-2.3H17c.9 0 1.7-.3 2.3-.9 1.5-1.4 1.5-4.2 1.5-5.6z"/></svg><span>Reblog</span> 1143 </a> 1144 </li> 1145 <li class="actnbr-btn actnbr-hidden"> 1146 <a class="actnbr-action actnbr-actn-follow " href="" role="button" aria-haspopup="dialog" aria-expanded="false"> 1147 <svg class="actnbr-icon actnbr-icon-bell" width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M17 11.5c0 1.353.17 2.368.976 3 .266.209.602.376 1.024.5v1H5v-1c.422-.124.757-.291 1.024-.5.806-.632.976-1.647.976-3V9c0-2.8 2.2-5 5-5s5 2.2 5 5v2.5ZM15.5 9v2.5c0 .93.066 1.98.515 2.897l.053.103H7.932a4.018 4.018 0 0 0 .053-.103c.449-.917.515-1.967.515-2.897V9c0-1.972 1.528-3.5 3.5-3.5s3.5 1.528 3.5 3.5Zm-5.492 9.008c0-.176.023-.346.065-.508h3.854A1.996 1.996 0 0 1 12 20c-1.1 0-1.992-.892-1.992-1.992Z"/></svg> <span>Subscribe</span> 1148 </a> 1149 <a class="actnbr-action actnbr-actn-following no-display" href="" role="button"> 1150 <svg class="actnbr-icon actnbr-icon-check" width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" style="fill: none" stroke="currentColor" stroke-width="1.5"><path d="M7 12L10 15L17 8" vector-effect="non-scaling-stroke"/></svg> <span>Subscribed</span> 1151 </a> 1152 <div class="actnbr-popover actnbr-panel actnbr-notice" id="follow-bubble" role="dialog" aria-label="Subscribe to Hockey Graphs"> 1153 <div class="actnbr-follow-bubble"> 1154 <div class="actnbr-panel__group"><a class="actnbr-menu__item actnbr-sitename" href="https://hockey-graphs.com"><img loading='lazy' alt='' src='https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=50&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=50&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=75&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=100&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=150&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=200&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 4x' class='avatar avatar-50' height='50' width='50' /><span class="actnbr-menu__label">Hockey Graphs</span></a></div> <div class="actnbr-panel__group">
1155 <div class="actnbr-message no-display" aria-live="polite"></div> 1156 <form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" class="no-display"> 1157 <div class="actnbr-follow-count">Join 216 other subscribers</div> 1158 <input type="email" name="email" placeholder="Want updates? Enter your email" class="actnbr-email-field" aria-label="Email address" /> 1159 <input type="hidden" name="action" value="subscribe" /> 1160 <input type="hidden" name="blog_id" value="61874218" /> 1161 <input type="hidden" name="source" value="https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/" /> 1162 <input type="hidden" name="sub-type" value="actionbar-follow" /> 1163 <input type="hidden" id="_wpnonce" name="_wpnonce" value="c3493c2bdf" /> <button type="submit" class="actnbr-button">Sign me up</button> 1164 </form> 1165 <p class="actnbr-login-nudge"> 1166 Have a WordPress.com account? <a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fhockey-graphs.com%252F2020%252F10%252F01%252Fbuilding-a-shot-plotting-app-in-shiny%252F">Log in now.</a> </p> 1167 </div> 1168 </div> 1169 </div> 1170 </li> 1171 <li class="actnbr-ellipsis actnbr-hidden"> 1172 <button type="button" class="actnbr-more-toggle" aria-haspopup="true" aria-expanded="false" aria-label="More options"> 1173 <svg class="actnbr-icon actnbr-icon-more-horizontal" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path d="M11 13h2v-2h-2v2zm-6 0h2v-2H5v2zm12-2v2h2v-2h-2z"/></svg> </button> 1174 <div class="actnbr-popover actnbr-menu" role="menu" aria-label="Site options"> 1175 <div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-sitename" href="https://hockey-graphs.com"><img loading='lazy' alt='' src='https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=50&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=50&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=75&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=100&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=150&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=200&d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 4x' class='avatar avatar-50' height='50' width='50' /><span class="actnbr-menu__label">Hockey Graphs</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-shortlink" href="https://wp.me/p4bCjg-6oE"><span class="actnbr-menu__label actnbr-shortlink__text">Copy shortlink</span><span class="actnbr-menu__icon actnbr-shortlink__icon"><svg class="actnbr-icon actnbr-icon-copy" width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M5 4.5h11a.5.5 0 0 1 .5.5v11a.5.5 0 0 1-.5.5H5a.5.5 0 0 1-.5-.5V5a.5.5 0 0 1 .5-.5ZM3 5a2 2 0 0 1 2-2h11a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5Zm17 3v10.75c0 .69-.56 1.25-1.25 1.25H6v1.5h12.75a2.75 2.75 0 0 0 2.75-2.75V8H20Z"/></svg></span><span class="actnbr-menu__icon actnbr-shortlink__icon-copied"><svg class="actnbr-icon actnbr-icon-check" width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" style="fill: none" stroke="currentColor" stroke-width="1.5"><path d="M7 12L10 15L17 8" vector-effect="non-scaling-stroke"/></svg></span></a><a role="menuitem" class="actnbr-menu__item actnbr-reader" href="https://wordpress.com/reader/blogs/61874218/posts/24592"><span class="actnbr-menu__label">View post in Reader</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-subs" href="https://subscribe.wordpress.com/"><span class="actnbr-menu__label">Manage subscriptions</span></a><a role="menuitem" class="actnbr-menu__item actnbr-signup" href="https://wordpress.com/start/"><span class="actnbr-menu__label">Sign up</span></a><a role="menuitem" class="actnbr-menu__item actnbr-login" href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fhockey-graphs.com%252F2020%252F10%252F01%252Fbuilding-a-shot-plotting-app-in-shiny%252F"><span class="actnbr-menu__label">Log in</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item flb-report" href="https://wordpress.com/abuse/?report_url=https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/" target="_blank" rel="noopener noreferrer"><span class="actnbr-menu__label">Report this content</span><span class="actnbr-menu__icon"><svg class="actnbr-icon actnbr-icon-external" width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path d="M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z"/></svg></span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-fold" href=""><span class="actnbr-menu__label">Collapse this bar</span></a></div> </div> 1176 </li> 1177 </ul> 1178 </div> 1179
1179<script> 1180window.addEventListener( "DOMContentLoaded", function () { 1181 var link = document.createElement( "link" ); 1182 link.href = "\/wp-content\/mu-plugins\/jetpack-plugin\/moon\/jetpack_vendor\/automattic\/jetpack-newsletter\/src\/..\/build\/action-bar.css?ver=9e2715140ce0af99d983"; 1183 link.rel = "stylesheet"; 1184 document.head.appendChild( link ); 1185 1186 var script = document.createElement( "script" ); 1187 script.src = "\/wp-content\/mu-plugins\/jetpack-plugin\/moon\/jetpack_vendor\/automattic\/jetpack-newsletter\/src\/..\/build\/action-bar.js?ver=9e2715140ce0af99d983"; 1188 document.body.appendChild( script ); 1189 } ); 1190</script>
1190 1191<link rel="prefetch" href="/wp-content/mu-plugins/jetpack-plugin/moon/_inc/blocks/swiper.js" as="script" /> 1192 <div id="jp-carousel-loading-overlay" style="display: none;"> 1193 <div id="jp-carousel-loading-wrapper"> 1194 <span id="jp-carousel-library-loading"><svg class="jetpack-spinner" width="40" height="40" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/></path></svg></span> 1195 </div> 1196 </div> 1197 <div class="jp-carousel-overlay" style="display: none;"> 1198 1199 <div class="jp-carousel-container"> 1200 <!-- The Carousel Swiper --> 1201 <div 1202 class="jp-carousel-wrap swiper jp-carousel-swiper-container jp-carousel-transitions" 1203 itemscope 1204 itemtype="https://schema.org/ImageGallery"> 1205 <div class="jp-carousel swiper-wrapper"></div> 1206 <div class="jp-swiper-button-prev swiper-button-prev"> 1207 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1208 <mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12"> 1209 <path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/> 1210 </mask> 1211 <g mask="url(#maskPrev)"> 1212 <rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/> 1213 </g> 1214 </svg> 1215 </div> 1216 <div class="jp-swiper-button-next swiper-button-next"> 1217 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1218 <mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12"> 1219 <path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/> 1220 </mask> 1221 <g mask="url(#maskNext)"> 1222 <rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/> 1223 </g> 1224 </svg> 1225 </div> 1226 </div> 1227 <!-- The main close buton --> 1228 <div class="jp-carousel-close-hint"> 1229 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1230 <mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14"> 1231 <path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/> 1232 </mask> 1233 <g mask="url(#maskClose)"> 1234 <rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/> 1235 </g> 1236 </svg> 1237 </div> 1238 <!-- Image info, comments and meta --> 1239 <div class="jp-carousel-info"> 1240 <div class="jp-carousel-info-footer"> 1241 <div class="jp-carousel-pagination-container"> 1242 <div class="jp-swiper-pagination swiper-pagination"></div> 1243 <div class="jp-carousel-pagination"></div> 1244 </div> 1245 <div class="jp-carousel-photo-title-container"> 1246 <div class="jp-carousel-photo-caption"></div> 1247 </div> 1248 <div class="jp-carousel-photo-icons-container"> 1249 <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Toggle photo metadata visibility"> 1250 <span class="jp-carousel-icon"> 1251 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1252 <mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> 1253 <path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/> 1254 </mask> 1255 <g mask="url(#maskInfo)"> 1256 <rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/> 1257 </g> 1258 </svg> 1259 </span> 1260 </a> 1261 <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Toggle photo comments visibility"> 1262 <span class="jp-carousel-icon"> 1263 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1264 <mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> 1265 <path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/> 1266 </mask> 1267 <g mask="url(#maskComments)"> 1268 <rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/> 1269 </g> 1270 </svg> 1271 1272 <span class="jp-carousel-has-comments-indicator" aria-label="This image has comments."></span> 1273 </span> 1274 </a> 1275 </div>
1276 </div> 1277 <div class="jp-carousel-info-extra"> 1278 <div class="jp-carousel-info-content-wrapper"> 1279 <div class="jp-carousel-photo-title-container"> 1280 <div class="jp-carousel-photo-title"></div> 1281 </div> 1282 <div class="jp-carousel-comments-wrapper"> 1283 <div id="jp-carousel-comments-loading"> 1284 <span>Loading Comments...</span> 1285 </div> 1286 <div class="jp-carousel-comments"></div> 1287 <div id="jp-carousel-comment-form-container"> 1288 <span id="jp-carousel-comment-form-spinner"><svg class="jetpack-spinner" width="20" height="20" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/></path></svg></span> 1289 <div id="jp-carousel-comment-post-results"></div> 1290 <form id="jp-carousel-comment-form"> 1291 <label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label> 1292 <textarea 1293 name="comment" 1294 class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea" 1295 id="jp-carousel-comment-form-comment-field" 1296 placeholder="Write a Comment..." 1297 ></textarea> 1298 <div id="jp-carousel-comment-form-submit-and-info-wrapper"> 1299 <div id="jp-carousel-comment-form-commenting-as"> 1300 <fieldset> 1301 <label for="jp-carousel-comment-form-email-field">Email (Required)</label> 1302 <input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" /> 1303 </fieldset> 1304 <fieldset> 1305 <label for="jp-carousel-comment-form-author-field">Name (Required)</label> 1306 <input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" /> 1307 </fieldset> 1308 <fieldset> 1309 <label for="jp-carousel-comment-form-url-field">Website</label> 1310 <input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" /> 1311 </fieldset> 1312 </div> 1313 <input 1314 type="submit" 1315 name="submit" 1316 class="jp-carousel-comment-form-button" 1317 id="jp-carousel-comment-form-button-submit" 1318 value="Post Comment" /> 1319 </div> 1320 </form> 1321 </div> 1322 </div> 1323 <div class="jp-carousel-image-meta"> 1324 <div class="jp-carousel-title-and-caption"> 1325 <div class="jp-carousel-photo-info"> 1326 <div class="jp-carousel-caption" itemprop="caption description"></div> 1327 </div> 1328 1329 <div class="jp-carousel-photo-description"></div> 1330 </div> 1331 <a class="jp-carousel-image-download" href="#" aria-label="Download image" target="_blank" style="display: none;"> 1332 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1333 <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18"> 1334 <path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/> 1335 </mask> 1336 <g mask="url(#mask0)"> 1337 <rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/> 1338 </g> 1339 </svg> 1340 <span class="jp-carousel-download-text"></span> 1341 </a> 1342 <div class="jp-carousel-image-map" style="display: none;"></div> 1343 </div> 1344 </div>
1345 </div> 1346 </div> 1347 </div> 1348 1349 </div> 1350 1351
1351<script type="text/javascript"> 1352 window.WPCOM_sharing_counts = {"https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/":24592}; 1353 </script>
1353 1354 1355
1355<script type="text/javascript"> 1356 (function () { 1357 var wpcom_reblog = { 1358 source: 'toolbar', 1359 1360 toggle_reblog_box_flair: function (obj_id, post_id) { 1361 1362 // Go to site selector. This will redirect to their blog if they only have one. 1363 const postEndpoint = `https://wordpress.com/post`; 1364 1365 // Ideally we would use the permalink here, but fortunately this will be replaced with the 1366 // post permalink in the editor. 1367 const originalURL = `${ document.location.href }?page_id=${ post_id }`; 1368 1369 const url = 1370 postEndpoint + 1371 '?url=' + 1372 encodeURIComponent( originalURL ) + 1373 '&is_post_share=true' + 1374 '&v=5'; 1375 1376 const redirect = function () { 1377 if ( 1378 ! window.open( url, '_blank' ) 1379 ) { 1380 location.href = url; 1381 } 1382 }; 1383 1384 if ( /Firefox/.test( navigator.userAgent ) ) { 1385 setTimeout( redirect, 0 ); 1386 } else { 1387 redirect(); 1388 } 1389 }, 1390 }; 1391 1392 window.wpcom_reblog = wpcom_reblog; 1393 })(); 1394 </script>
vendor: 1 bytes, line 1394
1394
1395<script crossorigin='anonymous' type='text/javascript' src='/_static/??-eJx9jEsOwjAMBS9EcIuqdoU4i2msNKnzoXbI9ckO1AXbeTMPWjFrTkpJ4cnZmcLV+STQ8mHRilkZRUggdITK5n27BrnATxbrN/LWkQpQ7WvePRnGBkqxMCqd+J8f9nu3X5UqbZgs09HlR7yPyzxM0zyMS/gAPatD8g=='></script>
vendor: 1 bytes, line 1395
1395
1396<script id="wp-hooks-js" src="/wp-content/plugins/gutenberg-core/v24.0.0/build/scripts/hooks/index.min.js?m=1789650619i&ver=f0f188028580e8dc1255"></script>
vendor: 1 bytes, line 1396
1396
1397<script id="wp-i18n-js" src="/wp-content/plugins/gutenberg-core/v24.0.0/build/scripts/i18n/index.min.js?m=1789650619i&ver=1dfe7db3940c23ea9216"></script>
vendor: 1 bytes, line 1397
1397
1398<script id="wp-i18n-js-after"> 1399wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); 1400//# sourceURL=wp-i18n-js-after 1401</script>
vendor: 1 bytes, line 1401
1401
1402<script id="verbum-settings-js-before"> 1403window.VerbumComments = {"Log in or provide your name and email to leave a reply.":"Log in or provide your name and email to leave a reply.","Log in or provide your name and email to leave a comment.":"Log in or provide your name and email to leave a comment.","Receive web and mobile notifications for posts on this site.":"Receive web and mobile notifications for posts on this site.","Name":"Name","Email (address never made public)":"Email (address never made public)","Website (optional)":"Website (optional)","Leave a reply. (log in optional)":"Leave a reply. (log in optional)","Leave a comment. (log in optional)":"Leave a comment. (log in optional)","Log in to leave a reply.":"Log in to leave a reply.","Log in to leave a comment.":"Log in to leave a comment.","Logged in via %s":"Logged in via %s","Log out":"Log out","Your browser is blocking the cookies needed to log in and comment here. Allow cookies in your privacy settings, then reload the page.":"Your browser is blocking the cookies needed to log in and comment here. Allow cookies in your privacy settings, then reload the page.","Email":"Email","(Address never made public)":"(Address never made public)","Instantly":"Instantly","Daily":"Daily","Reply":"Reply","Comment":"Comment","WordPress":"WordPress","Weekly":"Weekly","Notify me of new posts":"Notify me of new posts","Email me new posts":"Email me new posts","Email me new comments":"Email me new comments","Cancel":"Cancel","Write a comment...":"Write a comment...","Write a reply...":"Write a reply...","Website":"Website","Optional":"Optional","We'll keep you in the loop!":"We'll keep you in the loop!","Loading your comment...":"Loading your comment...","Discover more from":"Discover more from Hockey Graphs","Subscribe now to keep reading and get access to the full archive.":"Subscribe now to keep reading and get access to the full archive.","Continue reading":"Continue reading","Never miss a beat!":"Never miss a beat!","Interested in getting blog post updates? Simply click the button below to stay in the loop!":"Interested in getting blog post updates? Simply click the button below to stay in the loop!","Enter your email address":"Enter your email address","Subscribe":"Subscribe","Comment sent successfully":"Comment sent successfully","Save my name, email, and website in this browser for the next time I comment.":"Save my name, email, and website in this browser for the next time I comment.","hovercardi18n":{"Edit your profile \u2192":"Edit your profile \u2192","View profile \u2192":"View profile \u2192","Contact":"Contact","Send money":"Send money","Gravatar not found.":"Gravatar not found.","This profile is private.":"This profile is private.","Too Many Requests.":"Too Many Requests.","Internal Server Error.":"Internal Server Error.","Sorry, we are unable to load this Gravatar profile.":"Sorry, we are unable to load this Gravatar profile."},"siteId":61874218,"postId":24592,"mustLogIn":false,"requireNameEmail":true,"commentRegistration":false,"connectURL":"https://hockeygraphsdotcom.wordpress.com/public.api/connect/?action=request\u0026domain=hockey-graphs.com","logoutURL":"https://hockeygraphsdotcom.wordpress.com/wp-login.php?action=logout\u0026_wpnonce=ba114a174e","homeURL":"https://hockey-graphs.com/","subscribeToBlog":true,"subscribeToComment":true,"isJetpackCommentsLoggedIn":false,"jetpackUsername":"","jetpackUserId":0,"jetpackSignature":"","jetpackAvatar":"https://0.gravatar.com/avatar/?s=96\u0026amp;d=identicon\u0026amp;r=G","enableBlocks":true,"enableSubscriptionModal":true,"currentLocale":"en","isJetpackComments":false,"allowedBlocks":["core/paragraph","core/list","core/code","core/list-item","core/quote","core/image","core/embed","core/quote","core/code"],"embedNonce":"cb14ccd6fe","verbumBundleUrl":"/wp-content/mu-plugins/jetpack-mu-wpcom-plugin/moon/jetpack_vendor/automattic/jetpack-mu-wpcom/src/features/verbum-comments/dist/index.js","isRTL":false,"vbeCacheBuster":1789740582,"iframeUniqueId":0,"colorScheme":false} 1404//# sourceURL=verbum-settings-js-before 1405</script>
vendor: 1 bytes, line 1405
1405
1406<script data-wp-strategy="defer" defer id="verbum-dynamic-loader-js" src="/wp-content/mu-plugins/jetpack-mu-wpcom-plugin/moon/jetpack_vendor/automattic/jetpack-mu-wpcom/src/build/verbum-comments/assets/dynamic-loader.js?m=1772518873i&minify=false&ver=8b5296f9195db92c42e4"></script>
vendor: 1 bytes, line 1406
1406
1407<script id="coblocks-loader-js-extra"> 1408var wpcom_coblocks_js = {"coblocks_masonry_js":"https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/js/coblocks-masonry.min.js?m=1681832297i","coblocks_lightbox_js":"https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/js/coblocks-lightbox.min.js?m=1681832297i","jquery_core_js":"/wp-includes/js/jquery/jquery.min.js","jquery_migrate_js":"/wp-includes/js/jquery/jquery-migrate.min.js","masonry_js":"/wp-includes/js/masonry.min.js","imagesloaded_js":"/wp-includes/js/imagesloaded.min.js"}; 1409var coblocksLigthboxData = {"closeLabel":"Close Gallery","leftLabel":"Previous","rightLabel":"Next"}; 1410//# sourceURL=coblocks-loader-js-extra 1411</script>
vendor: 1 bytes, line 1411
1411
1412<script id="jetpack-carousel-js-extra"> 1413var jetpackSwiperLibraryPath = {"url":"/wp-content/mu-plugins/jetpack-plugin/moon/_inc/blocks/swiper.js"}; 1414var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https://hockey-graphs.com/wp-admin/admin-ajax.php","nonce":"0ce444d1dd","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","image_label":"Open image in full-screen.","download_original":"View full size \u003Cspan class=\"photo-size\"\u003E{0}\u003Cspan class=\"photo-size-times\"\u003E\u00d7\u003C/span\u003E{1}\u003C/span\u003E","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https://hockeygraphsdotcom.wordpress.com/wp-login.php?redirect_to=https%3A%2F%2Fhockey-graphs.com%2F2020%2F10%2F01%2Fbuilding-a-shot-plotting-app-in-shiny%2F","blog_id":"61874218","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"stats_query_args":"blog=61874218&v=wpcom&tz=-5&user_id=0&subd=hockeygraphsdotcom","is_public":"1"}; 1415//# sourceURL=jetpack-carousel-js-extra 1416</script>
vendor: 1 bytes, line 1416
1416
1417<script id="sharing-js-js-extra"> 1418var sharing_js_options = {"lang":"en","counts":"1","is_stats_active":"1"}; 1419//# sourceURL=sharing-js-js-extra 1420</script>
vendor: 1 bytes, line 1420
1420
1421<script id="jetpack-script-data-js-before"> 1422window.JetpackScriptData = {"site":{"host":"wpcom","is_wpcom_platform":true}}; 1423//# sourceURL=jetpack-script-data-js-before 1424</script>
vendor: 1 bytes, line 1424
1424
1425<script crossorigin='anonymous' type='text/javascript' src='/_static/??-eJydUNtugzAM/aGFwFqt3cO0T6lMEqghN8UOLX8/RoFV07RVe0uOz8XH8hKFCp6NZxltbtGTVKG2QfUkn4vqWFSC0EVrRDJDsZcaiWX3RRI2gDapcOiLjp7knR+fjTMkY64ljzF8qjwM2AJjeIRMPUZh0feiCSqTaPC6qtArm/XEnzdxbnKY9ot2/GkPl8VarTMcQfVigi5xEi4D6ULw6/A0GK9DkpA5OGBGtcmAyDDJOqPVG0gqYWShgeGB5PvA01RjMVOQQiZjN94K/FEIeiRnWOyK8ma3Ak2ayfoX7RpxO8W37/+r0BmS0aD1OD/Rt0uHd/dWHV7L8rB/2R27D6Q37Gg='></script>
vendor: 1 bytes, line 1425
1425
1426<script id="sharing-js-js-after"> 1427window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {}; 1428window.WPCOM_sharing_popups[ "twitter" ] = "menubar=1,resizable=1,width=600,height=350"; 1429window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {}; 1430window.WPCOM_sharing_popups[ "facebook" ] = "menubar=1,resizable=1,width=600,height=400"; 1431//# sourceURL=sharing-js-js-after 1432</script>
vendor: 1 bytes, line 1432
1432
1433<script id="wp-emoji-settings" type="application/json"> 1434{"baseUrl":"https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/","ext":".png","svgUrl":"https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/svg/","svgExt":".svg","source":{"concatemoji":"/wp-includes/js/wp-emoji-release.min.js?m=1783090810i&ver=7.1.1-alpha-63587"}} 1435</script>
vendor: 1 bytes, line 1435
1435
1436<script type="module"> 1437/*! This file is auto-generated */ 1438var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); 1439//# sourceURL=/wp-includes/js/wp-emoji-loader.min.js 1440</script>
1440 1441 <iframe src='https://widgets.wp.com/likes/master.html?ver=20260924#ver=20260924' scrolling='no' id='likes-master' name='likes-master' style='display:none;'></iframe> 1442 <div id='likes-other-gravatars' role="dialog" aria-hidden="true" tabindex="-1"><div class="likes-text"><span>%d</span></div><ul class="wpl-avatars sd-like-gravatars"></ul></div> 1443
1443<script src="//stats.wp.com/w.js?69" defer></script>
1443
1443<script type="text/javascript"> 1444_tkq = window._tkq || []; 1445_stq = window._stq || []; 1446_tkq.push(['storeContext', {'blog_id':'61874218','blog_tz':'-5','user_lang':'en','blog_lang':'en','user_id':'0'}]); 1447 // Prevent sending pageview tracking from WP-Admin pages. 1448 _stq.push(['view', {'blog':'61874218','v':'wpcom','tz':'-5','user_id':'0','post':'24592','subd':'hockeygraphsdotcom'}]); 1449 _stq.push(['extra', {'crypt':'UE5XaGUuOTlwaD85flAmcm1mcmZsaDhkV11YdWtpP0NsWnVkPS9sL0ViLndld3BuVT01Uj14Ti1yYTBnX3xuYUQ3Qz1oblZbVHV3MTZoVXFwTTVDK2wuPT1KWzJNV19iQk9bTmF0PUUlUlYzbW1nYyxHTnlKQiUsT0hKb2tYK09aZkN6LzJmYVtxMGpoLT9rJnJRJXg4S3ZNSmtWZ0JzNHIrQ3Ntem9CVHcleXBvbTc/QlFlRlVvbHB6cmZDdT9RZDAySXFDRHgtVFZvai1PcktOdXxFLGZnWUZOfj9wVFNyV0JdRj11aktLc0pqTjJpUWZFaWZnND1TLXhqdGpUVSVKSF1pY3QwfnpxZTJRTT0yWnM2LS5ueW5OcVdaaV15d3I5X0lFX3FnR1k1fGFYcV9TaFcwTVJ8Jj8waFRrUTZqQW90LW8zZTdKNy5zd3IxdHxlMlZOUHlSP1kvM0NqMmdjLUNpclc9TGU1cHg='}]); 1450_stq.push([ 'clickTrackerInit', '61874218', '24592' ]); 1451</script>
1451 1452<noscript><img src="https://pixel.wp.com/b.gif?v=noscript" style="height:1px;width:1px;overflow:hidden;position:absolute;bottom:1px;" alt="" /></noscript> 1453<meta id="bilmur" property="bilmur:data" content="" data-provider="wordpress.com" data-service="simple" data-site-tz="Etc/GMT+5" data-custom-props="{"logged_in":"0","wptheme":"pub\/typo","wptheme_is_block":"0"}" > 1454
1454<script defer src="/wp-content/js/bilmur.min.js?i=19&m=202639"></script>
1454
1455<script> 1456(function() { 1457 'use strict'; 1458 1459 const fetches = {}; 1460 const promises = {}; 1461 const urls = { 1462 'wp-polyfill': '/wp-includes/js/dist/vendor/wp-polyfill.min.js?m=1786440387i&ver=3.15.0', 1463 'verbum': '/wp-content/mu-plugins/jetpack-mu-wpcom-plugin/moon/jetpack_vendor/automattic/jetpack-mu-wpcom/src/build/verbum-comments/verbum-comments.js?m=1789673130i&minify=false&ver=1277503d9f869014c379' 1464 }; 1465 const loaders = { 1466 'verbum': () => { 1467 fetchExternalScript('wp-polyfill'); 1468 fetchExternalScript('verbum'); 1469 promises['wp-polyfill'] = promises['wp-polyfill'] || loadWPScript('wp-polyfill'); 1470 promises['verbum'] = promises['verbum'] || promises['wp-polyfill'].then( () => loadWPScript('verbum') ); 1471 return promises['verbum']; 1472 }, 1473 1474 }; 1475 const scriptExtras = { 1476 1477 }; 1478 1479 window.WP_Enqueue_Dynamic_Script = { 1480 loadScript: (handle) => { 1481 if (!loaders[handle]) { 1482 console.error('WP_Enqueue_Dynamic_Script: unregistered script `' + handle + '`.'); 1483 } 1484 return loaders[handle](); 1485 } 1486 }; 1487 1488 function fetchExternalScript(handle) { 1489 if (!urls[handle]) { 1490 return Promise.resolve(); 1491 } 1492 1493 fetches[handle] = fetches[handle] || fetch(urls[handle], { mode: 'no-cors' }); 1494 return fetches[handle]; 1495 } 1496 1497 function runExtraScript(handle, type, index) { 1498 const id = 'wp-enqueue-dynamic-script:' + handle + ':' + type + ':' + (index + 1); 1499 const template = document.getElementById(id); 1500 if (!template) { 1501 return Promise.reject(); 1502 } 1503 1504 const script = document.createElement( 'script' ); 1505 script.innerHTML = template.innerHTML; 1506 document.body.appendChild( script ); 1507 return Promise.resolve(); 1508 } 1509 1510 function loadExternalScript(handle) { 1511 if (!urls[handle]) { 1512 return Promise.resolve(); 1513 } 1514 1515 return fetches[handle].then(() => { 1516 return new Promise((resolve, reject) => { 1517 const script = document.createElement('script'); 1518 script.onload = () => resolve(); 1519 script.onerror = (e) => reject(e); 1520 script.src = urls[handle]; 1521 document.body.appendChild(script); 1522 }); 1523 }); 1524 } 1525 1526 function loadExtra(handle, pos) { 1527 const count = (scriptExtras[handle] && scriptExtras[handle][pos]) || 0; 1528 let promise = Promise.resolve(); 1529 1530 for (let i = 0; i < count; i++) { 1531 promise = promise.then(() => runExtraScript(handle, pos, i)); 1532 } 1533 1534 return promise; 1535 } 1536 1537 function loadWPScript(handle) { 1538 // Core loads scripts in this order. See: https://github.com/WordPress/WordPress/blob/a59eb9d39c4fcba834b70c9e8dfd64feeec10ba6/wp-includes/class-wp-scripts.php#L428. 1539 return loadExtra(handle, 'translations') 1540 .then(() => loadExtra(handle, 'before')) 1541 .then(() => loadExternalScript(handle)) 1542 .then(() => loadExtra(handle, 'after')); 1543 } 1544} )(); 1545</script>
1545 1546 1547</body> 1548</html> 1549<!-- 1550 generated in 0.266 seconds 1551 145066 bytes batcached for 300 seconds 1552-->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.