25
25
from matplotlib import pyplot
26
26
from netCDF4 import Dataset
27
27
from matplotlib .collections import LineCollection
28
+ from datetime import datetime
28
29
from py_eddy_tracker .poly import create_vertice
29
30
from py_eddy_tracker .generic import flatten_line_matrix
30
31
from py_eddy_tracker import EddyParser
@@ -63,12 +64,13 @@ def merge_eddies():
63
64
64
65
65
66
class Anim :
66
- def __init__ (self , eddy , intern , ** kwargs ):
67
+ def __init__ (self , eddy , intern = False , sleep_event = 0.1 , ** kwargs ):
67
68
self .eddy = eddy
68
69
x_name , y_name = eddy .intern (intern )
69
70
self .t , self .x , self .y = eddy .time , eddy [x_name ], eddy [y_name ]
70
71
self .pause = False
71
72
self .period = self .eddy .period
73
+ self .sleep_event = sleep_event
72
74
self .setup (** kwargs )
73
75
74
76
def setup (self , cmap = "jet" , nb_step = 25 ):
@@ -99,13 +101,16 @@ def setup(self, cmap="jet", nb_step=25):
99
101
zorder = 10 ,
100
102
bbox = dict (facecolor = "w" , alpha = 0.85 ),
101
103
)
104
+ self .display_speed = self .ax .text (
105
+ x_min + 0.02 * d_x , y_max - 0.04 * d_y , "" , fontsize = 10
106
+ )
102
107
self .contour = LineCollection ([], zorder = 1 )
103
108
self .ax .add_collection (self .contour )
104
109
105
110
self .fig .canvas .draw ()
106
111
self .fig .canvas .mpl_connect ("key_press_event" , self .keyboard )
107
112
108
- def show (self , sleep_event = 0.1 , infinity_loop = False ):
113
+ def show (self , infinity_loop = False ):
109
114
pyplot .show (block = False )
110
115
# save background for future bliting
111
116
self .bg_cache = self .fig .canvas .copy_from_bbox (self .ax .bbox )
@@ -115,9 +120,17 @@ def show(self, sleep_event=0.1, infinity_loop=False):
115
120
self .segs = list ()
116
121
self .now = t0
117
122
while True :
123
+ dt = self .sleep_event
118
124
if not self .pause :
125
+ d0 = datetime .now ()
119
126
self .next ()
120
- self .fig .canvas .start_event_loop (sleep_event )
127
+ dt_draw = (datetime .now () - d0 ).total_seconds ()
128
+ dt = self .sleep_event - dt_draw
129
+ if dt < 0 :
130
+ self .sleep_event = dt_draw * 1.01
131
+ dt = 1e-10
132
+ self .fig .canvas .start_event_loop (dt )
133
+
121
134
if self .now > t1 :
122
135
break
123
136
if infinity_loop :
@@ -149,8 +162,10 @@ def draw_contour(self):
149
162
self .contour .set_paths (self .segs )
150
163
self .contour .set_color (self .colors [- len (self .segs ) :])
151
164
self .txt .set_text (f"{ t0 } -> { self .now } -> { t1 } " )
165
+ self .display_speed .set_text (f"{ 1 / self .sleep_event :.0f} frame/s" )
152
166
self .ax .draw_artist (self .contour )
153
167
self .ax .draw_artist (self .txt )
168
+ self .ax .draw_artist (self .display_speed )
154
169
# Remove first segment to keep only T contour
155
170
if len (self .segs ) > self .nb_step :
156
171
self .segs .pop (0 )
@@ -162,6 +177,10 @@ def keyboard(self, event):
162
177
exit ()
163
178
elif event .key == " " :
164
179
self .pause = not self .pause
180
+ elif event .key == "+" :
181
+ self .sleep_event *= 0.9
182
+ elif event .key == "-" :
183
+ self .sleep_event *= 1.1
165
184
elif event .key == "right" and self .pause :
166
185
self .next ()
167
186
elif event .key == "left" and self .pause :
@@ -172,7 +191,8 @@ def keyboard(self, event):
172
191
173
192
def anim ():
174
193
parser = EddyParser (
175
- "Anim eddy, keyboard shortcut : Escape => exit, SpaceBar => pause, left arrow => t - 1, right arrow => t + 1"
194
+ """Anim eddy, keyboard shortcut : Escape => exit, SpaceBar => pause,
195
+ left arrow => t - 1, right arrow => t + 1, + => speed increase of 10 %, - => speed decrease of 10 %"""
176
196
)
177
197
parser .add_argument ("filename" , help = "eddy atlas" )
178
198
parser .add_argument ("id" , help = "Track id to anim" , type = int )
@@ -195,8 +215,16 @@ def anim():
195
215
"--infinity_loop" , action = "store_true" , help = "Press Escape key to stop loop"
196
216
)
197
217
args = parser .parse_args ()
218
+ variables = ["time" , "track" ]
219
+ variables .extend (TrackEddiesObservations .intern (args .intern , public_label = True ))
198
220
199
- atlas = TrackEddiesObservations .load_file (args .filename )
221
+ atlas = TrackEddiesObservations .load_file (args .filename , include_vars = variables )
200
222
eddy = atlas .extract_ids ([args .id ])
201
- a = Anim (eddy , intern = args .intern , cmap = args .cmap , nb_step = args .keep_step )
202
- a .show (sleep_event = args .time_sleep , infinity_loop = args .infinity_loop )
223
+ a = Anim (
224
+ eddy ,
225
+ intern = args .intern ,
226
+ sleep_event = args .time_sleep ,
227
+ cmap = args .cmap ,
228
+ nb_step = args .keep_step ,
229
+ )
230
+ a .show (infinity_loop = args .infinity_loop )
0 commit comments