@@ -135,6 +135,20 @@ def bode_plot(syslist, omega=None, dB=None, Hz=None, deg=None,
135
135
else :
136
136
omega = sp .logspace (np .log10 (omega_limits [0 ]), np .log10 (omega_limits [1 ]), endpoint = True )
137
137
138
+ if Plot :
139
+ fig = plt .gcf ()
140
+ ax_mag = None
141
+ ax_phase = None
142
+ for ax in fig .axes :
143
+ if ax .get_label () == 'pycontrol-bode-mag' :
144
+ ax_mag = ax
145
+ elif ax .get_label () == 'pycontrol-bode-phs' :
146
+ ax_phase = ax
147
+ if ax_mag is None or ax_phase is None :
148
+ plt .clf ()
149
+ ax_mag = plt .subplot (211 , label = 'pycontrol-bode-mag' )
150
+ ax_phase = plt .subplot (212 , label = 'pycontrol-bode-phs' , sharex = ax_mag )
151
+
138
152
mags , phases , omegas , nyquistfrqs = [], [], [], []
139
153
for sys in syslist :
140
154
if (sys .inputs > 1 or sys .outputs > 1 ):
@@ -177,8 +191,6 @@ def bode_plot(syslist, omega=None, dB=None, Hz=None, deg=None,
177
191
figlabel = str (random .randint (1 , 1e6 ))
178
192
179
193
# Magnitude plot
180
- ax_mag = plt .subplot (211 , label = figlabel );
181
-
182
194
if dB :
183
195
pltline = ax_mag .semilogx (omega_plot , 20 * np .log10 (mag ),
184
196
* args , ** kwargs )
@@ -194,7 +206,6 @@ def bode_plot(syslist, omega=None, dB=None, Hz=None, deg=None,
194
206
ax_mag .set_ylabel ("Magnitude (dB)" if dB else "Magnitude" )
195
207
196
208
# Phase plot
197
- ax_phase = plt .subplot (212 , sharex = ax_mag );
198
209
if deg :
199
210
phase_plot = phase * 180. / math .pi
200
211
else :
@@ -362,32 +373,45 @@ def gangof4_plot(P, C, omega=None):
362
373
S = feedback (1 , L );
363
374
T = L * S ;
364
375
365
- # Create a unique label to fix bug in matplotlib<=2.1
366
- # See https://github.com/matplotlib/matplotlib/issues/9024
367
- import random
368
- figlabel = str (random .randint (1 , 1e6 ))
376
+ plot_axes = {'t' : None , 's' : None , 'ps' : None , 'cs' : None }
377
+ for ax in plt .gcf ().axes :
378
+ label = ax .get_label ()
379
+ if label .startswith ('pycontrol-gof-' ):
380
+ key = label [len ('pycontrol-gof-' ):]
381
+ if key not in plot_axes :
382
+ raise RuntimeError ("unknown gof axis type '{}'" .format (label ))
383
+ plot_axes [key ] = ax
384
+
385
+ # if any are missing, start from scratch
386
+ if any ((ax is None for ax in plot_axes .values ())):
387
+ plt .clf ()
388
+ plot_axes = {'t' : plt .subplot (221 ,label = 'pycontrol-gof-t' ),
389
+ 'ps' : plt .subplot (222 ,label = 'pycontrol-gof-ps' ),
390
+ 'cs' : plt .subplot (223 ,label = 'pycontrol-gof-cs' ),
391
+ 's' : plt .subplot (224 ,label = 'pycontrol-gof-s' )}
392
+
393
+ # Plot the four sensitivity functions
369
394
370
- # Plot the four sensitivity functions
371
395
#! TODO: Need to add in the mag = 1 lines
372
396
mag_tmp , phase_tmp , omega = T .freqresp (omega );
373
397
mag = np .squeeze (mag_tmp )
374
398
phase = np .squeeze (phase_tmp )
375
- plt . subplot ( 221 , label = figlabel ); plt .loglog (omega , mag );
399
+ plot_axes [ 't' ] .loglog (omega , mag );
376
400
377
401
mag_tmp , phase_tmp , omega = (P * S ).freqresp (omega );
378
402
mag = np .squeeze (mag_tmp )
379
403
phase = np .squeeze (phase_tmp )
380
- plt . subplot ( 222 , label = figlabel ); plt .loglog (omega , mag );
404
+ plot_axes [ 'ps' ] .loglog (omega , mag );
381
405
382
406
mag_tmp , phase_tmp , omega = (C * S ).freqresp (omega );
383
407
mag = np .squeeze (mag_tmp )
384
408
phase = np .squeeze (phase_tmp )
385
- plt . subplot ( 223 , label = figlabel ); plt .loglog (omega , mag );
409
+ plot_axes [ 'cs' ] .loglog (omega , mag );
386
410
387
411
mag_tmp , phase_tmp , omega = S .freqresp (omega );
388
412
mag = np .squeeze (mag_tmp )
389
413
phase = np .squeeze (phase_tmp )
390
- plt . subplot ( 224 , label = figlabel ); plt .loglog (omega , mag );
414
+ plot_axes [ 's' ] .loglog (omega , mag );
391
415
392
416
#
393
417
# Utility functions
0 commit comments