Background
Stumbled upon the fantastic application WinSplits Online. Thought that the interesting real-world data found there could be used when creating a spare time project investigating JavaScript frameworks from Chart.js and Vue. Thought it would be fun and educating to examine different ways of visualizing, comparing and presenting various information about the athletes performances in tables/charts/graphs (and yes, so far it has really been a fun and educating trip).
Note: This is the first version of this analyzing tool. Hopefully it will be enhanced in the future.
Documentation
The data is more or less only lists of split times from a series of controls, but it can be used in many, many ways as you will see.
You can thoroughly examine the data in detail from the comprehensive results table and different charts.
Definitions
Explanations of some of the terms that are used.
- Number of controls
- The actual number of controls, denoted n.
- Number of legs
- The number of controls plus one, i.e. n+1, since the last leg will be from the last control to the finish line. The legs are start to control 1, control 1 to control 2, ..., control n-1 to control n and control n to finish line.
- Leg time
- The time it takes between two consecutive controls, with start to first control and last control to finish line as special cases.
- Split time
- The total elapsed time from the start to a specific control, with the special case of start to finish (total time).
- Optimal total time
- This value is calculated by adding all the best leg times and is an indicator of what the total time optimally could have been.
- Actual time
- The actual time for a leg or split.
- Relative time
-
Often it is more interesting to show the relative time instead of the actual time. The relative time is (most often) calculated from the best leg or split time. For example, if the best time for a leg is
8:45
and the leg time for athlete X is10:20
the relative time for athlete X on the leg is+1:35
. The relative times are always prefixed with either+
or-
. - %-loss
- The time (in percentage) an athlete has lost, compared to the fastest athlete, on a specific leg, i.e. the leg times are compared. This value can be used when calculating possible mistakes.
- Average %-loss
- The average %-loss value for all legs, i.e. the arithmetic mean of n+1 values.
- Median %-loss
- The median %-loss value for all legs, i.e. the median of n+1 values.
- %-behind
- The time (in percentage) an athlete is behind the fastest athlete on a specific control, i.e. the split times are compared. The %-behind value has nothing to do with the average or median values for %-loss. The %-behind value for an athlete often fluctuates for the first controls and stabilizes towards the finish line (which is natural since the value is a comparison against the elapsed split time).
- Possible mistake
- Indicates that an athlete may have made a mistake on a leg. The %-loss on a specific leg is compared against the median %-loss value, and if the specific value is "much" larger than the median value, the leg is marked as a possible mistake. The percentage points for how much larger a value should be can be configured (default value is 25). For example, if athlete X has a median %-loss of 15%, then a leg with %-loss 39% will not be marked as possible mistake, but a leg with %-loss of 40% will.
Data importer
It is quite easy to import your own data to analyze. Either you import data that contain actual split times or relative split times.
Note: When using actual, the time at each control is the actual leg/split time at that control, regardless of the athlete's place. When using relative, the time at each control is instead the relative leg/split time at that control (prefixed with a '+'), unless the athlete's place is 1.
-
Visit WinSplits Online.
- Choose your event.
-
Verify the state of the two checkboxes "relative split times" and "relative total times":
- If using actual split times, the two boxes should be cleared.
- If using relative split times, the two boxes should be checked.
- Press OK.
- Use the "Export the split times in text format" link at the top.
- Copy all the generated text content (Ctrl/Cmd + A and Ctrl/Cmd + C).
-
Back here in NNM Orienteering Analyzer, in the section Raw data importer.
- Make sure that you select the correct "Type of split times", either ACTUAL or RELATIVE.
- Paste into the "Exported split times" text area (Ctrl/Cmd + V).
- The page is automatically updated with your new information.
If you have split times data from other sources, you can of course use those also, if you follow the same easy-to-grasp format as WinSplits Online exports.
Note: Below is a small example with the ACTUAL type. To try it out, copy the text, select ACTUAL as "Type of split times", paste in the text into the "Exported split times" text area.
Pos Name Total Diff S-1 1-2 2-3 3-4 4-F Name Club Club 1 Alice 45.00 +0.00 15.00 (2) 7.00 (4) 12.00 (1) 9.00 (2) 2.00 (2) Alice DEN 15.00 (2) 22.00 (3) 34.00 (1) 43.00 (2) 45.00 (1) DEN 2 Ben 45.15 +0.15 16.00 (3) 5.30 (1) 12.45 (3) 8.30 (1) 2.30 (4) Ben NOR 16.00 (3) 21.30 (2) 34.15 (3) 42.45 (1) 45.15 (2) NOR 3 Carol 45.45 +0.45 14.30 (1) 6.30 (2) 13.00 (4) 10.00 (3) 1.45 (1) Carol SWE 14.30 (1) 21.00 (1) 34.00 (1) 44.00 (3) 45.45 (3) SWE 4 Dave 48.45 +3.45 16.30 (4) 6.45 (3) 12.15 (2) 11.00 (4) 2.15 (3) Dave FIN 16.30 (4) 23.15 (4) 35.30 (4) 46.30 (4) 48.45 (4) FIN
Note: On page reload, one of the pre-defined example events (as described in the Configuration section below) is randomly selected.
Configuration
From the top-right of the page you can open the configuration modal.
- You can define how many results/athletes you want to show from the total set of participants (the default is 15). You can also select a subset from these (see the "Selecting athletes" section below). A great way to minimize the clutter.
-
You can show the best leg/split times in the results table. These are shown with relative values compared to the second best time.
-
If second best is
+15
seconds, it means that best will be shown as-15
seconds (in athlete details negative values are always shown). -
If second best is
0
seconds, it means that at least two athletes are best. This would mean that we should show zeroes in several cells, but (as in athlete details) these zeroes are never shown.
-
If second best is
-
In the results table, you can mark the "siblings" to a cell, which will make it easier to compare the data. When you hover over the cells in the results table, each corresponding cell in the other rows, will be marked.
- This hovering color can be configured.
- In the results table, you can toggle the view of tooltips for the cells. These tooltips will show information about the actual time for the leg/split. For the leg you will also see the %-loss and for the split you will see the %-behind. A ☆ is displayed for the best leg/split times.
- You can show the average and median values for the %-losses together with the %-behind values at the finish.
- You can configure the percentage points for the possible mistake marker in the results table. The default value is 25 (currently configured as {{ userConfiguration.possibleMistakePercentagePoints }}).
-
You can choose some pre-defined example events. This can be handy to examine the functionality, since you will see how some of the best athletes in the world have performed. The examples are taken from the following events:
- WOC 2016, Long Distance, Men
- WOC 2016, Long Distance, Women
- WOC 2016, Middle Distance, Men
- WOC 2016, Middle Distance, Women
- O-Ringen 2019, stage 3, H21 Elit
- O-Ringen 2019, stage 3, D21 Elit
- O-Ringen 2018, stage 1, H21 Elit
- O-Ringen 2018, stage 1, D21 Elit
- WOC 2019, Middle Final, Men
- WOC 2019, Middle Final, Women
- WOC 2019, Long Distance, Men
- WOC 2019, Long Distance, Women
- SM 2020, Middle Distance, Men
- SM 2020, Middle Distance, Women
- SM 2020, Long Distance, Men
- SM 2020, Long Distance, Women
- SM 2020, Sprint, Men
- SM 2020, Sprint, Women
- WOC 2021, Sprint, Men
- WOC 2021, Sprint, Women
- WOC 2021, Middle Distance, Men [Event details, Map]
- WOC 2021, Middle Distance, Women [Event details, Map]
- WOC 2021, Long Distance, Men [Event details, Map]
- WOC 2021, Long Distance, Women [Event details, Map]
- World Cup 2021, round 2, Long Distance, Men [Event details, Map]
- World Cup 2021, round 2, Long Distance, Women [Event details, Map]
- World Cup 2021, round 2, Middle Distance, Men [Event details, Map]
- World Cup 2021, round 2, Middle Distance, Women [Event details, Map]
- WOC 2022, Sprint, Women [Event details, Map]
- WOC 2022, Sprint, Men [Event details, Map]
- World Cup 2023, round 1, Long Distance, Women [Event details, Map]
- World Cup 2023, round 1, Long Distance, Men [Event details, Map]
- World Cup 2023, round 1, Middle Distance, Women [Event details, Map]
- World Cup 2023, round 1, Middle Distance, Men [Event details, Map]
- WOC 2023, Long, Men [Event details, Map]
- WOC 2023, Long, Women [Event details, Map]
- WOC 2023, Middle, Men [Event details, Map]
- WOC 2023, Middle, Women [Event details, Map]
Note: Currently, the examples are all using the relative split times format.
Note: On page reload, the configuration values are reset to default.
List of shown athletes
A compact view of the participants. The list reflects the current sorting.
Results table
The times are often given without useless zeroes, so values below a minute is given with seconds, values below an hour is given with minutes and seconds.
Gold, silver and bronze background colors are shown to indicate the three fastest leg/split times.
Possible mistakes for each leg are shown. It is currently not the same formula used as in WinSplits Online. The length of a leg is not considered. The median %-loss for the legs for an athlete is calculated and if the %-loss for a leg is more than {{ userConfiguration.possibleMistakePercentagePoints}} percentage points higher than the median, the cell is marked as a possible mistake. The percentage point value may be configured.
-
1st place (gold) -
2nd place (silver) -
3rd place (bronze) -
Possible mistake
The optimal total time is shown. The difference for the winner to the total optimal time is also shown.
You can sort the table on leg/split time for each control. The header for the current sorting column is marked with a green background. The default is to sort on split time at finish, i.e. the total time.
Note: If the results table seems to have "strange" values or missing most of the values, make sure that you have selected the correct type of split times (ACTUAL or RELATIVE) when importing the data or trying the example events.
Selecting athletes
By the checkboxes in each row, you can select which athletes you are interested in. When satisfied with your set, click the checkbox in the top left of the Results table, and only your selection will be shown.
Note: You may have to first configure your number of shown athletes.
Athlete details
You can show details about an athlete by clicking on their names in the results table.
A sum of how many medals the athlete has achieved for the legs is shown. For example,
The %-loss column shows how much slower the leg was compared to the fastest leg time. Colors (same colors as in the "Mistakes (percentages)" chart) are used to indicate the loss. Per definition, the winner of the leg has no loss, and therefore it is not written out.
The colors in the relative split column indicate the trend against the current leader (or second best).
-
Positive trend. Either of: - If the athlete is the current leader and increases the gap to the others.
- If the athlete decreases the gap to the current leader.
-
Negative trend. Either of: - If the athlete is the current leader and decreases the gap to the others.
- If the athlete increases the gap to the current leader.
The %-behind column shows how much behind the athlete is compared to the leader at the control.
Charts
You can expand the view of a specific chart by clicking on the expand button in the upper right corner. The expanded chart will open in a modal. You can also often toggle the view of specific datasets by clicking on the legends of the charts.
In some of the charts, all athletes are shown (also those that did not finish, mis-punched, etc), and in some charts only the finishers are shown.
Note: The charts will most certainly be quite useless if you are showing too many athletes. So try to keep the number of athletes shown below 15. Below 5 athletes, the charts will even be useful in compact mode.
Relative leg times (line chart)
Line chart showing each athlete's "time behind", for the leg, at every control.
Relative leg times (grouped bar chart)
Grouped bar chart showing each athlete's "time behind", for the leg, at every control. Note: Same data as the line chart above.
Mistake per leg (percentages) (line chart)
Line chart showing each athlete's "mistake", for the leg, at every control. The mistakes are shown in percent from the best leg times.
Mistake per leg (percentages) (grouped bar chart)
Grouped bar chart showing each athlete's "mistake", for the leg, at every control. The mistakes are shown in percent from the best leg times. Note: Same data as the line chart above.
Relative split times (line chart)
Line chart showing each athlete's "time behind", for the split, at every control.
Behind per split (percentages) (line chart)
Line chart showing each athlete's total "time behind" at every control. The time behind values are shown in percent from the best split times.
Leg places (stacked bar chart)
Stacked bar chart with an athlete's number of best places for each leg. Grouped by:
-
1st place (gold) -
2nd place (silver) -
3rd place (bronze) -
4th-6th place -
7th-12th place
Mistakes (minor, major) (stacked bar chart)
Stacked bar chart with an athlete's number of mistakes for each leg. Grouped by:
-
no mistakes (≤ 15 %) -
minor mistakes (> 15 % and ≤ 30 %) -
major mistakes (> 30 %)
Mistakes (percentages) (stacked bar chart)
Stacked bar chart with an athlete's number of mistakes for each leg. Grouped by:
-
< 1 % -
< 2 % -
< 4 % -
< 8 % -
< 16 % -
< 32 % -
< 64 % -
< 128 % -
≥ 128 %
Split times (time chart)
Time chart showing each athlete's actual split time at every control.
Best leg times (horizontal bar chart)
Bar chart showing the best leg time at every control.
Average and median %-loss per leg (vertical bar chart)
Bar chart showing the average and median values for an athlete's loss in percent at each leg.
If the median value is much lower than the average, it may indicate that the athlete has made some large mistakes.
Raw data importer
Insert raw data from WinSplits Online (from orientering.se). The raw data should be the result from "export the split times in text format".
Note: If you want to use relative times, make sure that the two checkboxes for "relative split times" and "relative total times" are checked (in WinSplits Online). Also make sure that you select RELATIVE in the dropdown list below. If you instead want to use actual times, make sure that the two checkboxes for "relative split times" and "relative total times" are not checked (in WinSplits Online). Also make sure that you select ACTUAL in the dropdown list below.
List of shown athletes
# | Time | Position | Name | Club |
---|---|---|---|---|
{{ orienteeringData.best[sorting.type].times[sorting.control - 1] }} | ||||
{{ athlete.controls[sorting.control - 1][sorting.type].place }} | {{ athlete.controls[sorting.control - 1][sorting.type].relativeTimeMinimized }} | {{ athlete.position }} | {{ athlete.name }} | {{ athlete.club }} |
Results table {{ orienteeringData.numberOfControls }} controls, {{ athletes.length }} of {{ orienteeringData.numberOfParticipants }} athletes
# | Name | Total time | Diff |
|
Finish | Total time | Name |
---|---|---|---|---|---|---|---|
Club | Average | Median | {{ bestLegTime }} | %-behind | Club | ||
{{ optimalTotalTime }} | {{ optimalTotalTimeDiff }} | {{ bestSplitTime }} | {{ optimalTotalTime }} | ||||
{{ athlete.position > 0 ? athlete.position : '' }} | {{ athlete.name }} | {{ athlete.totalTime }} | {{ athlete.diffTotalTime }} |
|
{{ control.leg.place }} | {{ athlete.totalTime }} | {{ athlete.name }} |
{{ athlete.club }} | {{ athlete.leg.averagePercentageLoss.toFixed(1) }} % | {{ athlete.leg.medianPercentageLoss.toFixed(1) }} % |
|
{{ control.split.place }} | {{ athlete.split.timesPercentages[orienteeringData.numberOfControls + 1].toFixed(1) }} % | {{ athlete.club }} |
Charts
{{ orienteeringData }}