Spiral chart
A time series wound onto a spiral, one turn per period, so the same moment in every period lines up along a spoke. Each value is a short arc shaded by value; recurring patterns show as wedges of colour. The spiral draws out from the centre.
Daily cycling distance
Kilometres a day, one turn per year from the centre out. Summers bloom as darker arcs along the same months.
| Value | |
|---|---|
| 1 Jan 2023 | 35 km |
| 2 Jan 2023 | 12 km |
| 3 Jan 2023 | 9 km |
| 4 Jan 2023 | 0 km |
| 5 Jan 2023 | 0 km |
| 6 Jan 2023 | 0 km |
| 7 Jan 2023 | 0 km |
| 8 Jan 2023 | 35 km |
| 9 Jan 2023 | 13 km |
| 10 Jan 2023 | 0 km |
| 11 Jan 2023 | 13 km |
| 12 Jan 2023 | 0 km |
| 13 Jan 2023 | 10 km |
| 14 Jan 2023 | 0 km |
| 15 Jan 2023 | 35 km |
| 16 Jan 2023 | 0 km |
| 17 Jan 2023 | 14 km |
| 18 Jan 2023 | 0 km |
| 19 Jan 2023 | 11 km |
| 20 Jan 2023 | 11 km |
| 21 Jan 2023 | 0 km |
| 22 Jan 2023 | 0 km |
| 23 Jan 2023 | 0 km |
| 24 Jan 2023 | 10 km |
| 25 Jan 2023 | 0 km |
| 26 Jan 2023 | 12 km |
| 27 Jan 2023 | 0 km |
| 28 Jan 2023 | 0 km |
| 29 Jan 2023 | 35 km |
| 30 Jan 2023 | 0 km |
| 31 Jan 2023 | 0 km |
| 1 Feb 2023 | 12 km |
| 2 Feb 2023 | 0 km |
| 3 Feb 2023 | 13 km |
| 4 Feb 2023 | 39 km |
| 5 Feb 2023 | 0 km |
| 6 Feb 2023 | 0 km |
| 7 Feb 2023 | 12 km |
| 8 Feb 2023 | 0 km |
| 9 Feb 2023 | 0 km |
| 10 Feb 2023 | 0 km |
| 11 Feb 2023 | 0 km |
| 12 Feb 2023 | 0 km |
| 13 Feb 2023 | 14 km |
| 14 Feb 2023 | 13 km |
| 15 Feb 2023 | 11 km |
| 16 Feb 2023 | 0 km |
| 17 Feb 2023 | 0 km |
| 18 Feb 2023 | 0 km |
| 19 Feb 2023 | 40 km |
| 20 Feb 2023 | 0 km |
| 21 Feb 2023 | 0 km |
| 22 Feb 2023 | 0 km |
| 23 Feb 2023 | 15 km |
| 24 Feb 2023 | 0 km |
| 25 Feb 2023 | 46 km |
| 26 Feb 2023 | 0 km |
| 27 Feb 2023 | 0 km |
| 28 Feb 2023 | 14 km |
| 1 Mar 2023 | 0 km |
| 2 Mar 2023 | 16 km |
| 3 Mar 2023 | 18 km |
| 4 Mar 2023 | 0 km |
| 5 Mar 2023 | 0 km |
| 6 Mar 2023 | 0 km |
| 7 Mar 2023 | 0 km |
| 8 Mar 2023 | 14 km |
| 9 Mar 2023 | 0 km |
| 10 Mar 2023 | 17 km |
| 11 Mar 2023 | 39 km |
| 12 Mar 2023 | 0 km |
| 13 Mar 2023 | 19 km |
| 14 Mar 2023 | 20 km |
| 15 Mar 2023 | 0 km |
| 16 Mar 2023 | 0 km |
| 17 Mar 2023 | 19 km |
| 18 Mar 2023 | 52 km |
| 19 Mar 2023 | 0 km |
| 20 Mar 2023 | 0 km |
| 21 Mar 2023 | 20 km |
| 22 Mar 2023 | 0 km |
| 23 Mar 2023 | 20 km |
| 24 Mar 2023 | 17 km |
| 25 Mar 2023 | 38 km |
| 26 Mar 2023 | 42 km |
| 27 Mar 2023 | 19 km |
| 28 Mar 2023 | 17 km |
| 29 Mar 2023 | 16 km |
| 30 Mar 2023 | 19 km |
| 31 Mar 2023 | 17 km |
| 1 Apr 2023 | 50 km |
| 2 Apr 2023 | 0 km |
| 3 Apr 2023 | 22 km |
| 4 Apr 2023 | 0 km |
| 5 Apr 2023 | 19 km |
| 6 Apr 2023 | 18 km |
| 7 Apr 2023 | 23 km |
| 8 Apr 2023 | 0 km |
| 9 Apr 2023 | 54 km |
| 10 Apr 2023 | 24 km |
| 11 Apr 2023 | 20 km |
| 12 Apr 2023 | 0 km |
| 13 Apr 2023 | 0 km |
| 14 Apr 2023 | 19 km |
| 15 Apr 2023 | 0 km |
| 16 Apr 2023 | 63 km |
| 17 Apr 2023 | 23 km |
| 18 Apr 2023 | 24 km |
| 19 Apr 2023 | 23 km |
| 20 Apr 2023 | 25 km |
| 21 Apr 2023 | 21 km |
| 22 Apr 2023 | 0 km |
| 23 Apr 2023 | 53 km |
| 24 Apr 2023 | 26 km |
| 25 Apr 2023 | 22 km |
| 26 Apr 2023 | 22 km |
| 27 Apr 2023 | 24 km |
| 28 Apr 2023 | 0 km |
| 29 Apr 2023 | 46 km |
| 30 Apr 2023 | 46 km |
| 1 May 2023 | 26 km |
| 2 May 2023 | 23 km |
| 3 May 2023 | 0 km |
| 4 May 2023 | 0 km |
| 5 May 2023 | 25 km |
| 6 May 2023 | 61 km |
| 7 May 2023 | 61 km |
| 8 May 2023 | 23 km |
| 9 May 2023 | 27 km |
| 10 May 2023 | 25 km |
| 11 May 2023 | 27 km |
| 12 May 2023 | 24 km |
| 13 May 2023 | 46 km |
| 14 May 2023 | 42 km |
| 15 May 2023 | 27 km |
| 16 May 2023 | 0 km |
| 17 May 2023 | 0 km |
| 18 May 2023 | 0 km |
| 19 May 2023 | 0 km |
| 20 May 2023 | 75 km |
| 21 May 2023 | 0 km |
| 22 May 2023 | 28 km |
| 23 May 2023 | 28 km |
| 24 May 2023 | 30 km |
| 25 May 2023 | 29 km |
| 26 May 2023 | 29 km |
| 27 May 2023 | 37 km |
| 28 May 2023 | 48 km |
| 29 May 2023 | 27 km |
| 30 May 2023 | 0 km |
| 31 May 2023 | 0 km |
| 1 Jun 2023 | 26 km |
| 2 Jun 2023 | 28 km |
| 3 Jun 2023 | 60 km |
| 4 Jun 2023 | 72 km |
| 5 Jun 2023 | 0 km |
| 6 Jun 2023 | 26 km |
| 7 Jun 2023 | 25 km |
| 8 Jun 2023 | 26 km |
| 9 Jun 2023 | 27 km |
| 10 Jun 2023 | 53 km |
| 11 Jun 2023 | 0 km |
| 12 Jun 2023 | 0 km |
| 13 Jun 2023 | 30 km |
| 14 Jun 2023 | 27 km |
| 15 Jun 2023 | 0 km |
| 16 Jun 2023 | 27 km |
| 17 Jun 2023 | 59 km |
| 18 Jun 2023 | 84 km |
| 19 Jun 2023 | 28 km |
| 20 Jun 2023 | 29 km |
| 21 Jun 2023 | 30 km |
| 22 Jun 2023 | 0 km |
| 23 Jun 2023 | 29 km |
| 24 Jun 2023 | 77 km |
| 25 Jun 2023 | 0 km |
| 26 Jun 2023 | 29 km |
| 27 Jun 2023 | 28 km |
| 28 Jun 2023 | 31 km |
| 29 Jun 2023 | 29 km |
| 30 Jun 2023 | 30 km |
| 1 Jul 2023 | 40 km |
| 2 Jul 2023 | 67 km |
| 3 Jul 2023 | 30 km |
| 4 Jul 2023 | 28 km |
| 5 Jul 2023 | 31 km |
| 6 Jul 2023 | 31 km |
| 7 Jul 2023 | 30 km |
| 8 Jul 2023 | 45 km |
| 9 Jul 2023 | 38 km |
| 10 Jul 2023 | 28 km |
| 11 Jul 2023 | 30 km |
| 12 Jul 2023 | 31 km |
| 13 Jul 2023 | 28 km |
| 14 Jul 2023 | 0 km |
| 15 Jul 2023 | 40 km |
| 16 Jul 2023 | 65 km |
| 17 Jul 2023 | 0 km |
| 18 Jul 2023 | 32 km |
| 19 Jul 2023 | 27 km |
| 20 Jul 2023 | 30 km |
| 21 Jul 2023 | 31 km |
| 22 Jul 2023 | 58 km |
| 23 Jul 2023 | 43 km |
| 24 Jul 2023 | 0 km |
| 25 Jul 2023 | 28 km |
| 26 Jul 2023 | 26 km |
| 27 Jul 2023 | 26 km |
| 28 Jul 2023 | 28 km |
| 29 Jul 2023 | 48 km |
| 30 Jul 2023 | 63 km |
| 31 Jul 2023 | 28 km |
| 1 Aug 2023 | 26 km |
| 2 Aug 2023 | 25 km |
| 3 Aug 2023 | 25 km |
| 4 Aug 2023 | 0 km |
| 5 Aug 2023 | 58 km |
| 6 Aug 2023 | 0 km |
| 7 Aug 2023 | 26 km |
| 8 Aug 2023 | 26 km |
| 9 Aug 2023 | 0 km |
| 10 Aug 2023 | 29 km |
| 11 Aug 2023 | 29 km |
| 12 Aug 2023 | 79 km |
| 13 Aug 2023 | 0 km |
| 14 Aug 2023 | 30 km |
| 15 Aug 2023 | 28 km |
| 16 Aug 2023 | 0 km |
| 17 Aug 2023 | 29 km |
| 18 Aug 2023 | 24 km |
| 19 Aug 2023 | 0 km |
| 20 Aug 2023 | 76 km |
| 21 Aug 2023 | 28 km |
| 22 Aug 2023 | 28 km |
| 23 Aug 2023 | 27 km |
| 24 Aug 2023 | 28 km |
| 25 Aug 2023 | 25 km |
| 26 Aug 2023 | 47 km |
| 27 Aug 2023 | 66 km |
| 28 Aug 2023 | 23 km |
| 29 Aug 2023 | 0 km |
| 30 Aug 2023 | 22 km |
| 31 Aug 2023 | 23 km |
| 1 Sep 2023 | 23 km |
| 2 Sep 2023 | 41 km |
| 3 Sep 2023 | 57 km |
| 4 Sep 2023 | 23 km |
| 5 Sep 2023 | 27 km |
| 6 Sep 2023 | 26 km |
| 7 Sep 2023 | 25 km |
| 8 Sep 2023 | 22 km |
| 9 Sep 2023 | 53 km |
| 10 Sep 2023 | 39 km |
| 11 Sep 2023 | 23 km |
| 12 Sep 2023 | 22 km |
| 13 Sep 2023 | 23 km |
| 14 Sep 2023 | 23 km |
| 15 Sep 2023 | 22 km |
| 16 Sep 2023 | 0 km |
| 17 Sep 2023 | 69 km |
| 18 Sep 2023 | 21 km |
| 19 Sep 2023 | 25 km |
| 20 Sep 2023 | 21 km |
| 21 Sep 2023 | 0 km |
| 22 Sep 2023 | 23 km |
| 23 Sep 2023 | 53 km |
| 24 Sep 2023 | 0 km |
| 25 Sep 2023 | 19 km |
| 26 Sep 2023 | 0 km |
| 27 Sep 2023 | 0 km |
| 28 Sep 2023 | 0 km |
| 29 Sep 2023 | 18 km |
| 30 Sep 2023 | 61 km |
| 1 Oct 2023 | 44 km |
| 2 Oct 2023 | 20 km |
| 3 Oct 2023 | 0 km |
| 4 Oct 2023 | 0 km |
| 5 Oct 2023 | 0 km |
| 6 Oct 2023 | 21 km |
| 7 Oct 2023 | 56 km |
| 8 Oct 2023 | 57 km |
| 9 Oct 2023 | 17 km |
| 10 Oct 2023 | 0 km |
| 11 Oct 2023 | 0 km |
| 12 Oct 2023 | 0 km |
| 13 Oct 2023 | 21 km |
| 14 Oct 2023 | 0 km |
| 15 Oct 2023 | 49 km |
| 16 Oct 2023 | 20 km |
| 17 Oct 2023 | 16 km |
| 18 Oct 2023 | 17 km |
| 19 Oct 2023 | 16 km |
| 20 Oct 2023 | 17 km |
| 21 Oct 2023 | 41 km |
| 22 Oct 2023 | 0 km |
| 23 Oct 2023 | 14 km |
| 24 Oct 2023 | 14 km |
| 25 Oct 2023 | 14 km |
| 26 Oct 2023 | 15 km |
| 27 Oct 2023 | 0 km |
| 28 Oct 2023 | 48 km |
| 29 Oct 2023 | 46 km |
| 30 Oct 2023 | 0 km |
| 31 Oct 2023 | 16 km |
| 1 Nov 2023 | 0 km |
| 2 Nov 2023 | 18 km |
| 3 Nov 2023 | 0 km |
| 4 Nov 2023 | 0 km |
| 5 Nov 2023 | 39 km |
| 6 Nov 2023 | 0 km |
| 7 Nov 2023 | 0 km |
| 8 Nov 2023 | 13 km |
| 9 Nov 2023 | 14 km |
| 10 Nov 2023 | 0 km |
| 11 Nov 2023 | 0 km |
| 12 Nov 2023 | 0 km |
| 13 Nov 2023 | 14 km |
| 14 Nov 2023 | 0 km |
| 15 Nov 2023 | 17 km |
| 16 Nov 2023 | 0 km |
| 17 Nov 2023 | 12 km |
| 18 Nov 2023 | 0 km |
| 19 Nov 2023 | 36 km |
| 20 Nov 2023 | 0 km |
| 21 Nov 2023 | 0 km |
| 22 Nov 2023 | 11 km |
| 23 Nov 2023 | 14 km |
| 24 Nov 2023 | 12 km |
| 25 Nov 2023 | 0 km |
| 26 Nov 2023 | 37 km |
| 27 Nov 2023 | 15 km |
| 28 Nov 2023 | 14 km |
| 29 Nov 2023 | 10 km |
| 30 Nov 2023 | 12 km |
| 1 Dec 2023 | 0 km |
| 2 Dec 2023 | 37 km |
| 3 Dec 2023 | 37 km |
| 4 Dec 2023 | 0 km |
| 5 Dec 2023 | 14 km |
| 6 Dec 2023 | 13 km |
| 7 Dec 2023 | 0 km |
| 8 Dec 2023 | 0 km |
| 9 Dec 2023 | 0 km |
| 10 Dec 2023 | 0 km |
| 11 Dec 2023 | 0 km |
| 12 Dec 2023 | 13 km |
| 13 Dec 2023 | 0 km |
| 14 Dec 2023 | 0 km |
| 15 Dec 2023 | 0 km |
| 16 Dec 2023 | 35 km |
| 17 Dec 2023 | 0 km |
| 18 Dec 2023 | 0 km |
| 19 Dec 2023 | 10 km |
| 20 Dec 2023 | 0 km |
| 21 Dec 2023 | 0 km |
| 22 Dec 2023 | 9 km |
| 23 Dec 2023 | 35 km |
| 24 Dec 2023 | 0 km |
| 25 Dec 2023 | 0 km |
| 26 Dec 2023 | 0 km |
| 27 Dec 2023 | 14 km |
| 28 Dec 2023 | 0 km |
| 29 Dec 2023 | 13 km |
| 30 Dec 2023 | 35 km |
| 31 Dec 2023 | 35 km |
| 1 Jan 2024 | 11 km |
| 2 Jan 2024 | 0 km |
| 3 Jan 2024 | 0 km |
| 4 Jan 2024 | 14 km |
| 5 Jan 2024 | 0 km |
| 6 Jan 2024 | 0 km |
| 7 Jan 2024 | 0 km |
| 8 Jan 2024 | 13 km |
| 9 Jan 2024 | 0 km |
| 10 Jan 2024 | 0 km |
| 11 Jan 2024 | 11 km |
| 12 Jan 2024 | 0 km |
| 13 Jan 2024 | 0 km |
| 14 Jan 2024 | 0 km |
| 15 Jan 2024 | 0 km |
| 16 Jan 2024 | 0 km |
| 17 Jan 2024 | 13 km |
| 18 Jan 2024 | 0 km |
| 19 Jan 2024 | 10 km |
| 20 Jan 2024 | 0 km |
| 21 Jan 2024 | 36 km |
| 22 Jan 2024 | 0 km |
| 23 Jan 2024 | 0 km |
| 24 Jan 2024 | 0 km |
| 25 Jan 2024 | 0 km |
| 26 Jan 2024 | 0 km |
| 27 Jan 2024 | 0 km |
| 28 Jan 2024 | 38 km |
| 29 Jan 2024 | 10 km |
| 30 Jan 2024 | 0 km |
| 31 Jan 2024 | 0 km |
| 1 Feb 2024 | 0 km |
| 2 Feb 2024 | 13 km |
| 3 Feb 2024 | 0 km |
| 4 Feb 2024 | 0 km |
| 5 Feb 2024 | 10 km |
| 6 Feb 2024 | 15 km |
| 7 Feb 2024 | 15 km |
| 8 Feb 2024 | 15 km |
| 9 Feb 2024 | 0 km |
| 10 Feb 2024 | 35 km |
| 11 Feb 2024 | 41 km |
| 12 Feb 2024 | 15 km |
| 13 Feb 2024 | 0 km |
| 14 Feb 2024 | 12 km |
| 15 Feb 2024 | 14 km |
| 16 Feb 2024 | 13 km |
| 17 Feb 2024 | 0 km |
| 18 Feb 2024 | 0 km |
| 19 Feb 2024 | 0 km |
| 20 Feb 2024 | 14 km |
| 21 Feb 2024 | 13 km |
| 22 Feb 2024 | 0 km |
| 23 Feb 2024 | 17 km |
| 24 Feb 2024 | 0 km |
| 25 Feb 2024 | 0 km |
| 26 Feb 2024 | 15 km |
| 27 Feb 2024 | 17 km |
| 28 Feb 2024 | 15 km |
| 29 Feb 2024 | 15 km |
| 1 Mar 2024 | 0 km |
| 2 Mar 2024 | 39 km |
| 3 Mar 2024 | 0 km |
| 4 Mar 2024 | 18 km |
| 5 Mar 2024 | 0 km |
| 6 Mar 2024 | 0 km |
| 7 Mar 2024 | 14 km |
| 8 Mar 2024 | 0 km |
| 9 Mar 2024 | 0 km |
| 10 Mar 2024 | 49 km |
| 11 Mar 2024 | 0 km |
| 12 Mar 2024 | 0 km |
| 13 Mar 2024 | 16 km |
| 14 Mar 2024 | 18 km |
| 15 Mar 2024 | 16 km |
| 16 Mar 2024 | 0 km |
| 17 Mar 2024 | 0 km |
| 18 Mar 2024 | 0 km |
| 19 Mar 2024 | 0 km |
| 20 Mar 2024 | 19 km |
| 21 Mar 2024 | 18 km |
| 22 Mar 2024 | 19 km |
| 23 Mar 2024 | 57 km |
| 24 Mar 2024 | 0 km |
| 25 Mar 2024 | 21 km |
| 26 Mar 2024 | 0 km |
| 27 Mar 2024 | 21 km |
| 28 Mar 2024 | 0 km |
| 29 Mar 2024 | 21 km |
| 30 Mar 2024 | 54 km |
| 31 Mar 2024 | 36 km |
| 1 Apr 2024 | 18 km |
| 2 Apr 2024 | 20 km |
| 3 Apr 2024 | 18 km |
| 4 Apr 2024 | 0 km |
| 5 Apr 2024 | 0 km |
| 6 Apr 2024 | 47 km |
| 7 Apr 2024 | 57 km |
| 8 Apr 2024 | 0 km |
| 9 Apr 2024 | 19 km |
| 10 Apr 2024 | 0 km |
| 11 Apr 2024 | 22 km |
| 12 Apr 2024 | 0 km |
| 13 Apr 2024 | 58 km |
| 14 Apr 2024 | 0 km |
| 15 Apr 2024 | 0 km |
| 16 Apr 2024 | 0 km |
| 17 Apr 2024 | 20 km |
| 18 Apr 2024 | 20 km |
| 19 Apr 2024 | 26 km |
| 20 Apr 2024 | 38 km |
| 21 Apr 2024 | 54 km |
| 22 Apr 2024 | 0 km |
| 23 Apr 2024 | 22 km |
| 24 Apr 2024 | 26 km |
| 25 Apr 2024 | 0 km |
| 26 Apr 2024 | 24 km |
| 27 Apr 2024 | 44 km |
| 28 Apr 2024 | 46 km |
| 29 Apr 2024 | 26 km |
| 30 Apr 2024 | 23 km |
| 1 May 2024 | 23 km |
| 2 May 2024 | 24 km |
| 3 May 2024 | 27 km |
| 4 May 2024 | 52 km |
| 5 May 2024 | 54 km |
| 6 May 2024 | 27 km |
| 7 May 2024 | 28 km |
| 8 May 2024 | 0 km |
| 9 May 2024 | 0 km |
| 10 May 2024 | 27 km |
| 11 May 2024 | 79 km |
| 12 May 2024 | 61 km |
| 13 May 2024 | 25 km |
| 14 May 2024 | 29 km |
| 15 May 2024 | 25 km |
| 16 May 2024 | 27 km |
| 17 May 2024 | 29 km |
| 18 May 2024 | 51 km |
| 19 May 2024 | 46 km |
| 20 May 2024 | 26 km |
| 21 May 2024 | 0 km |
| 22 May 2024 | 26 km |
| 23 May 2024 | 26 km |
| 24 May 2024 | 26 km |
| 25 May 2024 | 41 km |
| 26 May 2024 | 45 km |
| 27 May 2024 | 25 km |
| 28 May 2024 | 25 km |
| 29 May 2024 | 30 km |
| 30 May 2024 | 30 km |
| 31 May 2024 | 0 km |
| 1 Jun 2024 | 49 km |
| 2 Jun 2024 | 0 km |
| 3 Jun 2024 | 0 km |
| 4 Jun 2024 | 27 km |
| 5 Jun 2024 | 25 km |
| 6 Jun 2024 | 27 km |
| 7 Jun 2024 | 25 km |
| 8 Jun 2024 | 68 km |
| 9 Jun 2024 | 67 km |
| 10 Jun 2024 | 0 km |
| 11 Jun 2024 | 29 km |
| 12 Jun 2024 | 28 km |
| 13 Jun 2024 | 29 km |
| 14 Jun 2024 | 30 km |
| 15 Jun 2024 | 0 km |
| 16 Jun 2024 | 86 km |
| 17 Jun 2024 | 26 km |
| 18 Jun 2024 | 29 km |
| 19 Jun 2024 | 31 km |
| 20 Jun 2024 | 0 km |
| 21 Jun 2024 | 0 km |
| 22 Jun 2024 | 0 km |
| 23 Jun 2024 | 0 km |
| 24 Jun 2024 | 27 km |
| 25 Jun 2024 | 26 km |
| 26 Jun 2024 | 0 km |
| 27 Jun 2024 | 28 km |
| 28 Jun 2024 | 30 km |
| 29 Jun 2024 | 83 km |
| 30 Jun 2024 | 62 km |
| 1 Jul 2024 | 31 km |
| 2 Jul 2024 | 29 km |
| 3 Jul 2024 | 26 km |
| 4 Jul 2024 | 30 km |
| 5 Jul 2024 | 28 km |
| 6 Jul 2024 | 78 km |
| 7 Jul 2024 | 77 km |
| 8 Jul 2024 | 28 km |
| 9 Jul 2024 | 0 km |
| 10 Jul 2024 | 31 km |
| 11 Jul 2024 | 27 km |
| 12 Jul 2024 | 28 km |
| 13 Jul 2024 | 72 km |
| 14 Jul 2024 | 42 km |
| 15 Jul 2024 | 28 km |
| 16 Jul 2024 | 28 km |
| 17 Jul 2024 | 31 km |
| 18 Jul 2024 | 0 km |
| 19 Jul 2024 | 30 km |
| 20 Jul 2024 | 64 km |
| 21 Jul 2024 | 78 km |
| 22 Jul 2024 | 27 km |
| 23 Jul 2024 | 28 km |
| 24 Jul 2024 | 0 km |
| 25 Jul 2024 | 29 km |
| 26 Jul 2024 | 30 km |
| 27 Jul 2024 | 48 km |
| 28 Jul 2024 | 0 km |
| 29 Jul 2024 | 27 km |
| 30 Jul 2024 | 0 km |
| 31 Jul 2024 | 30 km |
| 1 Aug 2024 | 30 km |
| 2 Aug 2024 | 26 km |
| 3 Aug 2024 | 79 km |
| 4 Aug 2024 | 0 km |
| 5 Aug 2024 | 27 km |
| 6 Aug 2024 | 29 km |
| 7 Aug 2024 | 0 km |
| 8 Aug 2024 | 25 km |
| 9 Aug 2024 | 30 km |
| 10 Aug 2024 | 67 km |
| 11 Aug 2024 | 49 km |
| 12 Aug 2024 | 27 km |
| 13 Aug 2024 | 24 km |
| 14 Aug 2024 | 28 km |
| 15 Aug 2024 | 26 km |
| 16 Aug 2024 | 28 km |
| 17 Aug 2024 | 50 km |
| 18 Aug 2024 | 65 km |
| 19 Aug 2024 | 27 km |
| 20 Aug 2024 | 29 km |
| 21 Aug 2024 | 0 km |
| 22 Aug 2024 | 26 km |
| 23 Aug 2024 | 0 km |
| 24 Aug 2024 | 0 km |
| 25 Aug 2024 | 70 km |
| 26 Aug 2024 | 0 km |
| 27 Aug 2024 | 24 km |
| 28 Aug 2024 | 27 km |
| 29 Aug 2024 | 0 km |
| 30 Aug 2024 | 22 km |
| 31 Aug 2024 | 42 km |
| 1 Sep 2024 | 75 km |
| 2 Sep 2024 | 25 km |
| 3 Sep 2024 | 26 km |
| 4 Sep 2024 | 0 km |
| 5 Sep 2024 | 21 km |
| 6 Sep 2024 | 25 km |
| 7 Sep 2024 | 72 km |
| 8 Sep 2024 | 49 km |
| 9 Sep 2024 | 22 km |
| 10 Sep 2024 | 0 km |
| 11 Sep 2024 | 0 km |
| 12 Sep 2024 | 0 km |
| 13 Sep 2024 | 23 km |
| 14 Sep 2024 | 53 km |
| 15 Sep 2024 | 50 km |
| 16 Sep 2024 | 20 km |
| 17 Sep 2024 | 0 km |
| 18 Sep 2024 | 22 km |
| 19 Sep 2024 | 0 km |
| 20 Sep 2024 | 20 km |
| 21 Sep 2024 | 63 km |
| 22 Sep 2024 | 60 km |
| 23 Sep 2024 | 20 km |
| 24 Sep 2024 | 20 km |
| 25 Sep 2024 | 23 km |
| 26 Sep 2024 | 23 km |
| 27 Sep 2024 | 23 km |
| 28 Sep 2024 | 40 km |
| 29 Sep 2024 | 56 km |
| 30 Sep 2024 | 21 km |
| 1 Oct 2024 | 0 km |
| 2 Oct 2024 | 19 km |
| 3 Oct 2024 | 0 km |
| 4 Oct 2024 | 0 km |
| 5 Oct 2024 | 0 km |
| 6 Oct 2024 | 45 km |
| 7 Oct 2024 | 17 km |
| 8 Oct 2024 | 0 km |
| 9 Oct 2024 | 0 km |
| 10 Oct 2024 | 16 km |
| 11 Oct 2024 | 21 km |
| 12 Oct 2024 | 0 km |
| 13 Oct 2024 | 51 km |
| 14 Oct 2024 | 16 km |
| 15 Oct 2024 | 15 km |
| 16 Oct 2024 | 0 km |
| 17 Oct 2024 | 0 km |
| 18 Oct 2024 | 0 km |
| 19 Oct 2024 | 48 km |
| 20 Oct 2024 | 43 km |
| 21 Oct 2024 | 17 km |
| 22 Oct 2024 | 14 km |
| 23 Oct 2024 | 17 km |
| 24 Oct 2024 | 0 km |
| 25 Oct 2024 | 18 km |
| 26 Oct 2024 | 43 km |
| 27 Oct 2024 | 41 km |
| 28 Oct 2024 | 18 km |
| 29 Oct 2024 | 0 km |
| 30 Oct 2024 | 0 km |
| 31 Oct 2024 | 0 km |
| 1 Nov 2024 | 15 km |
| 2 Nov 2024 | 42 km |
| 3 Nov 2024 | 0 km |
| 4 Nov 2024 | 0 km |
| 5 Nov 2024 | 16 km |
| 6 Nov 2024 | 0 km |
| 7 Nov 2024 | 17 km |
| 8 Nov 2024 | 0 km |
| 9 Nov 2024 | 0 km |
| 10 Nov 2024 | 43 km |
| 11 Nov 2024 | 11 km |
| 12 Nov 2024 | 0 km |
| 13 Nov 2024 | 0 km |
| 14 Nov 2024 | 0 km |
| 15 Nov 2024 | 13 km |
| 16 Nov 2024 | 0 km |
| 17 Nov 2024 | 0 km |
| 18 Nov 2024 | 11 km |
| 19 Nov 2024 | 11 km |
| 20 Nov 2024 | 14 km |
| 21 Nov 2024 | 0 km |
| 22 Nov 2024 | 0 km |
| 23 Nov 2024 | 36 km |
| 24 Nov 2024 | 35 km |
| 25 Nov 2024 | 0 km |
| 26 Nov 2024 | 13 km |
| 27 Nov 2024 | 0 km |
| 28 Nov 2024 | 0 km |
| 29 Nov 2024 | 0 km |
| 30 Nov 2024 | 0 km |
| 1 Dec 2024 | 0 km |
| 2 Dec 2024 | 12 km |
| 3 Dec 2024 | 0 km |
| 4 Dec 2024 | 0 km |
| 5 Dec 2024 | 13 km |
| 6 Dec 2024 | 0 km |
| 7 Dec 2024 | 35 km |
| 8 Dec 2024 | 0 km |
| 9 Dec 2024 | 0 km |
| 10 Dec 2024 | 11 km |
| 11 Dec 2024 | 10 km |
| 12 Dec 2024 | 0 km |
| 13 Dec 2024 | 0 km |
| 14 Dec 2024 | 0 km |
| 15 Dec 2024 | 36 km |
| 16 Dec 2024 | 10 km |
| 17 Dec 2024 | 0 km |
| 18 Dec 2024 | 0 km |
| 19 Dec 2024 | 9 km |
| 20 Dec 2024 | 0 km |
| 21 Dec 2024 | 0 km |
| 22 Dec 2024 | 0 km |
| 23 Dec 2024 | 0 km |
| 24 Dec 2024 | 9 km |
| 25 Dec 2024 | 10 km |
| 26 Dec 2024 | 12 km |
| 27 Dec 2024 | 9 km |
| 28 Dec 2024 | 35 km |
| 29 Dec 2024 | 35 km |
| 30 Dec 2024 | 0 km |
| 31 Dec 2024 | 13 km |
| 1 Jan 2025 | 14 km |
| 2 Jan 2025 | 8 km |
| 3 Jan 2025 | 11 km |
| 4 Jan 2025 | 35 km |
| 5 Jan 2025 | 0 km |
| 6 Jan 2025 | 0 km |
| 7 Jan 2025 | 0 km |
| 8 Jan 2025 | 0 km |
| 9 Jan 2025 | 0 km |
| 10 Jan 2025 | 0 km |
| 11 Jan 2025 | 0 km |
| 12 Jan 2025 | 0 km |
| 13 Jan 2025 | 0 km |
| 14 Jan 2025 | 13 km |
| 15 Jan 2025 | 9 km |
| 16 Jan 2025 | 0 km |
| 17 Jan 2025 | 0 km |
| 18 Jan 2025 | 0 km |
| 19 Jan 2025 | 36 km |
| 20 Jan 2025 | 13 km |
| 21 Jan 2025 | 0 km |
| 22 Jan 2025 | 0 km |
| 23 Jan 2025 | 12 km |
| 24 Jan 2025 | 0 km |
| 25 Jan 2025 | 0 km |
| 26 Jan 2025 | 0 km |
| 27 Jan 2025 | 0 km |
| 28 Jan 2025 | 0 km |
| 29 Jan 2025 | 0 km |
| 30 Jan 2025 | 13 km |
| 31 Jan 2025 | 11 km |
| 1 Feb 2025 | 39 km |
| 2 Feb 2025 | 0 km |
| 3 Feb 2025 | 15 km |
| 4 Feb 2025 | 15 km |
| 5 Feb 2025 | 12 km |
| 6 Feb 2025 | 0 km |
| 7 Feb 2025 | 0 km |
| 8 Feb 2025 | 40 km |
| 9 Feb 2025 | 39 km |
| 10 Feb 2025 | 12 km |
| 11 Feb 2025 | 0 km |
| 12 Feb 2025 | 11 km |
| 13 Feb 2025 | 14 km |
| 14 Feb 2025 | 0 km |
| 15 Feb 2025 | 0 km |
| 16 Feb 2025 | 39 km |
| 17 Feb 2025 | 13 km |
| 18 Feb 2025 | 0 km |
| 19 Feb 2025 | 0 km |
| 20 Feb 2025 | 0 km |
| 21 Feb 2025 | 16 km |
| 22 Feb 2025 | 0 km |
| 23 Feb 2025 | 0 km |
| 24 Feb 2025 | 13 km |
| 25 Feb 2025 | 0 km |
| 26 Feb 2025 | 14 km |
| 27 Feb 2025 | 0 km |
| 28 Feb 2025 | 17 km |
| 1 Mar 2025 | 0 km |
| 2 Mar 2025 | 39 km |
| 3 Mar 2025 | 0 km |
| 4 Mar 2025 | 14 km |
| 5 Mar 2025 | 14 km |
| 6 Mar 2025 | 0 km |
| 7 Mar 2025 | 0 km |
| 8 Mar 2025 | 48 km |
| 9 Mar 2025 | 40 km |
| 10 Mar 2025 | 0 km |
| 11 Mar 2025 | 0 km |
| 12 Mar 2025 | 0 km |
| 13 Mar 2025 | 19 km |
| 14 Mar 2025 | 16 km |
| 15 Mar 2025 | 0 km |
| 16 Mar 2025 | 38 km |
| 17 Mar 2025 | 0 km |
| 18 Mar 2025 | 0 km |
| 19 Mar 2025 | 17 km |
| 20 Mar 2025 | 17 km |
| 21 Mar 2025 | 0 km |
| 22 Mar 2025 | 38 km |
| 23 Mar 2025 | 54 km |
| 24 Mar 2025 | 0 km |
| 25 Mar 2025 | 16 km |
| 26 Mar 2025 | 16 km |
| 27 Mar 2025 | 0 km |
| 28 Mar 2025 | 0 km |
| 29 Mar 2025 | 0 km |
| 30 Mar 2025 | 0 km |
| 31 Mar 2025 | 20 km |
| 1 Apr 2025 | 23 km |
| 2 Apr 2025 | 21 km |
| 3 Apr 2025 | 20 km |
| 4 Apr 2025 | 17 km |
| 5 Apr 2025 | 0 km |
| 6 Apr 2025 | 55 km |
| 7 Apr 2025 | 21 km |
| 8 Apr 2025 | 23 km |
| 9 Apr 2025 | 0 km |
| 10 Apr 2025 | 21 km |
| 11 Apr 2025 | 0 km |
| 12 Apr 2025 | 54 km |
| 13 Apr 2025 | 49 km |
| 14 Apr 2025 | 20 km |
| 15 Apr 2025 | 20 km |
| 16 Apr 2025 | 0 km |
| 17 Apr 2025 | 25 km |
| 18 Apr 2025 | 21 km |
| 19 Apr 2025 | 70 km |
| 20 Apr 2025 | 58 km |
| 21 Apr 2025 | 22 km |
| 22 Apr 2025 | 25 km |
| 23 Apr 2025 | 0 km |
| 24 Apr 2025 | 23 km |
| 25 Apr 2025 | 0 km |
| 26 Apr 2025 | 52 km |
| 27 Apr 2025 | 66 km |
| 28 Apr 2025 | 26 km |
| 29 Apr 2025 | 27 km |
| 30 Apr 2025 | 25 km |
| 1 May 2025 | 0 km |
| 2 May 2025 | 24 km |
| 3 May 2025 | 74 km |
| 4 May 2025 | 0 km |
| 5 May 2025 | 26 km |
| 6 May 2025 | 28 km |
| 7 May 2025 | 28 km |
| 8 May 2025 | 27 km |
| 9 May 2025 | 27 km |
| 10 May 2025 | 66 km |
| 11 May 2025 | 59 km |
| 12 May 2025 | 27 km |
| 13 May 2025 | 26 km |
| 14 May 2025 | 29 km |
| 15 May 2025 | 0 km |
| 16 May 2025 | 26 km |
| 17 May 2025 | 49 km |
| 18 May 2025 | 0 km |
| 19 May 2025 | 24 km |
| 20 May 2025 | 27 km |
| 21 May 2025 | 29 km |
| 22 May 2025 | 26 km |
| 23 May 2025 | 27 km |
| 24 May 2025 | 35 km |
| 25 May 2025 | 83 km |
| 26 May 2025 | 0 km |
| 27 May 2025 | 25 km |
| 28 May 2025 | 28 km |
| 29 May 2025 | 0 km |
| 30 May 2025 | 25 km |
| 31 May 2025 | 84 km |
| 1 Jun 2025 | 0 km |
| 2 Jun 2025 | 26 km |
| 3 Jun 2025 | 0 km |
| 4 Jun 2025 | 0 km |
| 5 Jun 2025 | 26 km |
| 6 Jun 2025 | 28 km |
| 7 Jun 2025 | 59 km |
| 8 Jun 2025 | 68 km |
| 9 Jun 2025 | 27 km |
| 10 Jun 2025 | 27 km |
| 11 Jun 2025 | 31 km |
| 12 Jun 2025 | 0 km |
| 13 Jun 2025 | 27 km |
| 14 Jun 2025 | 83 km |
| 15 Jun 2025 | 0 km |
| 16 Jun 2025 | 26 km |
| 17 Jun 2025 | 28 km |
| 18 Jun 2025 | 31 km |
| 19 Jun 2025 | 27 km |
| 20 Jun 2025 | 0 km |
| 21 Jun 2025 | 70 km |
| 22 Jun 2025 | 52 km |
| 23 Jun 2025 | 27 km |
| 24 Jun 2025 | 29 km |
| 25 Jun 2025 | 32 km |
| 26 Jun 2025 | 31 km |
| 27 Jun 2025 | 31 km |
| 28 Jun 2025 | 59 km |
| 29 Jun 2025 | 40 km |
| 30 Jun 2025 | 30 km |
| 1 Jul 2025 | 31 km |
| 2 Jul 2025 | 27 km |
| 3 Jul 2025 | 0 km |
| 4 Jul 2025 | 31 km |
| 5 Jul 2025 | 56 km |
| 6 Jul 2025 | 45 km |
| 7 Jul 2025 | 0 km |
| 8 Jul 2025 | 0 km |
| 9 Jul 2025 | 0 km |
| 10 Jul 2025 | 0 km |
| 11 Jul 2025 | 27 km |
| 12 Jul 2025 | 49 km |
| 13 Jul 2025 | 48 km |
| 14 Jul 2025 | 29 km |
| 15 Jul 2025 | 30 km |
| 16 Jul 2025 | 32 km |
| 17 Jul 2025 | 32 km |
| 18 Jul 2025 | 29 km |
| 19 Jul 2025 | 66 km |
| 20 Jul 2025 | 73 km |
| 21 Jul 2025 | 29 km |
| 22 Jul 2025 | 27 km |
| 23 Jul 2025 | 28 km |
| 24 Jul 2025 | 27 km |
| 25 Jul 2025 | 28 km |
| 26 Jul 2025 | 57 km |
| 27 Jul 2025 | 85 km |
| 28 Jul 2025 | 0 km |
| 29 Jul 2025 | 27 km |
| 30 Jul 2025 | 29 km |
| 31 Jul 2025 | 29 km |
| 1 Aug 2025 | 31 km |
| 2 Aug 2025 | 0 km |
| 3 Aug 2025 | 84 km |
| 4 Aug 2025 | 28 km |
| 5 Aug 2025 | 26 km |
| 6 Aug 2025 | 26 km |
| 7 Aug 2025 | 28 km |
| 8 Aug 2025 | 0 km |
| 9 Aug 2025 | 0 km |
| 10 Aug 2025 | 46 km |
| 11 Aug 2025 | 26 km |
| 12 Aug 2025 | 26 km |
| 13 Aug 2025 | 0 km |
| 14 Aug 2025 | 29 km |
| 15 Aug 2025 | 0 km |
| 16 Aug 2025 | 48 km |
| 17 Aug 2025 | 71 km |
| 18 Aug 2025 | 25 km |
| 19 Aug 2025 | 23 km |
| 20 Aug 2025 | 0 km |
| 21 Aug 2025 | 26 km |
| 22 Aug 2025 | 24 km |
| 23 Aug 2025 | 58 km |
| 24 Aug 2025 | 0 km |
| 25 Aug 2025 | 27 km |
| 26 Aug 2025 | 0 km |
| 27 Aug 2025 | 25 km |
| 28 Aug 2025 | 26 km |
| 29 Aug 2025 | 25 km |
| 30 Aug 2025 | 0 km |
| 31 Aug 2025 | 74 km |
| 1 Sep 2025 | 26 km |
| 2 Sep 2025 | 25 km |
| 3 Sep 2025 | 22 km |
| 4 Sep 2025 | 0 km |
| 5 Sep 2025 | 24 km |
| 6 Sep 2025 | 67 km |
| 7 Sep 2025 | 64 km |
| 8 Sep 2025 | 21 km |
| 9 Sep 2025 | 22 km |
| 10 Sep 2025 | 0 km |
| 11 Sep 2025 | 26 km |
| 12 Sep 2025 | 0 km |
| 13 Sep 2025 | 37 km |
| 14 Sep 2025 | 50 km |
| 15 Sep 2025 | 25 km |
| 16 Sep 2025 | 23 km |
| 17 Sep 2025 | 0 km |
| 18 Sep 2025 | 25 km |
| 19 Sep 2025 | 22 km |
| 20 Sep 2025 | 36 km |
| 21 Sep 2025 | 66 km |
| 22 Sep 2025 | 20 km |
| 23 Sep 2025 | 23 km |
| 24 Sep 2025 | 19 km |
| 25 Sep 2025 | 18 km |
| 26 Sep 2025 | 22 km |
Usage
use hydroxy_leptos::chart_frame::ChartFrame;
use hydroxy_leptos::spiral_chart::SpiralChart;
use leptos::prelude::*;
const MONTHS: [&str; 12] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
pub fn demo() -> AnyView {
// Three years of daily cycling, one turn per year: long weekend rides in summer,
// more rest days in winter. 2023 starts on a Sunday.
let mut dates = Vec::new();
for year in 2023..=2025 {
let leap = year % 4 == 0;
for (m, days) in
[31, if leap { 29 } else { 28 }, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].into_iter().enumerate()
{
dates.extend((1..=days).map(|d| format!("{d} {} {year}", MONTHS[m])));
}
}
let mut next = noise(41);
let distance: Vec<f64> = (0..dates.len())
.map(|d| {
#[allow(clippy::cast_precision_loss, reason = "day counts are small")]
let summer = 0.5 - 0.5 * (d as f64 / 365.25 * std::f64::consts::TAU).cos();
let weekend = matches!(d % 7, 0 | 6);
if next() > 0.45 + 0.4 * summer {
0.0
} else if weekend {
(35.0 + 55.0 * summer * next()).round()
} else {
(8.0 + 18.0 * summer + 6.0 * next()).round()
}
})
.collect();
let spokes: Vec<String> = MONTHS.map(String::from).to_vec();
let turns: Vec<String> = ["2023", "2024", "2025"].map(String::from).to_vec();
view! {
<ChartFrame
title="Daily cycling distance"
description="Kilometres a day, one turn per year from the centre out. Summers bloom as darker arcs along the same months."
export=true
>
<SpiralChart
values=distance
labels=dates
period=365.25
spokes
turns
label="Daily cycling distance in kilometres, 2023 to 2025"
format=|v: f64| format!("{v:.0} km")
/>
</ChartFrame>
}
.into_any()
}
/// A small deterministic random source (xorshift), so server and browser draw the same data.
#[allow(clippy::cast_precision_loss, reason = "a 53-bit fraction is exact")]
fn noise(seed: u64) -> impl FnMut() -> f64 {
let mut state = seed;
move || {
state ^= state << 13;
state ^= state >> 7;
state ^= state << 17;
(state >> 11) as f64 / (1u64 << 53) as f64
}
}use dioxus::prelude::*;
use hydroxy_dioxus::chart_frame::ChartFrame;
use hydroxy_dioxus::spiral_chart::SpiralChart;
const MONTHS: [&str; 12] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
#[component]
pub fn SpiralChartDemo() -> Element {
// Three years of daily cycling, one turn per year: long weekend rides in summer,
// more rest days in winter. 2023 starts on a Sunday.
let mut dates = Vec::new();
for year in 2023..=2025 {
let leap = year % 4 == 0;
for (m, days) in
[31, if leap { 29 } else { 28 }, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].into_iter().enumerate()
{
dates.extend((1..=days).map(|d| format!("{d} {} {year}", MONTHS[m])));
}
}
let mut next = noise(41);
let distance: Vec<f64> = (0..dates.len())
.map(|d| {
#[allow(clippy::cast_precision_loss, reason = "day counts are small")]
let summer = 0.5 - 0.5 * (d as f64 / 365.25 * std::f64::consts::TAU).cos();
let weekend = matches!(d % 7, 0 | 6);
if next() > 0.45 + 0.4 * summer {
0.0
} else if weekend {
(35.0 + 55.0 * summer * next()).round()
} else {
(8.0 + 18.0 * summer + 6.0 * next()).round()
}
})
.collect();
let spokes: Vec<String> = MONTHS.map(String::from).to_vec();
let turns: Vec<String> = ["2023", "2024", "2025"].map(String::from).to_vec();
rsx! {
ChartFrame {
title: "Daily cycling distance",
description: "Kilometres a day, one turn per year from the centre out. Summers bloom as darker arcs along the same months.",
export: true,
SpiralChart {
values: distance,
labels: dates,
period: 365.25,
spokes,
turns,
label: "Daily cycling distance in kilometres, 2023 to 2025",
format: move |v: f64| format!("{v:.0} km"),
}
}
}
}
/// A small deterministic random source (xorshift), so every render draws the same data.
#[allow(clippy::cast_precision_loss, reason = "a 53-bit fraction is exact")]
fn noise(seed: u64) -> impl FnMut() -> f64 {
let mut state = seed;
move || {
state ^= state << 13;
state ^= state >> 7;
state ^= state << 17;
(state >> 11) as f64 / (1u64 << 53) as f64
}
}
Anatomy
| Component | data-part | Renders |
|---|---|---|
SpiralChart | root | figure with a screen-reader table of every value |
| segment | One arc per value, shaded from the lowest to the highest |
| spoke | A faint line through every turn at each dial name |
| spoke-label | Dial names around the outside, such as months |
| turn-label | Each turn's name at 12 o'clock, such as the year |
| highlight | The arc under the pointer or keyboard focus |
| tooltip | The value's name and value |
| scale | The colour ramp with its lowest and highest values |
Keyboard
| Key | Does |
|---|---|
ArrowLeft / ArrowRight | Previous or next value along the spiral |
ArrowUp / ArrowDown | One turn out or in |
Home / End | First or last value |
Escape | Hide the tooltip |
Props
| Prop | Type | Notes |
|---|---|---|
values | Vec<f64> | Required. Values in time order; NaN leaves a gap |
labels | Vec<String> | Required. A name per value, such as its date |
period | f64 | Required. Values per turn: 365.25 for daily values over years |
spokes | Vec<String> | Names spaced evenly around the dial from 12 o'clock |
turns | Vec<String> | A name per turn, from the centre out |
label | String | Required. What the chart shows; the accessible name |
size | u16 | Diameter in px. Default 360 |
format | Fn(f64) -> String | Formats the tooltip, scale and table |
Events
| Prop | Type | Notes |
|---|---|---|
on_hover | Callback<Option<Datum>> | The mark under the pointer or keyboard focus changes, or is left. Fires only on a change |
on_select | Callback<Datum> | Click, tap or Enter on a mark |