Creando una ttwig espiral de series temporales de rango temporal

De manera similar a esta pregunta , estoy interesado en crear espirales de series de tiempo. La solución no necesariamente tiene que implementarse en R o usar ggplot, pero parece que la mayoría de las soluciones se han implementado en R con ggplot, con un puñado en Python y uno en d3. Hasta ahora, todos mis bashs han usado R. A diferencia de esta pregunta, me interesa mostrar rangos de datos específicos sin cuantificar / agrupar los datos. Es decir, me gustaría mostrar una línea de tiempo en espiral que muestre cuándo comienzan y terminan determinados eventos, donde theta-min y theta-max de cada evento representan puntos específicos en el tiempo.

Considere estos datos de viaje:

trip_start trip_stop dist 2017-04-01 17:42:00 2017-04-01 18:34:00 1.95 2017-04-01 18:42:00 2017-04-01 19:05:00 6.54 2017-04-02 01:09:00 2017-04-02 01:12:00 1.07 2017-04-02 01:22:00 2017-04-02 01:27:00 1.03 2017-04-02 08:17:00 2017-04-02 08:23:00 1.98 2017-04-02 11:23:00 2017-04-02 11:30:00 1.98 2017-04-02 15:44:00 2017-04-02 15:56:00 4.15 2017-04-02 16:29:00 2017-04-02 16:45:00 4.08 2017-04-03 10:24:00 2017-04-03 10:55:00 19.76 2017-04-03 14:01:00 2017-04-03 14:18:00 8.21 2017-04-03 14:25:00 2017-04-03 14:31:00 1.49 2017-04-03 14:45:00 2017-04-03 14:50:00 1.59 2017-04-03 15:44:00 2017-04-03 16:10:00 4.44 2017-04-03 16:14:00 2017-04-03 16:37:00 9.96 2017-04-03 16:40:00 2017-04-03 16:45:00 0.7 2017-04-03 17:15:00 2017-04-03 17:46:00 16.92 2017-04-03 17:56:00 2017-04-03 18:19:00 5.23 2017-04-03 18:42:00 2017-04-03 18:45:00 0.49 2017-04-03 19:02:00 2017-04-03 19:04:00 0.48 2017-04-04 07:24:00 2017-04-04 07:27:00 0.66 2017-04-04 07:30:00 2017-04-04 08:04:00 13.55 2017-04-04 08:32:00 2017-04-04 09:25:00 25.09 2017-04-04 13:32:00 2017-04-04 13:40:00 3.06 2017-04-04 13:52:00 2017-04-04 13:57:00 1.3 2017-04-04 14:55:00 2017-04-04 15:01:00 2.47 2017-04-04 18:40:00 2017-04-04 19:12:00 22.71 2017-04-04 22:16:00 2017-04-04 23:54:00 38.28 2017-04-04 23:59:00 2017-04-05 00:03:00 1.02 2017-04-05 11:04:00 2017-04-05 11:49:00 25.73 2017-04-05 12:05:00 2017-04-05 12:18:00 2.97 2017-04-05 15:19:00 2017-04-05 16:25:00 25.13 2017-04-05 16:38:00 2017-04-05 16:40:00 0.41 2017-04-05 18:58:00 2017-04-05 19:02:00 1.25 2017-04-05 19:13:00 2017-04-05 19:18:00 1.09 2017-04-05 19:25:00 2017-04-05 19:48:00 6.63 2017-04-06 10:01:00 2017-04-06 10:44:00 20.81 2017-04-06 13:22:00 2017-04-06 13:33:00 1.63 2017-04-06 20:58:00 2017-04-06 21:25:00 24.85 2017-04-06 21:32:00 2017-04-06 21:56:00 6.06 2017-04-07 10:55:00 2017-04-07 11:37:00 24.53 2017-04-07 17:14:00 2017-04-07 17:48:00 19.66 2017-04-07 17:57:00 2017-04-07 18:07:00 2.12 2017-04-08 20:57:00 2017-04-08 21:06:00 1.06 2017-04-08 21:23:00 2017-04-08 21:36:00 2.97 2017-04-09 08:14:00 2017-04-09 08:19:00 1.99 2017-04-09 11:40:00 2017-04-09 11:50:00 2.24 2017-04-09 11:50:00 2017-04-09 11:57:00 1.64 2017-04-09 16:29:00 2017-04-09 16:34:00 0.53 2017-04-09 16:43:00 2017-04-09 16:45:00 0.5 2017-04-09 17:46:00 2017-04-09 17:48:00 0.44 2017-04-09 17:53:00 2017-04-09 17:56:00 0.4 2017-04-09 21:33:00 2017-04-09 21:56:00 2.48 2017-04-09 21:57:00 2017-04-09 22:14:00 2.92 2017-04-09 22:22:00 2017-04-09 22:25:00 0.9 2017-04-10 10:37:00 2017-04-10 11:22:00 19.27 2017-04-10 16:12:00 2017-04-10 16:59:00 21.31 2017-04-11 11:14:00 2017-04-11 11:18:00 1.24 2017-04-11 11:21:00 2017-04-11 11:48:00 22.95 2017-04-11 18:24:00 2017-04-11 19:05:00 28.64 2017-04-11 19:21:00 2017-04-11 19:34:00 5.37 2017-04-12 11:00:00 2017-04-12 12:08:00 28.91 2017-04-12 14:03:00 2017-04-12 15:20:00 28.56 2017-04-12 20:24:00 2017-04-12 20:29:00 1.17 2017-04-12 20:32:00 2017-04-12 21:09:00 30.89 2017-04-13 01:37:00 2017-04-13 02:09:00 32.3 2017-04-13 08:08:00 2017-04-13 08:39:00 19.39 2017-04-13 10:53:00 2017-04-13 11:23:00 24.59 2017-04-13 18:56:00 2017-04-13 19:22:00 22.74 2017-04-14 01:06:00 2017-04-14 01:37:00 31.36 2017-04-14 01:48:00 2017-04-14 01:51:00 1.03 2017-04-14 12:08:00 2017-04-14 12:22:00 1.94 2017-04-14 12:29:00 2017-04-14 13:01:00 19.07 2017-04-14 16:17:00 2017-04-14 17:03:00 19.74 2017-04-14 17:05:00 2017-04-14 17:32:00 3.99 2017-04-14 21:57:00 2017-04-14 22:02:00 1.98 2017-04-15 01:46:00 2017-04-15 01:49:00 1.07 2017-04-15 01:56:00 2017-04-15 01:58:00 1.03 2017-04-15 07:13:00 2017-04-15 07:15:00 0.45 2017-04-15 07:19:00 2017-04-15 07:21:00 0.41 2017-04-15 15:54:00 2017-04-15 16:05:00 1.94 2017-04-15 22:23:00 2017-04-15 22:26:00 0.86 2017-04-15 22:46:00 2017-04-15 22:47:00 0.25 2017-04-15 22:51:00 2017-04-15 22:53:00 0.71 2017-04-16 11:35:00 2017-04-16 11:54:00 11.4 2017-04-16 11:58:00 2017-04-16 12:15:00 10.43 2017-04-17 10:44:00 2017-04-17 10:53:00 3.04 2017-04-17 10:55:00 2017-04-17 11:22:00 18.26 2017-04-17 18:09:00 2017-04-17 18:12:00 0.85 2017-04-17 18:21:00 2017-04-17 19:07:00 37.22 2017-04-18 02:07:00 2017-04-18 02:47:00 32.41 2017-04-18 10:55:00 2017-04-18 10:57:00 0.41 2017-04-18 11:02:00 2017-04-18 11:12:00 2.3 2017-04-18 11:15:00 2017-04-18 11:52:00 24.05 2017-04-18 16:59:00 2017-04-18 17:55:00 22.66 2017-04-19 00:46:00 2017-04-19 01:35:00 39.25 2017-04-19 10:57:00 2017-04-19 11:44:00 24.06 2017-04-19 13:23:00 2017-04-19 14:10:00 25.96 2017-04-19 16:21:00 2017-04-19 17:07:00 18.05 2017-04-19 23:32:00 2017-04-20 00:19:00 39.67 2017-04-20 10:47:00 2017-04-20 11:13:00 24.07 2017-04-20 16:21:00 2017-04-20 16:30:00 0.86 2017-04-20 16:36:00 2017-04-20 16:58:00 0.85 2017-04-20 17:41:00 2017-04-20 17:44:00 0.37 2017-04-20 17:49:00 2017-04-20 18:40:00 19.32 2017-04-20 22:22:00 2017-04-20 22:53:00 29.2 2017-04-20 23:07:00 2017-04-20 23:27:00 10.94 2017-04-21 08:29:00 2017-04-21 08:40:00 1.91 2017-04-21 11:30:00 2017-04-21 11:32:00 0.42 2017-04-21 11:38:00 2017-04-21 11:40:00 0.4 2017-04-21 11:42:00 2017-04-21 12:15:00 19.09 2017-04-21 16:50:00 2017-04-21 18:17:00 40.61 2017-04-21 18:55:00 2017-04-21 19:11:00 1.73 2017-04-21 22:20:00 2017-04-21 22:53:00 28.26 2017-04-21 23:01:00 2017-04-21 23:22:00 11.76 2017-04-22 08:56:00 2017-04-22 08:58:00 0.63 2017-04-22 09:04:00 2017-04-22 09:08:00 0.3 2017-04-22 09:12:00 2017-04-22 09:15:00 0.42 2017-04-22 16:48:00 2017-04-22 16:52:00 0.54 2017-04-22 17:06:00 2017-04-22 17:09:00 0.51 2017-04-22 17:10:00 2017-04-22 17:13:00 1.03 2017-04-22 17:22:00 2017-04-22 17:27:00 1.1 2017-04-23 08:13:00 2017-04-23 08:15:00 0.41 2017-04-23 08:19:00 2017-04-23 08:20:00 0.4 2017-04-23 08:21:00 2017-04-23 08:25:00 1.99 2017-04-23 11:41:00 2017-04-23 11:48:00 2.04 2017-04-23 12:35:00 2017-04-23 12:50:00 7.59 2017-04-23 14:08:00 2017-04-23 14:21:00 7.31 2017-04-23 14:33:00 2017-04-23 15:38:00 37.6 2017-04-24 00:26:00 2017-04-24 01:18:00 39.21 2017-04-24 10:24:00 2017-04-24 10:26:00 0.41 2017-04-24 10:31:00 2017-04-24 10:35:00 1.37 2017-04-24 10:38:00 2017-04-24 10:43:00 1.19 2017-04-24 10:49:00 2017-04-24 11:15:00 19.58 2017-04-24 17:13:00 2017-04-24 18:20:00 37.42 2017-04-24 19:02:00 2017-04-24 19:08:00 1.76 2017-04-24 19:49:00 2017-04-24 19:55:00 1.79 2017-04-24 20:41:00 2017-04-24 21:16:00 32.31 2017-04-25 10:53:00 2017-04-25 11:25:00 24.83 2017-04-25 15:15:00 2017-04-25 15:24:00 3.07 2017-04-25 15:30:00 2017-04-25 15:40:00 3.01 2017-04-25 17:34:00 2017-04-25 18:18:00 24.8 2017-04-26 09:59:00 2017-04-26 10:28:00 24.05 2017-04-26 12:56:00 2017-04-26 13:40:00 29.13 2017-04-26 14:37:00 2017-04-26 15:34:00 21 2017-04-27 08:57:00 2017-04-27 10:21:00 40.56 2017-04-27 16:12:00 2017-04-27 16:44:00 9.89 2017-04-27 17:09:00 2017-04-27 18:01:00 17.51 2017-04-28 05:18:00 2017-04-28 06:06:00 39.28 2017-04-28 12:57:00 2017-04-28 13:52:00 35.82 2017-04-28 16:48:00 2017-04-28 18:14:00 39.1 2017-05-01 11:41:00 2017-05-01 12:20:00 18.74 2017-05-01 18:53:00 2017-05-01 19:34:00 37.15 2017-05-01 23:08:00 2017-05-01 23:09:00 0.06 2017-05-01 23:18:00 2017-05-02 00:11:00 38.61 2017-05-02 11:05:00 2017-05-02 11:42:00 24.07 2017-05-02 17:34:00 2017-05-02 18:53:00 26.42 2017-05-03 12:13:00 2017-05-03 12:25:00 3.96 2017-05-03 12:25:00 2017-05-03 12:56:00 21.15 2017-05-03 13:26:00 2017-05-03 13:44:00 3.32 2017-05-03 13:57:00 2017-05-03 14:08:00 3.49 2017-05-03 18:39:00 2017-05-03 19:08:00 24.85 2017-05-03 19:09:00 2017-05-03 19:13:00 0.99 2017-05-03 19:29:00 2017-05-03 19:32:00 0.84 2017-05-04 10:38:00 2017-05-04 11:06:00 24.05 2017-05-04 13:34:00 2017-05-04 14:10:00 1.73 2017-05-04 17:14:00 2017-05-04 18:23:00 24.68 2017-05-05 20:38:00 2017-05-05 20:52:00 2.24 2017-05-06 11:45:00 2017-05-06 12:30:00 20.19 2017-05-06 14:36:00 2017-05-06 15:35:00 14.49 2017-05-06 15:48:00 2017-05-06 16:17:00 5.25 2017-05-06 17:11:00 2017-05-06 17:13:00 0.43 2017-05-06 17:19:00 2017-05-06 17:21:00 0.43 2017-05-07 08:16:00 2017-05-07 08:22:00 3.27 2017-05-07 12:09:00 2017-05-07 12:16:00 2.01 2017-05-07 17:28:00 2017-05-07 17:50:00 10.36 2017-05-07 17:54:00 2017-05-07 18:01:00 1.19 2017-05-07 18:02:00 2017-05-07 18:35:00 28.31 2017-05-07 21:48:00 2017-05-07 21:52:00 1.46 2017-05-07 22:01:00 2017-05-07 22:05:00 1.37 2017-05-08 00:59:00 2017-05-08 02:19:00 39.23 2017-05-08 11:30:00 2017-05-08 11:58:00 22.55 2017-05-08 18:08:00 2017-05-08 18:30:00 10.47 2017-05-08 18:33:00 2017-05-08 19:09:00 28.44 2017-05-08 22:25:00 2017-05-08 23:09:00 38.65 2017-05-08 23:14:00 2017-05-08 23:17:00 1.04 2017-05-09 11:35:00 2017-05-09 12:19:00 23.99 2017-05-09 17:57:00 2017-05-09 18:59:00 29.38 2017-05-09 20:03:00 2017-05-09 20:13:00 1.9 2017-05-10 10:18:00 2017-05-10 10:54:00 24.06 2017-05-10 15:43:00 2017-05-10 16:46:00 24.71 2017-05-11 12:28:00 2017-05-11 13:07:00 21.75 2017-05-11 18:00:00 2017-05-11 18:31:00 19.3 2017-05-12 08:26:00 2017-05-12 08:55:00 20.46 2017-05-12 13:00:00 2017-05-12 13:34:00 14.6 2017-05-13 08:44:00 2017-05-13 08:46:00 0.38 2017-05-13 08:57:00 2017-05-13 09:01:00 0.33 2017-05-13 14:22:00 2017-05-13 14:41:00 6.86 2017-05-13 15:17:00 2017-05-13 15:35:00 5.2 2017-05-13 18:10:00 2017-05-13 18:21:00 1.91 2017-05-14 11:22:00 2017-05-14 11:26:00 0.9 2017-05-14 11:36:00 2017-05-14 11:38:00 0.39 2017-05-14 14:56:00 2017-05-14 15:59:00 40.07 2017-05-14 16:34:00 2017-05-14 16:41:00 1.49 2017-05-14 16:56:00 2017-05-14 17:04:00 1.45 2017-05-14 19:05:00 2017-05-14 20:06:00 39.21 2017-05-15 11:24:00 2017-05-15 11:33:00 1.91 2017-05-15 11:41:00 2017-05-15 12:13:00 19.84 2017-05-15 17:41:00 2017-05-15 18:11:00 16 2017-05-15 18:15:00 2017-05-15 19:23:00 31.52 2017-05-15 23:41:00 2017-05-16 00:26:00 39.32 2017-05-16 09:49:00 2017-05-16 11:02:00 24.91 2017-05-16 16:08:00 2017-05-16 16:32:00 3.37 2017-05-16 17:11:00 2017-05-16 17:32:00 4.8 2017-05-16 17:42:00 2017-05-16 17:56:00 1.81 2017-05-16 18:13:00 2017-05-16 18:46:00 24.85 2017-05-16 21:07:00 2017-05-16 21:10:00 1.04 2017-05-16 21:26:00 2017-05-16 21:29:00 1.02 2017-07-28 16:10:00 2017-07-28 16:17:00 2.22 2017-07-28 16:17:00 2017-07-28 16:42:00 7.84 2017-08-10 12:00:00 2017-08-10 12:44:00 24.05 2017-08-10 14:56:00 2017-08-10 15:10:00 1.61 2017-08-10 18:51:00 2017-08-10 19:21:00 24.85 2017-08-10 19:46:00 2017-08-10 19:56:00 1.14 2017-08-10 20:08:00 2017-08-10 20:12:00 1.09 2017-08-11 12:44:00 2017-08-11 12:49:00 0.82 2017-08-11 12:59:00 2017-08-11 13:01:00 0.56 2017-08-11 13:18:00 2017-08-11 15:12:00 1.79 2017-08-11 15:14:00 2017-08-11 16:53:00 34.6 2017-08-11 19:27:00 2017-08-11 20:34:00 34.91 2017-08-12 13:52:00 2017-08-12 13:56:00 1.05 2017-08-12 13:59:00 2017-08-12 14:02:00 0.28 2017-08-12 14:10:00 2017-08-12 14:30:00 1.22 2017-08-12 17:15:00 2017-08-12 17:36:00 11.37 2017-08-12 20:49:00 2017-08-12 21:05:00 10.43 2017-08-13 12:16:00 2017-08-13 12:44:00 12.96 2017-08-13 16:03:00 2017-08-13 16:32:00 14.33 2017-08-13 18:19:00 2017-08-13 18:42:00 9.32 2017-08-13 18:52:00 2017-08-13 19:05:00 3.99 2017-08-13 21:42:00 2017-08-13 21:53:00 5.6 2017-08-14 08:50:00 2017-08-14 09:45:00 24.1 2017-08-14 13:22:00 2017-08-14 13:54:00 24.84 2017-08-14 14:02:00 2017-08-14 15:34:00 36.92 2017-08-14 15:58:00 2017-08-14 17:17:00 35.7 2017-08-14 17:35:00 2017-08-14 17:45:00 1.99 2017-08-14 18:07:00 2017-08-14 18:27:00 9.92 2017-08-15 10:15:00 2017-08-15 10:51:00 25 2017-08-15 19:23:00 2017-08-15 19:29:00 0.4 2017-08-15 19:51:00 2017-08-15 20:45:00 24.39 2017-08-15 20:56:00 2017-08-15 21:04:00 2.78 2017-08-15 21:09:00 2017-08-15 21:37:00 19.22 2017-08-16 00:03:00 2017-08-16 00:27:00 15.51 2017-08-16 00:36:00 2017-08-16 00:41:00 1.23 2017-08-16 00:46:00 2017-08-16 01:18:00 11.35 2017-08-16 09:38:00 2017-08-16 09:41:00 1.21 2017-08-16 09:41:00 2017-08-16 09:43:00 0.08 2017-08-16 09:47:00 2017-08-16 10:32:00 22.89 2017-08-16 16:51:00 2017-08-16 17:11:00 3.14 2017-08-16 17:12:00 2017-08-16 17:25:00 2.76 2017-08-16 17:41:00 2017-08-16 18:36:00 24.78 2017-08-17 09:34:00 2017-08-17 10:13:00 24.03 2017-08-17 12:32:00 2017-08-17 13:07:00 24.82 2017-08-17 13:35:00 2017-08-17 13:40:00 0.4 2017-08-17 13:47:00 2017-08-17 15:07:00 36.06 2017-08-17 15:18:00 2017-08-17 15:24:00 0.06 2017-08-17 16:03:00 2017-08-17 18:05:00 35.16 2017-08-18 09:47:00 2017-08-18 10:23:00 24.47 2017-08-18 16:04:00 2017-08-18 16:42:00 1.63 2017-08-18 17:56:00 2017-08-18 18:25:00 10.74 2017-08-18 18:27:00 2017-08-18 18:48:00 1.85 2017-08-19 00:07:00 2017-08-19 00:41:00 18.92 2017-08-19 00:52:00 2017-08-19 00:55:00 0.99 2017-08-19 11:52:00 2017-08-19 12:14:00 7.56 2017-08-19 15:57:00 2017-08-19 16:12:00 4.02 2017-08-19 16:37:00 2017-08-19 16:56:00 5.32 2017-08-19 23:32:00 2017-08-19 23:50:00 7.54 2017-08-19 23:51:00 2017-08-20 00:17:00 9.59 2017-08-20 09:03:00 2017-08-20 09:16:00 5.22 2017-08-20 19:17:00 2017-08-20 19:32:00 4.69 2017-08-21 09:24:00 2017-08-21 09:40:00 2.31 2017-08-21 10:59:00 2017-08-21 11:02:00 0.47 2017-08-21 13:40:00 2017-08-21 15:29:00 36.09 2017-08-21 15:54:00 2017-08-21 16:48:00 2.24 2017-08-21 16:57:00 2017-08-21 18:15:00 32.3 2017-08-22 08:38:00 2017-08-22 09:06:00 0.65 2017-08-22 09:18:00 2017-08-22 09:19:00 0.04 2017-08-22 09:22:00 2017-08-22 10:05:00 23.49 2017-08-22 14:30:00 2017-08-22 15:02:00 1.7 2017-08-22 16:37:00 2017-08-22 17:41:00 24.8 2017-08-23 17:16:00 2017-08-23 18:14:00 24.01 2017-08-23 18:27:00 2017-08-23 18:32:00 1.05 2017-08-23 19:24:00 2017-08-23 20:04:00 18.14 2017-08-23 22:01:00 2017-08-23 22:28:00 16.33 2017-08-23 22:46:00 2017-08-23 22:50:00 1.04 2017-08-24 09:41:00 2017-08-24 09:44:00 0.02 2017-08-24 09:59:00 2017-08-24 10:00:00 0.02 2017-08-24 13:57:00 2017-08-24 15:33:00 42.51 2017-08-24 16:43:00 2017-08-24 17:00:00 0.07 2017-08-24 17:06:00 2017-08-24 17:33:00 10.01 2017-08-24 18:12:00 2017-08-24 19:03:00 27.67 2017-08-25 09:36:00 2017-08-25 09:55:00 2.63 2017-08-25 10:01:00 2017-08-25 10:32:00 20.92 2017-08-25 20:40:00 2017-08-25 21:45:00 17.41 2017-08-25 21:49:00 2017-08-25 22:14:00 16.02 2017-08-26 00:10:00 2017-08-26 02:14:00 29.77 2017-08-26 16:31:00 2017-08-26 16:55:00 7.15 2017-08-26 17:54:00 2017-08-26 18:19:00 10 2017-08-26 20:07:00 2017-08-26 20:08:00 0.19 2017-08-26 20:08:00 2017-08-26 20:11:00 1.35 2017-08-27 12:39:00 2017-08-27 12:54:00 1 2017-08-27 12:55:00 2017-08-27 13:48:00 9.29 2017-08-27 14:00:00 2017-08-27 14:34:00 3.86 2017-08-27 15:56:00 2017-08-27 16:37:00 10.45 2017-08-27 16:44:00 2017-08-27 16:51:00 1.8 2017-08-27 16:55:00 2017-08-27 17:00:00 0.68 2017-08-27 17:04:00 2017-08-27 17:19:00 4.96 2017-08-27 17:28:00 2017-08-27 17:39:00 2.33 2017-08-27 17:47:00 2017-08-27 18:58:00 24.19 2017-08-27 22:17:00 2017-08-27 22:41:00 16.24 2017-08-28 00:33:00 2017-08-28 01:22:00 13.62 2017-08-28 12:48:00 2017-08-28 12:51:00 0.47 2017-08-28 14:01:00 2017-08-28 14:03:00 0.4 2017-08-28 14:12:00 2017-08-28 15:31:00 34.86 2017-08-28 15:56:00 2017-08-28 17:04:00 34.47 2017-08-28 22:15:00 2017-08-28 22:38:00 18.57 2017-08-29 01:42:00 2017-08-29 02:05:00 18.88 2017-08-29 11:40:00 2017-08-29 11:44:00 1.04 2017-08-29 11:48:00 2017-08-29 12:09:00 0.03 2017-08-29 12:18:00 2017-08-29 12:21:00 0.03 2017-08-29 12:26:00 2017-08-29 12:32:00 1.05 2017-08-29 12:35:00 2017-08-29 13:15:00 24.05 2017-08-29 19:40:00 2017-08-29 19:42:00 0.35 2017-08-29 19:50:00 2017-08-29 20:19:00 27.72 2017-08-29 20:25:00 2017-08-29 20:41:00 10.42 2017-08-30 10:00:00 2017-08-30 10:47:00 24.25 2017-08-30 14:31:00 2017-08-30 14:56:00 1.68 2017-08-30 17:19:00 2017-08-30 17:43:00 0.04 2017-08-30 17:43:00 2017-08-30 17:50:00 0.29 2017-08-30 17:56:00 2017-08-30 18:40:00 16.85 2017-08-30 22:57:00 2017-08-30 23:35:00 17.31 2017-08-31 11:30:00 2017-08-31 11:41:00 0.43 2017-08-31 14:04:00 2017-08-31 14:06:00 0.41 2017-08-31 14:24:00 2017-08-31 14:26:00 0.68 2017-08-31 14:31:00 2017-08-31 15:42:00 34.88 2017-08-31 16:01:00 2017-08-31 17:07:00 30.45 2017-08-31 20:54:00 2017-08-31 21:21:00 19.6 2017-09-01 10:30:00 2017-09-01 10:59:00 17.63 2017-09-01 14:07:00 2017-09-01 15:07:00 27.45 2017-09-01 17:17:00 2017-09-01 17:36:00 1.93 2017-09-01 18:16:00 2017-09-01 19:19:00 20.58 2017-09-01 19:25:00 2017-09-01 19:38:00 4.8 2017-09-01 21:30:00 2017-09-01 21:54:00 1.94 2017-09-02 15:46:00 2017-09-02 16:06:00 0.99 2017-09-02 16:13:00 2017-09-02 16:16:00 1.01 2017-09-02 16:56:00 2017-09-02 16:59:00 0.42 2017-09-02 17:04:00 2017-09-02 17:06:00 0.4 2017-09-02 22:52:00 2017-09-02 22:54:00 0.07 2017-09-02 22:55:00 2017-09-02 23:15:00 18.62 2017-09-03 01:46:00 2017-09-03 02:10:00 18.9 2017-09-03 14:49:00 2017-09-03 15:04:00 3.14 2017-09-03 15:50:00 2017-09-03 16:07:00 10.17 2017-09-03 16:21:00 2017-09-03 16:38:00 7.79 2017-09-03 16:47:00 2017-09-03 16:52:00 1.11 2017-09-03 18:32:00 2017-09-03 18:37:00 1.2 2017-09-03 18:37:00 2017-09-03 18:44:00 0.91 2017-09-04 15:50:00 2017-09-04 15:54:00 0.42 2017-09-04 15:59:00 2017-09-04 16:11:00 2.3 2017-09-04 16:21:00 2017-09-04 16:43:00 8.31 2017-09-04 17:05:00 2017-09-04 17:15:00 2.54 2017-09-04 17:26:00 2017-09-04 17:41:00 4.52 2017-09-04 17:49:00 2017-09-04 18:25:00 29.55 2017-09-04 19:36:00 2017-09-04 19:51:00 0.93 2017-09-04 19:54:00 2017-09-04 19:59:00 0.5 2017-09-04 21:21:00 2017-09-04 21:55:00 29.37 2017-09-05 11:08:00 2017-09-05 11:51:00 35.5 2017-09-05 12:36:00 2017-09-05 13:07:00 2.29 2017-09-05 13:19:00 2017-09-05 13:22:00 0.51 2017-09-05 13:26:00 2017-09-05 14:03:00 33.09 2017-09-05 14:13:00 2017-09-05 15:01:00 24.03 2017-09-05 17:33:00 2017-09-05 18:11:00 14.55 2017-09-05 19:01:00 2017-09-05 19:19:00 11.31 2017-09-06 09:21:00 2017-09-06 09:39:00 7.73 2017-09-06 10:14:00 2017-09-06 10:30:00 7.75 2017-09-06 10:37:00 2017-09-06 11:13:00 24.13 2017-09-06 16:48:00 2017-09-06 17:35:00 25.3 2017-09-06 17:49:00 2017-09-06 17:55:00 0.18 2017-09-06 17:58:00 2017-09-06 18:00:00 0.39 2017-09-06 18:38:00 2017-09-06 19:04:00 15.93 2017-09-06 23:45:00 2017-09-07 00:14:00 19.45 2017-09-07 00:26:00 2017-09-07 00:30:00 1.01 2017-09-07 10:42:00 2017-09-07 11:35:00 31.74 2017-09-07 14:04:00 2017-09-07 14:39:00 27.38 2017-09-07 14:43:00 2017-09-07 14:52:00 3.06 2017-09-07 14:54:00 2017-09-07 16:00:00 32.96 2017-09-07 16:32:00 2017-09-07 16:33:00 0.07 2017-09-07 16:38:00 2017-09-07 17:04:00 2.31 2017-09-07 17:23:00 2017-09-07 18:14:00 33.03 2017-09-08 10:02:00 2017-09-08 10:30:00 19.73 2017-09-08 18:09:00 2017-09-08 18:37:00 18.97 2017-09-08 19:04:00 2017-09-08 19:18:00 1.87 2017-09-09 02:25:00 2017-09-09 02:28:00 1.1 2017-09-09 02:33:00 2017-09-09 02:35:00 1.05 2017-09-10 17:09:00 2017-09-10 17:44:00 14.25 2017-09-10 22:50:00 2017-09-10 22:53:00 0.25 2017-09-10 22:56:00 2017-09-10 22:57:00 0.02 2017-09-10 23:00:00 2017-09-10 23:23:00 16.18 2017-09-11 00:01:00 2017-09-11 00:19:00 1.83 2017-09-11 09:59:00 2017-09-11 10:06:00 1.91 2017-09-11 10:12:00 2017-09-11 10:51:00 27.49 2017-09-11 13:39:00 2017-09-11 14:13:00 27.23 2017-09-11 14:31:00 2017-09-11 15:31:00 35.45 2017-09-11 16:03:00 2017-09-11 17:09:00 36.01 2017-09-11 17:39:00 2017-09-11 18:01:00 9.88 2017-09-11 23:01:00 2017-09-11 23:05:00 1.14 2017-09-11 23:16:00 2017-09-11 23:30:00 5.93 2017-09-11 23:30:00 2017-09-11 23:54:00 4.94 2017-09-12 02:56:00 2017-09-12 04:00:00 25.87 2017-09-12 10:06:00 2017-09-12 10:46:00 24.84 2017-09-12 16:33:00 2017-09-12 17:20:00 22.43 2017-09-12 19:38:00 2017-09-12 20:14:00 21.79 2017-09-13 06:24:00 2017-09-13 06:59:00 25.84 2017-09-13 07:02:00 2017-09-13 07:14:00 5.77 2017-09-13 11:14:00 2017-09-13 11:36:00 16.26 2017-09-13 16:01:00 2017-09-13 16:57:00 24.79 2017-09-13 17:07:00 2017-09-13 17:48:00 15.94 2017-09-13 23:13:00 2017-09-13 23:35:00 16.73 2017-09-14 12:00:00 2017-09-14 12:27:00 19.71 2017-09-14 12:28:00 2017-09-14 12:30:00 0.18 2017-09-14 14:36:00 2017-09-14 15:06:00 14.98 2017-09-14 15:11:00 2017-09-14 15:17:00 2.99 2017-09-14 15:26:00 2017-09-14 16:44:00 37.48 2017-09-14 17:03:00 2017-09-14 18:17:00 34.18 2017-09-14 18:32:00 2017-09-14 18:41:00 3.03 2017-09-15 10:25:00 2017-09-15 10:26:00 0.05 2017-09-15 10:45:00 2017-09-15 10:48:00 0.29 2017-09-15 10:59:00 2017-09-15 11:05:00 0.3 2017-09-15 11:09:00 2017-09-15 11:36:00 10.82 2017-09-15 13:00:00 2017-09-15 13:17:00 8.37 2017-09-15 13:36:00 2017-09-15 14:30:00 25.19 2017-09-15 14:37:00 2017-09-15 15:01:00 0.45 2017-09-15 15:04:00 2017-09-15 16:59:00 85.51 2017-09-15 17:06:00 2017-09-15 18:57:00 129.72 2017-09-15 19:03:00 2017-09-15 20:02:00 60.96 2017-09-16 10:18:00 2017-09-16 10:39:00 16.04 2017-09-16 11:52:00 2017-09-16 12:12:00 16.68 2017-09-16 12:28:00 2017-09-16 13:29:00 49 2017-09-16 18:36:00 2017-09-16 19:30:00 45.7 2017-09-16 19:39:00 2017-09-16 19:47:00 2.1 2017-09-17 13:32:00 2017-09-17 13:41:00 2.24 2017-09-17 14:19:00 2017-09-17 14:48:00 14.68 2017-09-17 18:25:00 2017-09-17 18:26:00 0.05 2017-09-17 18:36:00 2017-09-17 19:03:00 12.26 2017-09-18 07:52:00 2017-09-18 08:03:00 2.04 2017-09-18 08:21:00 2017-09-18 08:56:00 37.94 2017-09-18 09:01:00 2017-09-18 09:53:00 65.7 2017-09-18 10:04:00 2017-09-18 10:34:00 39.43 2017-09-18 10:46:00 2017-09-18 11:07:00 14.25 2017-09-18 11:19:00 2017-09-18 13:29:00 138.98 2017-09-18 14:24:00 2017-09-18 14:26:00 0.04 2017-09-18 14:28:00 2017-09-18 15:23:00 35.52 2017-09-18 15:53:00 2017-09-18 17:49:00 36.64 2017-09-19 09:24:00 2017-09-19 10:22:00 24.37 2017-09-19 15:55:00 2017-09-19 16:53:00 15.87 2017-09-19 16:53:00 2017-09-19 17:20:00 0.85 2017-09-19 17:33:00 2017-09-19 18:06:00 10.95 2017-09-19 18:10:00 2017-09-19 18:34:00 8.41 2017-09-19 21:06:00 2017-09-19 21:10:00 1.24 2017-09-19 21:17:00 2017-09-19 21:21:00 1.05 2017-09-20 11:12:00 2017-09-20 11:16:00 1.22 2017-09-20 11:18:00 2017-09-20 11:59:00 24.15 2017-09-20 17:20:00 2017-09-20 18:07:00 24.15 2017-09-20 18:50:00 2017-09-20 19:17:00 16.02 2017-09-20 22:05:00 2017-09-20 22:32:00 17.5 2017-09-21 13:38:00 2017-09-21 13:44:00 0.72 2017-09-21 13:50:00 2017-09-21 15:26:00 35.81 2017-09-21 15:59:00 2017-09-21 16:15:00 8.26 2017-09-21 16:19:00 2017-09-21 17:32:00 28.1 2017-09-21 18:49:00 2017-09-21 19:25:00 16.05 2017-09-21 22:30:00 2017-09-21 22:59:00 16.97 2017-09-22 10:19:00 2017-09-22 10:21:00 0.43 2017-09-22 10:25:00 2017-09-22 10:26:00 0.4 2017-09-22 10:30:00 2017-09-22 10:54:00 19.15 2017-09-22 11:58:00 2017-09-22 12:02:00 1.05 2017-09-22 18:32:00 2017-09-22 18:59:00 20.95 2017-09-23 08:34:00 2017-09-23 08:51:00 1.15 2017-09-23 09:19:00 2017-09-23 10:31:00 37.57 2017-09-23 11:09:00 2017-09-23 11:23:00 5.67 2017-09-23 11:51:00 2017-09-23 12:15:00 4.64 2017-09-23 12:47:00 2017-09-23 13:40:00 8.45 2017-09-23 13:56:00 2017-09-23 15:08:00 34.62 2017-09-23 15:37:00 2017-09-23 16:07:00 1.56 2017-09-24 14:59:00 2017-09-24 15:02:00 0.43 2017-09-24 15:14:00 2017-09-24 17:09:00 6.6 2017-09-24 17:37:00 2017-09-24 18:01:00 7.05 2017-09-24 18:05:00 2017-09-24 18:07:00 0.41 2017-09-24 19:35:00 2017-09-24 20:31:00 25.28 2017-09-25 00:24:00 2017-09-25 00:26:00 0.42 2017-09-25 00:30:00 2017-09-25 01:10:00 23.13 2017-09-25 12:12:00 2017-09-25 12:38:00 19.45 2017-09-25 14:22:00 2017-09-25 14:50:00 19.86 2017-09-25 14:52:00 2017-09-25 15:54:00 35.53 2017-09-25 16:37:00 2017-09-25 18:17:00 34.54 2017-09-25 20:36:00 2017-09-25 21:08:00 28.91 2017-09-26 01:46:00 2017-09-26 02:21:00 26.32 2017-09-26 09:36:00 2017-09-26 10:18:00 24.02 2017-09-26 14:05:00 2017-09-26 14:39:00 25.3 2017-09-26 15:49:00 2017-09-26 15:58:00 1.53 2017-09-26 16:15:00 2017-09-26 16:22:00 1.1 2017-09-27 09:15:00 2017-09-27 10:16:00 24.76 2017-09-27 16:26:00 2017-09-27 17:49:00 35.87 2017-09-27 17:58:00 2017-09-27 18:46:00 27.64 2017-09-27 18:51:00 2017-09-27 18:59:00 2.08 2017-09-27 19:10:00 2017-09-27 20:17:00 21.17 2017-09-27 20:25:00 2017-09-27 21:56:00 3.6 2017-09-27 22:04:00 2017-09-27 22:32:00 16.56 2017-09-28 06:46:00 2017-09-28 07:19:00 14.4 2017-09-28 09:05:00 2017-09-28 09:29:00 8.06 2017-09-28 10:41:00 2017-09-28 11:21:00 22.34 2017-09-28 14:26:00 2017-09-28 16:05:00 35.57 2017-09-28 16:09:00 2017-09-28 16:21:00 1.17 2017-09-28 20:37:00 2017-09-28 20:40:00 1.1 2017-09-28 20:56:00 2017-09-28 21:00:00 1.15 2017-09-29 09:32:00 2017-09-29 10:02:00 19.73 

