PageSourceSearch

https://hockey-graphs.com/2020/10/01/building-a-shot-plotting-app-in-shiny/

html hockey-graphs.com collected 2026-10-02 06:17:52 UTC 144,363 bytes, 1,552 lines download raw bytes

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 &raquo; Feed" href="https://hockey-graphs.com/feed/" />
160<link rel="alternate" type="application/rss+xml" title="Hockey Graphs &raquo; Comments Feed" href="https://hockey-graphs.com/comments/feed/" />
161<link rel="alternate" type="application/rss+xml" title="Hockey Graphs &raquo; Building a Shot-Plotting App in&nbsp;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&#038;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&#038;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&amp;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&amp;url=https%3A%2F%2Fhockey-graphs.com%2F2020%2F10%2F01%2Fbuilding-a-shot-plotting-app-in-shiny%2F&amp;for=wpcom-auto-discovery" /><link rel="alternate" type="application/xml+oembed" href="https://public-api.wordpress.com/oembed/?format=xml&amp;url=https%3A%2F%2Fhockey-graphs.com%2F2020%2F10%2F01%2Fbuilding-a-shot-plotting-app-in-shiny%2F&amp;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.&nbsp; 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&nbsp;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.&nbsp; 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&#039;t however exactly the quickest process to deal with.&hellip;" />
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 &#8211; 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 &#8211; 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 &#8211; 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 &#8211; Winnipeg Jets I &#8211; 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 &#8211; 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 &#8211; 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 &#8211; 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 &#8211; 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 &#8211; Kansas City Scouts &#8211; 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 &#8211; California Golden Seals &#8211; 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 &#8211; 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&nbsp;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.&nbsp;</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&#8217;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&#8217;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.&nbsp;</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.&nbsp;</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.&nbsp;</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&#8217;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&#8217;s neat.&nbsp;</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&amp;post_id=24592&amp;origin=hockeygraphsdotcom.wordpress.com&amp;obj_id=61874218-24592-6ab580d00e2f9&amp;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">&larr;</span> Chatter Charts &#8211; Visualizing Real-Time Fan&nbsp;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&nbsp;cycles <span class="meta-nav">&rarr;</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 &ldquo;<span>Building a Shot-Plotting App in&nbsp;Shiny</span>&rdquo;		</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&#8217;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&#039;s avatar' src='https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=32&#038;d=identicon&#038;r=G' srcset='https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=32&#038;d=identicon&#038;r=G 1x, https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=48&#038;d=identicon&#038;r=G 1.5x, https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=64&#038;d=identicon&#038;r=G 2x, https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=96&#038;d=identicon&#038;r=G 3x, https://2.gravatar.com/avatar/535f0a8269f98f7fc6da63b2378658a8ef05d2ca23a8a925d41e1e39ca5e8a4c?s=128&#038;d=identicon&#038;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)&#039;s avatar' src='https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=32%2C32&#038;ssl=1' srcset='https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=32%2C32&#038;ssl=1 1x, https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=48%2C48&#038;ssl=1 1.5x, https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=64%2C64&#038;ssl=1 2x, https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=96%2C96&#038;ssl=1 3x, https://i0.wp.com/pbs.twimg.com/profile_images/892265877164269568/GH7kQq6m_normal.jpg?resize=128%2C128&#038;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 &#8211; only see the old faithful demo.  Would love to start using this for my son&#8217;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&#039;s avatar' src='https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=32&#038;d=identicon&#038;r=G' srcset='https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=32&#038;d=identicon&#038;r=G 1x, https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=48&#038;d=identicon&#038;r=G 1.5x, https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=64&#038;d=identicon&#038;r=G 2x, https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=96&#038;d=identicon&#038;r=G 3x, https://0.gravatar.com/avatar/90784fecded68bb76be6de42dd4f913e1bd209b61dba74e87c56a4ee61aa71cf?s=128&#038;d=identicon&#038;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&#039;s avatar' src='https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=32&#038;d=identicon&#038;r=G' srcset='https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=32&#038;d=identicon&#038;r=G 1x, https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=48&#038;d=identicon&#038;r=G 1.5x, https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=64&#038;d=identicon&#038;r=G 2x, https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=96&#038;d=identicon&#038;r=G 3x, https://1.gravatar.com/avatar/4f9a95ea3206757ee0d854f9d93c03de3f506b3abfd8df4aac2fe292bfcdab82?s=128&#038;d=identicon&#038;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>&#916;<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&nbsp;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 &#8211; Part 2 of&nbsp;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&nbsp;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 &#8211; Part 1 of&nbsp;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&nbsp;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 &hellip;" 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 &amp; 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&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=50&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=75&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=100&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=150&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=200&#038;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&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=50&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=75&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=100&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=150&#038;d=https%3A%2F%2Fs-ssl.wordpress.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/1e1e429dccef87f7696561f84466c4e4c82758f72a7927a9fef8f0ce51651581?s=200&#038;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&#038;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&#038;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&#038;minify=false&#038;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="{&quot;logged_in&quot;:&quot;0&quot;,&quot;wptheme&quot;:&quot;pub\/typo&quot;,&quot;wptheme_is_block&quot;:&quot;0&quot;}"   >
1454		
1454<script defer src="/wp-content/js/bilmur.min.js?i=19&amp;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.