Me gustaría trazar estos eventos discretos de la misma manera que lo hacen los gráficos a continuación, pero donde 2pi es una semana en lugar de 24 horas para iluminar la periodicidad de estos eventos, donde el color representa la distancia.

Eventos discretos en una trama de series de tiempo en espiral Trama espiral de series de tiempo discretas

Intenté modificar la solución vinculada al principio de esta pregunta, pero no me ha llegado a ninguna parte. Mi nuevo enfoque es modificar esta solución , pero me cuesta mucho conseguir algo más que líneas horizontales y verticales dispersas alrededor de una espiral. Hacerlos curvar y mostrar en las ubicaciones correctas es difícil.

Estoy abierto a cualquier enfoque que muestre con éxito los datos en una gráfica en espiral sin cuantizarlos / agruparlos en intervalos específicos, sino que permite que los intervalos mismos describan eventos discretos a lo largo de una línea de tiempo en espiral continua. Del mismo modo, no estoy interesado en convertir esto a un formato de series de tiempo sin un solo punto en el que tendría una gran cantidad de datos que representan el tiempo entre viajes. Me gustaría lograr esto en un formato temporal (uno que describa una ventana de tiempo en lugar de un evento en un momento determinado).

Todavía necesita trabajo, pero es un comienzo, con python y matplotlib.

La idea es trazar una línea de tiempo en espiral en coordenadas polares con un período de 1 semana, cada evento es un arco de esta espiral con un color que depende de los datos dist .

Sin embargo, hay muchos intervalos superpuestos que esta visualización tiende a ocultar … tal vez los arcos semitransparentes podrían ser mejores, con un mapa de colores cuidadosamente elegido.

 import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.patheffects as mpe import pandas as pd # styling LINEWIDTH=4 EDGEWIDTH=1 CAPSTYLE="projecting" COLORMAP="viridis_r" ALPHA=1 FIRSTDAY=6 # 0=Mon, 6=Sun # load dataset and parse timestamps df = pd.read_csv('trips.csv') df[['trip_start', 'trip_stop']] = df[['trip_start', 'trip_stop']].apply(pd.to_datetime) # set origin at the first FIRSTDAY before the first trip, midnight first_trip = df['trip_start'].min() origin = (first_trip - pd.to_timedelta(first_trip.weekday() - FIRSTDAY, unit='d')).replace(hour=0, minute=0, second=0) weekdays = pd.date_range(origin, origin + np.timedelta64(1, 'W')).strftime("%a").tolist() # # convert trip timestamps to week fractions df['start'] = (df['trip_start'] - origin) / np.timedelta64(1, 'W') df['stop'] = (df['trip_stop'] - origin) / np.timedelta64(1, 'W') # sort dataset so shortest trips are plotted last # should prevent longer events to cover shorter ones, still suboptimal df = df.sort_values('dist', ascending=False).reset_index() fig = plt.figure(figsize=(8, 6)) ax = fig.gca(projection="polar") for idx, event in df.iterrows(): # sample normalized distance from colormap ndist = event['dist'] / df['dist'].max() color = plt.cm.get_cmap(COLORMAP)(ndist) tstart, tstop = event.loc[['start', 'stop']] # timestamps are in week fractions, 2pi is one week nsamples = int(1000. * (tstop - tstart)) t = np.linspace(tstart, tstop, nsamples) theta = 2 * np.pi * t arc, = ax.plot(theta, t, lw=LINEWIDTH, color=color, solid_capstyle=CAPSTYLE, alpha=ALPHA) if EDGEWIDTH > 0: arc.set_path_effects([mpe.Stroke(linewidth=LINEWIDTH+EDGEWIDTH, foreground='black'), mpe.Normal()]) # grid and labels ax.set_rticks([]) ax.set_theta_zero_location("N") ax.set_theta_direction(-1) ax.set_xticks(np.linspace(0, 2*np.pi, 7, endpoint=False)) ax.set_xticklabels(weekdays) ax.tick_params('x', pad=2) ax.grid(True) # setup a custom colorbar, everything's always a bit tricky with mpl colorbars vmin = df['dist'].min() vmax = df['dist'].max() norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) sm = plt.cm.ScalarMappable(cmap=COLORMAP, norm=norm) sm.set_array([]) plt.colorbar(sm, ticks=np.linspace(vmin, vmax, 10), fraction=0.04, aspect=60, pad=0.1, label="distance", ax=ax) plt.savefig("spiral.png", pad_inches=0, bbox_inches="tight") 

parcela de viajes

Línea de tiempo completa

Para ver que es una espiral que nunca se superpone y funciona para eventos más largos, también puede trazar la línea de tiempo completa (aquí con LINEWIDTH=3.5 para limitar el efecto de muaré).

 fullt = np.linspace(df['start'].min(), df['stop'].max(), 10000) theta = 2 * np.pi * fullt ax.plot(theta, fullt, lw=LINEWIDTH, path_effects=[mpe.Stroke(linewidth=LINEWIDTH+LINEBORDER, foreground='black'), mpe.Normal()]) 

línea de tiempo completa

Ejemplo con un conjunto aleatorio …

Aquí está la ttwig para un conjunto de datos aleatorio de 200 viajes, principalmente cortos, con los ocasionales de 1 a 2 semanas de duración.

 N = 200 df = pd.DataFrame() df["start"] = np.random.uniform(0, 20, size=N) df["stop"] = df["start"] + np.random.choice([np.random.uniform(0, 0.1), np.random.uniform(1., 2.)], p=[0.98, 0.02], size=N) df["dist"] = np.random.random(size=N) 

eventos aleatorios

… y diferentes estilos

inferno_r colores de Inferno_r, casquillos de líneas redondeados o empalmados, semitransparentes, bordes más audaces, etc.

bordes redondeados, menos abarrotados bordes redondeados blancos semitransparente superposición a tope

Aquí hay un comienzo. Déjame saber si esto es lo que tenías en mente.

Comencé con su muestra de datos y puse trip_start y trip_stop en formato POSIXct antes de continuar con el código a continuación.

 library(tidyverse) library(lubridate) dat = dat %>% mutate(start=(hour(trip_start)*60 + minute(trip_start) + second(trip_start))/(24*60) + wday(trip_start), stop=(hour(trip_stop)*60 + minute(trip_stop) + second(trip_stop))/(24*60) + wday(trip_stop), tod = case_when(hour(trip_start) < 6 ~ "night", hour(trip_start) < 12 ~ "morning", hour(trip_start) < 18 ~ "afternoon", hour(trip_start) < 24 ~ "evening")) ggplot(dat) + geom_segment(aes(x=start, xend=stop, y=trip_start, yend=trip_stop, colour=tod), size=5, show.legend = FALSE) + coord_polar() + scale_y_datetime(breaks=seq(as.POSIXct("2017-09-01"), as.POSIXct("2017-12-31"), by="week")) + scale_x_continuous(limits=c(1,8), breaks=1:7, labels=weekdays(x=as.Date(seq(7)+2, origin="1970-01-01"), abbreviate=TRUE))+ expand_limits(y=as.POSIXct("2017-08-25")) + theme_bw() + scale_colour_manual(values=c(night="black", morning="orange", afternoon="orange", evening="blue")) + labs(x="",y="") 

introduzca la descripción de la imagen aquí

Esto podría lograrse de manera relativamente sencilla con d3. Usaré sus datos para crear una plantilla aproximada de un enfoque básico posible. Aquí es cómo se vería el resultado de este enfoque:

introduzca la descripción de la imagen aquí

El ingrediente clave es el componente de la línea radial de d3 que nos permite definir una línea al trazar el ángulo y el radio ( aquí hay una respuesta reciente que muestra otro gráfico en espiral, esa respuesta me inició por el camino en esta respuesta).

Todo lo que necesitamos hacer es escalar el ángulo y el radio para poder usar esto de manera efectiva (para lo que necesitamos la primera vez y la última vez en el conjunto de datos):

 var angle = d3.scaleTime() .domain([start,end]) .range([0,Math.PI * 2 * numberWeeks]) var radius = d3.scaleTime() .domain([start,end]) .range([minInnerRadius,maxOuterRadius]) 

Y desde allí podemos crear una espiral con bastante facilidad, muestreamos algunas fechas a lo largo del intervalo y luego las pasamos a la función de línea radial:

 var spiral = d3.radialLine() .curve(d3.curveCardinal) .angle(angle) .radius(radius); 

Aquí hay una demostración rápida de solo la espiral que cubre su período de tiempo. Estoy asumiendo una base de familiaridad con d3 para esta respuesta, por lo que no he tocado algunas partes del código.

Una vez que tenemos eso, es solo cuestión de agregar secciones de los datos. La forma más sencilla sería dibujar claramente un trazo con un poco de ancho y colorearlo adecuadamente. Esto requiere lo mismo que anteriormente, pero en lugar de puntos de muestreo desde las horas de inicio y finalización del conjunto de datos, solo necesitamos las horas de inicio y finalización de cada dato:

  // append segments on spiral: var segments = g.selectAll() .data(data) .enter() .append("path") .attr("d", function(d) { return /* sample points and feed to spiral function here */; }) .style("stroke-width", /* appropriate width here */ ) .style("stroke",function(d) { return /* color logic here */ }) 

Esto podría parecer algo así (con mouseover de datos).

Esto es solo una prueba de concepto, si buscaba más control y una apariencia más agradable, podría crear una ruta poligonal para cada entrada de datos y usar tanto el relleno como el trazo. Tal como está, tendrá que conformarse con trazos de capas para obtener bordes si lo desea y manipulaciones svg como opciones de límite de línea.

Además, como es d3, y los períodos de tiempo más largos pueden ser difíciles de mostrar todos a la vez, podría mostrar menos tiempo pero girar la espiral para que se anime a lo largo de su intervalo de tiempo, dejando los eventos al final y creandolos en el origen. Es posible que el gráfico real tenga que ser canvas para que esto suceda sin problemas dependiendo del número de nodos, pero convertir a canvas es relativamente trivial en este caso.


Para completar un poco la visualización con una leyenda y tags de día, esto es lo que tengo.