datastock 0.0.35__py3-none-any.whl → 0.0.37__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,58 +3,62 @@
3
3
 
4
4
  # Common
5
5
  import numpy as np
6
- import matplotlib.pyplot as plt
7
- from matplotlib import gridspec
8
6
  import matplotlib.colors as mcolors
9
7
 
10
8
 
11
9
  # library-specific
12
10
  from . import _generic_check
13
- from . import _plot_text
14
11
  from . import _class1_compute
12
+ from . import _generic_utils_plot as _uplot
13
+ from . import _plot_as_array_1d
14
+ from . import _plot_as_array_234d
15
15
 
16
16
 
17
17
  __all__ = ['plot_as_array']
18
18
 
19
19
 
20
- __github = 'https://github.com/ToFuProject/datacollection/issues'
21
- _WINTIT = f'report issues at {__github}'
20
+ # ###############################################################
21
+ # ###############################################################
22
+ # DEFAULTS
23
+ # ###############################################################
22
24
 
23
25
 
24
26
  _CONNECT = True
25
- _BCKCOLOR = 'w'
26
-
27
- _LCOLOR_DICT = [
27
+ _LCOLOR = [
28
28
  [
29
- 'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple',
30
- 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan',
29
+ 'tab:blue', 'tab:orange', 'tab:green',
30
+ 'tab:red', 'tab:purple', 'tab:brown',
31
+ 'tab:pink', 'tab:gray', 'tab:olive',
32
+ 'tab:cyan',
31
33
  ],
32
34
  ['r', 'g', 'b'],
33
35
  ['m', 'y', 'c'],
34
36
  ]
35
37
 
36
38
 
37
- # #############################################################################
38
- # #############################################################################
39
+ # ###############################################################
40
+ # ###############################################################
39
41
  # generic entry point
40
- # #############################################################################
42
+ # ###############################################################
41
43
 
42
44
 
43
45
  def plot_as_array(
44
- # parameters
46
+ # resource
45
47
  coll=None,
48
+ # data
46
49
  key=None,
47
50
  keyX=None,
48
51
  keyY=None,
49
52
  keyZ=None,
50
53
  keyU=None,
54
+ # index
51
55
  ind=None,
52
- vmin=None,
53
- vmax=None,
56
+ # scales
57
+ dvminmax=None,
58
+ dscale=None,
54
59
  cmap=None,
55
- ymin=None,
56
- ymax=None,
57
60
  aspect=None,
61
+ # interactivity
58
62
  nmax=None,
59
63
  uniform=None,
60
64
  color_dict=None,
@@ -70,233 +74,116 @@ def plot_as_array(
70
74
  dax=None,
71
75
  dmargin=None,
72
76
  fs=None,
77
+ wintit=None,
78
+ tit=None,
73
79
  dcolorbar=None,
74
80
  dleg=None,
75
81
  label=None,
76
82
  connect=None,
77
83
  inplace=None,
84
+ # unused
85
+ **kwdargs,
78
86
  ):
79
87
 
80
-
81
- # ------------
88
+ # --------------
82
89
  # check inputs
90
+ # --------------
83
91
 
84
92
  # check key, inplace flag and extract sub-collection
85
- key, inplace, coll2 = _generic_check._check_inplace(
86
- coll=coll,
87
- keys=None if key is None else [key],
93
+ lk = [kk for kk in [keyX, keyY, keyZ, keyU] if kk is not None]
94
+ coll2, key = coll.extract(
95
+ [key] + lk,
96
+ inc_monot=False,
97
+ inc_vectors=False,
98
+ inc_allrefs=False,
99
+ return_keys=True,
88
100
  inplace=inplace,
89
101
  )
90
- key = key[0]
91
- ndim = coll2._ddata[key]['data'].ndim
102
+ key = [kk for kk in key if kk not in lk][0]
103
+ ndim = coll2.ddata[key]['data'].ndim
92
104
 
93
105
  # --------------
94
106
  # check input
107
+ # --------------
95
108
 
96
109
  (
97
- key,
98
- keyX, refX, islogX,
99
- keyY, refY, islogY,
100
- keyZ, refZ, islogZ,
101
- keyU, refU, islogU,
110
+ key, lab,
111
+ dkeys,
102
112
  sameref, ind,
103
- cmap, vmin, vmax,
104
- ymin, ymax,
105
- aspect, nmax,
113
+ dscale, dvminmax,
114
+ cmap, aspect, nmax,
106
115
  color_dict,
107
116
  rotation,
108
117
  inverty,
109
118
  bck,
110
119
  interp,
120
+ wintit, tit,
111
121
  dcolorbar, dleg, label, connect,
112
- ) = _plot_as_array_check(
113
- ndim=ndim,
114
- coll=coll2,
115
- key=key,
116
- keyX=keyX,
117
- keyY=keyY,
118
- keyZ=keyZ,
119
- keyU=keyU,
120
- ind=ind,
121
- cmap=cmap,
122
- vmin=vmin,
123
- vmax=vmax,
124
- ymin=ymin,
125
- ymax=ymax,
126
- aspect=aspect,
127
- nmax=nmax,
128
- uniform=uniform,
129
- color_dict=color_dict,
130
- rotation=rotation,
131
- inverty=inverty,
132
- bck=bck,
133
- interp=interp,
134
- # figure
135
- dcolorbar=dcolorbar,
136
- dleg=dleg,
137
- label=label,
138
- connect=connect,
139
- )
122
+ ) = _check(**locals())
140
123
 
141
124
  # --------------------------------
142
125
  # Particular case: same references
126
+ # --------------------------------
143
127
 
144
128
  if sameref:
145
129
  from ._class import DataStock
146
130
  cc = DataStock()
147
- lr = [('refX', refX), ('refY', refY), ('refZ', refZ), ('refU', refU)]
148
- lr = [tt for tt in lr if tt[1] is not None]
149
- for ii, (ss, rr) in enumerate(lr):
150
- cc.add_ref(key=f'{rr}-{ii}', size=coll.dref[rr]['size'])
151
- ref = tuple([f'{rr}-{ii}' for ii, (ss, rr) in enumerate(lr)])
131
+ lk = ['keyX', 'keyY', 'keyZ', 'keyU']
132
+ lk = [k0 for k0 in lk if dkeys[k0]['ref'] is not None]
133
+ for ii, k0 in enumerate(lk):
134
+ cc.add_ref(
135
+ key=f"{dkeys[k0]['ref']}_{ii}",
136
+ size=coll.dref[dkeys[k0]['ref']]['size'],
137
+ )
138
+ ref = tuple([f"{dkeys[k0]['ref']}_{ii}" for ii, k0 in enumerate(lk)])
152
139
  cc.add_data(key=key, data=coll2.ddata[key]['data'], ref=ref)
153
140
  return cc.plot_as_array()
154
141
 
155
142
  # -------------------------
156
143
  # call appropriate routine
144
+ # -------------------------
157
145
 
158
146
  if ndim == 1:
159
- coll2, dax, dgroup = plot_as_array_1d(
160
- # parameters
161
- coll=coll2,
162
- key=key,
163
- keyX=keyX,
164
- refX=refX,
165
- islogX=islogX,
166
- ind=ind,
167
- vmin=vmin,
168
- vmax=vmax,
169
- cmap=cmap,
170
- ymin=ymin,
171
- ymax=ymax,
172
- aspect=aspect,
173
- nmax=nmax,
174
- color_dict=color_dict,
175
- lkeys=lkeys,
176
- bstr_dict=bstr_dict,
177
- rotation=rotation,
178
- # figure-specific
179
- dax=dax,
180
- dmargin=dmargin,
181
- fs=fs,
182
- dcolorbar=dcolorbar,
183
- dleg=dleg,
184
- )
147
+ func = _plot_as_array_1d.main
185
148
 
186
- elif ndim == 2:
187
- coll2, dax, dgroup = plot_as_array_2d(
188
- # parameters
189
- coll=coll2,
190
- key=key,
191
- keyX=keyX,
192
- keyY=keyY,
193
- refX=refX,
194
- refY=refY,
195
- islogX=islogX,
196
- islogY=islogY,
197
- ind=ind,
198
- vmin=vmin,
199
- vmax=vmax,
200
- cmap=cmap,
201
- ymin=ymin,
202
- ymax=ymax,
203
- aspect=aspect,
204
- nmax=nmax,
205
- color_dict=color_dict,
206
- lkeys=lkeys,
207
- bstr_dict=bstr_dict,
208
- rotation=rotation,
209
- inverty=inverty,
210
- interp=interp,
211
- # figure-specific
212
- dax=dax,
213
- dmargin=dmargin,
214
- fs=fs,
215
- dcolorbar=dcolorbar,
216
- dleg=dleg,
217
- )
149
+ elif ndim >= 2:
150
+ func = _plot_as_array_234d.main
218
151
 
219
- elif ndim == 3:
220
- coll2, dax, dgroup = plot_as_array_3d(
221
- # parameters
222
- coll=coll2,
223
- key=key,
224
- keyX=keyX,
225
- keyY=keyY,
226
- keyZ=keyZ,
227
- refX=refX,
228
- refY=refY,
229
- refZ=refZ,
230
- islogX=islogX,
231
- islogY=islogY,
232
- islogZ=islogZ,
233
- ind=ind,
234
- vmin=vmin,
235
- vmax=vmax,
236
- cmap=cmap,
237
- ymin=ymin,
238
- ymax=ymax,
239
- aspect=aspect,
240
- nmax=nmax,
241
- color_dict=color_dict,
242
- lkeys=lkeys,
243
- bstr_dict=bstr_dict,
244
- rotation=rotation,
245
- inverty=inverty,
246
- bck=bck,
247
- interp=interp,
248
- # figure-specific
249
- dax=dax,
250
- dmargin=dmargin,
251
- fs=fs,
252
- dcolorbar=dcolorbar,
253
- dleg=dleg,
254
- label=label,
255
- )
152
+ # -------------------------
153
+ # call appropriate function
154
+ # -------------------------
256
155
 
257
- elif ndim == 4:
258
- coll2, dax, dgroup = plot_as_array_4d(
259
- # parameters
260
- coll=coll2,
261
- key=key,
262
- keyX=keyX,
263
- keyY=keyY,
264
- keyZ=keyZ,
265
- keyU=keyU,
266
- refX=refX,
267
- refY=refY,
268
- refZ=refZ,
269
- refU=refU,
270
- islogX=islogX,
271
- islogY=islogY,
272
- islogZ=islogZ,
273
- islogU=islogU,
274
- ind=ind,
275
- vmin=vmin,
276
- vmax=vmax,
277
- cmap=cmap,
278
- ymin=ymin,
279
- ymax=ymax,
280
- aspect=aspect,
281
- nmax=nmax,
282
- color_dict=color_dict,
283
- lkeys=lkeys,
284
- bstr_dict=bstr_dict,
285
- rotation=rotation,
286
- inverty=inverty,
287
- bck=bck,
288
- interp=interp,
289
- # figure-specific
290
- dax=dax,
291
- dmargin=dmargin,
292
- fs=fs,
293
- dcolorbar=dcolorbar,
294
- dleg=dleg,
295
- label=label,
296
- )
156
+ coll2, dax, dgroup = func(
157
+ # parameters
158
+ coll=coll2,
159
+ key=key,
160
+ lab=lab,
161
+ dkeys=dkeys,
162
+ ind=ind,
163
+ dvminmax=dvminmax,
164
+ dscale=dscale,
165
+ cmap=cmap,
166
+ aspect=aspect,
167
+ nmax=nmax,
168
+ color_dict=color_dict,
169
+ lkeys=lkeys,
170
+ bstr_dict=bstr_dict,
171
+ rotation=rotation,
172
+ inverty=inverty,
173
+ bck=bck,
174
+ interp=interp,
175
+ # figure-specific
176
+ dax=dax,
177
+ dmargin=dmargin,
178
+ fs=fs,
179
+ dcolorbar=dcolorbar,
180
+ dleg=dleg,
181
+ label=label,
182
+ )
297
183
 
298
- # --------------------------
299
- # add axes and interactivity
184
+ # ----------------------------
185
+ # add axes for interactivity
186
+ # ----------------------------
300
187
 
301
188
  # add axes
302
189
  for ii, kax in enumerate(dax.keys()):
@@ -319,7 +206,10 @@ def plot_as_array(
319
206
  )
320
207
  raise Exception(msg)
321
208
 
322
- # connect
209
+ # ----------------------
210
+ # connect interactivity
211
+ # ----------------------
212
+
323
213
  if connect is True:
324
214
  coll2.setup_interactivity(kinter='inter0', dgroup=dgroup, dinc=dinc)
325
215
  coll2.disconnect_old()
@@ -331,10 +221,10 @@ def plot_as_array(
331
221
  return coll2, dgroup
332
222
 
333
223
 
334
- # #############################################################################
335
- # #############################################################################
224
+ # ##############################################################
225
+ # ##############################################################
336
226
  # check
337
- # #############################################################################
227
+ # ##############################################################
338
228
 
339
229
 
340
230
  def _check_uniform_lin(k0=None, ddata=None):
@@ -381,6 +271,7 @@ def _check_keyXYZ(
381
271
  ndim=None,
382
272
  dim_min=None,
383
273
  uniform=None,
274
+ monot=None,
384
275
  already=None,
385
276
  ):
386
277
  """ Ensure keyX refers to a monotonic and (optionally) uniform data
@@ -388,7 +279,7 @@ def _check_keyXYZ(
388
279
  """
389
280
 
390
281
  if uniform is None:
391
- uniform = True
282
+ uniform = False
392
283
 
393
284
  refX = None
394
285
  islog = False
@@ -399,12 +290,16 @@ def _check_keyXYZ(
399
290
  k0 for k0, v0 in coll._ddata.items()
400
291
  if len(v0['ref']) == 1
401
292
  and v0['ref'][0] in refs
402
- and (
403
- v0['data'].dtype.type == np.str_
404
- or v0['monot'] == (True,)
405
- )
406
293
  ]
407
294
 
295
+ # optional monotonicity
296
+ if monot:
297
+ lok = [
298
+ k0 for k0 in lok
299
+ if coll.ddata[k0]['data'].dtype.type == np.str_
300
+ or coll.ddata[k0]['monot'] == (True,)
301
+ ]
302
+
408
303
  # optional uniformity
409
304
  if uniform:
410
305
  lok = [
@@ -420,9 +315,19 @@ def _check_keyXYZ(
420
315
  )
421
316
  except Exception as err:
422
317
  msg = (
423
- err.args[0]
424
- + f"\nContraint on uniformity: {uniform}"
318
+ f"plot_as_array() requires '{keyXstr}' to be:\n"
319
+ f"\t- 1d: {coll.ddata[keyX]['data'].ndim == 1}\n"
320
+ f"\t- refs: {coll.ddata[keyX]['ref']} vs {refs}\n"
425
321
  )
322
+ if monot is True:
323
+ msg += f"\t- monot: {coll.ddata[keyX]['monot']}\n"
324
+ if uniform is True and coll.ddata[keyX]['data'].ndim == 1:
325
+ islin = _check_uniform_lin(k0=keyX, ddata=coll._ddata)
326
+ islog = _check_uniform_log(k0=keyX, ddata=coll._ddata)
327
+ msg += f"\t- uniform linear: {islin}\n"
328
+ msg += f"\t- uniform log: {islog}\n"
329
+ msg += f"Allowed values: {lok}\nProvided: '{keyX}'\n"
330
+ msg += f"Value:\n{coll.ddata[keyX]['data']}\n"
426
331
  err.args = (msg,)
427
332
  raise err
428
333
 
@@ -437,7 +342,7 @@ def _check_keyXYZ(
437
342
  elif keyX == 'index':
438
343
  if already is None:
439
344
  refX = refs[dim_min - 1]
440
- elif all([kk in already for kk in refs]): # TBC
345
+ elif all([kk in already for kk in refs]): # TBC
441
346
  # sameref
442
347
  refX = refs[dim_min - 1]
443
348
  msg = (
@@ -460,7 +365,7 @@ def _check_keyXYZ(
460
365
  keyX = 'index'
461
366
  if already is None:
462
367
  refX = refs[dim_min - 1]
463
- elif all([kk in already for kk in refs]): # TBC
368
+ elif all([kk in already for kk in refs]): # TBC
464
369
  # sameref
465
370
  refX = refs[dim_min - 1]
466
371
  msg = (
@@ -472,27 +377,43 @@ def _check_keyXYZ(
472
377
  raise Exception(msg)
473
378
  else:
474
379
  refX = [kk for kk in refs if kk not in already][0]
380
+
381
+ # safety check
382
+ if refX is None or keyX is None:
383
+ msg = (
384
+ "Something wrong with ref or key\n"
385
+ f"\t- refX: {refX}\n"
386
+ f"\t- keyX: {keyX}\n"
387
+ f"\t- refs: {refs}\n"
388
+ f"\t- already: {already}\n"
389
+ f"\t- ndim: {ndim}\n"
390
+ f"\t- dim_min: {dim_min}\n"
391
+ f"\t- keyXstr: {keyXstr}\n"
392
+ )
393
+ raise Exception(msg)
394
+
475
395
  else:
476
396
  keyX, refX, islog = None, None, None
477
397
 
478
398
  return keyX, refX, islog
479
399
 
480
400
 
481
- def _plot_as_array_check(
401
+ def _check(
482
402
  ndim=None,
483
403
  coll=None,
404
+ coll2=None,
484
405
  key=None,
485
406
  keyX=None,
486
407
  keyY=None,
487
408
  keyZ=None,
488
409
  keyU=None,
489
410
  ind=None,
411
+ # scales
412
+ dvminmax=None,
413
+ dscale=None,
490
414
  cmap=None,
491
- vmin=None,
492
- vmax=None,
493
- ymin=None,
494
- ymax=None,
495
415
  aspect=None,
416
+ # interactivity
496
417
  nmax=None,
497
418
  uniform=None,
498
419
  color_dict=None,
@@ -501,16 +422,20 @@ def _plot_as_array_check(
501
422
  bck=None,
502
423
  interp=None,
503
424
  # figure
425
+ wintit=None,
426
+ tit=None,
504
427
  dcolorbar=None,
505
428
  dleg=None,
506
429
  data=None,
507
430
  label=None,
508
431
  connect=None,
432
+ # unused
433
+ **kwdargs,
509
434
  ):
510
435
 
511
-
512
436
  # --------
513
437
  # groups
438
+ # --------
514
439
 
515
440
  if ndim == 1:
516
441
  groups = ['X']
@@ -524,19 +449,20 @@ def _plot_as_array_check(
524
449
  msg = "ndim must be in [1, 2, 3]"
525
450
  raise Exception(msg)
526
451
 
452
+ lk = [
453
+ (key, 'data'),
454
+ ('keyX', 'X'), ('keyY', 'Y'), ('keyZ', 'Z'), ('keyU', 'U'),
455
+ ]
456
+ lk = [kk for ii, kk in enumerate(lk) if ii <= ndim]
457
+
527
458
  # ----------------------
528
459
  # keyX, keyY, keyZ, keyU
460
+ # ----------------------
529
461
 
530
462
  refs = coll._ddata[key]['ref']
531
-
532
- (
533
- keyX, refX, islogX,
534
- keyY, refY, islogY,
535
- keyZ, refZ, islogZ,
536
- keyU, refU, islogU,
537
- sameref,
538
- ) = get_keyrefs(
539
- coll=coll,
463
+ dkeys, sameref = get_keyrefs(
464
+ coll2=coll2,
465
+ key=key,
540
466
  refs=refs,
541
467
  keyX=keyX,
542
468
  keyY=keyY,
@@ -546,8 +472,56 @@ def _plot_as_array_check(
546
472
  uniform=uniform,
547
473
  )
548
474
 
549
- # -----
475
+ # ------------------
476
+ # dscale
477
+ # ------------------
478
+
479
+ # safety check
480
+ c0 = (
481
+ isinstance(dscale, dict)
482
+ and all([
483
+ k0 in ['data'] + [kk[0] for kk in lk]
484
+ and (isinstance(v0, str) and v0 in ['linear', 'log'])
485
+ for k0, v0 in dscale.items()])
486
+ )
487
+ if dscale is not None and not c0:
488
+ msg = (
489
+ "Arg dscale must be a dict of the form:\n"
490
+ "\t- 'data': 'log' or 'linear'\n"
491
+ "\t- 'keyX': 'log' or 'linear'\n"
492
+ "\t- ...etc\n"
493
+ f"Provided:\n{dscale}"
494
+ )
495
+ raise Exception(msg)
496
+
497
+ # set default if any missing
498
+ dscale2 = {}
499
+ for ii, (k0, k1) in enumerate(lk):
500
+ kk = 'data' if k1 == 'data' else k0
501
+ if dscale is None or dscale.get(kk) is None:
502
+ if k1 == 'data':
503
+ dscale2[k1] = 'linear'
504
+ else:
505
+ dscale2[k1] = 'log' if dkeys[k1]['islog'] else 'linear'
506
+ else:
507
+ dscale2[k1] = dscale[kk]
508
+ dscale = dscale2
509
+
510
+ # -------------------
511
+ # add data and labels
512
+ # -------------------
513
+
514
+ dkeys, key, lab = get_data_str(
515
+ dk=dkeys,
516
+ coll2=coll2,
517
+ key=key,
518
+ ndim=ndim,
519
+ dscale=dscale,
520
+ )
521
+
522
+ # -------------
550
523
  # ind
524
+ # -------------
551
525
 
552
526
  ind = _generic_check._check_var(
553
527
  ind, 'ind',
@@ -568,53 +542,81 @@ def _plot_as_array_check(
568
542
  )
569
543
  raise Exception(msg)
570
544
 
571
- # ----
572
- # cmap
545
+ # ---------------
546
+ # dvminmax & cmap
547
+ # ---------------
573
548
 
574
- if cmap is None or vmin is None or vmax is None:
575
- if isinstance(coll.ddata[key]['data'], np.ndarray):
576
- nanmax = np.nanmax(coll.ddata[key]['data'])
577
- nanmin = np.nanmin(coll.ddata[key]['data'])
578
- else:
579
- nanmax = coll.ddata[key]['data'].max()
580
- nanmin = coll.ddata[key]['data'].min()
549
+ # safety check
550
+ c0 = (
551
+ isinstance(dvminmax, dict)
552
+ and all([
553
+ k0 in ['data'] + [kk[0] for kk in lk]
554
+ and isinstance(v0, dict)
555
+ and all([k1 in ['min', 'max'] for k1 in v0.keys()])
556
+ for k0, v0 in dvminmax.items()
557
+ ])
558
+ )
559
+ if dvminmax is not None and not c0:
560
+ msg = (
561
+ "Arg dvminmax must be a dict of the form:\n"
562
+ "\t- 'data': {'min': float, 'max': float}\n"
563
+ "\t- 'keyX': {'min': float, 'max': float}\n"
564
+ "\t- ...etc\n"
565
+ "Provided:\n{dvminmax}"
566
+ )
567
+ raise Exception(msg)
581
568
 
582
- # diverging
569
+ dvminmax2 = {}
570
+ for ii, (k0, k1) in enumerate(lk):
571
+
572
+ kk = 'data' if k1 == 'data' else k0
573
+ dvminmax2[k1] = {'min': None, 'max': None}
574
+
575
+ # data
576
+ kdata = key if ii == 0 else dkeys[k1]['data']
577
+ iok = np.isfinite(coll2.ddata[kdata]['data'])
578
+ nanmin = np.min(coll2.ddata[kdata]['data'][iok])
579
+ nanmax = np.max(coll2.ddata[kdata]['data'][iok])
583
580
  delta = nanmax - nanmin
584
- diverging = (
585
- nanmin * nanmax < 0
586
- and min(abs(nanmin), abs(nanmax)) > 0.1*delta
587
- )
588
581
 
589
- if cmap is None:
590
- if diverging:
591
- cmap = 'seismic'
582
+ # diverging
583
+ if k1 == 'data':
584
+ diverging = (
585
+ nanmin * nanmax < 0
586
+ and min(abs(nanmin), abs(nanmax)) > 0.1*delta
587
+ )
588
+
589
+ if diverging and ndim >= 2:
590
+ vv = max(abs(nanmin), abs(nanmax))
591
+ nanmin = -vv
592
+ nanmax = vv
593
+
594
+ # margin on min max
595
+ if k1 in ['X', 'Y']:
596
+ margin = dkeys[k1]['d2']
592
597
  else:
593
- cmap = 'viridis'
598
+ margin = 0.02*delta
594
599
 
595
- # -----------
596
- # vmin, vmax
600
+ # vmin, vmax
601
+ if dvminmax is None or dvminmax.get(kk, {}).get('min') is None:
602
+ dvminmax2[k1]['min'] = nanmin - margin
603
+ else:
604
+ dvminmax2[k1]['min'] = dvminmax[kk]['min']
597
605
 
598
- if vmin is None:
599
- if diverging:
600
- if isinstance(nanmin, np.bool_):
601
- vmin = 0
602
- else:
603
- vmin = -max(abs(nanmin), nanmax)
606
+
607
+ if dvminmax is None or dvminmax.get(kk, {}).get('max') is None:
608
+ dvminmax2[k1]['max'] = nanmax + margin
604
609
  else:
605
- vmin = nanmin
610
+ dvminmax2[k1]['max'] = dvminmax[kk]['max']
606
611
 
607
- if vmax is None:
612
+ dvminmax = dvminmax2
613
+
614
+ # cmap
615
+ if cmap is None:
608
616
  if diverging:
609
- vmax = max(abs(nanmin), nanmax)
617
+ cmap = 'seismic'
610
618
  else:
611
- vmax = nanmax
612
-
613
- # ymin, ymax
614
- if ymin is None:
615
- ymin = vmin
616
- if ymax is None:
617
- ymax = vmax
619
+ cmap = 'viridis'
618
620
 
619
621
  # -------
620
622
  # aspect
@@ -644,9 +646,8 @@ def _plot_as_array_check(
644
646
  elif mcolors.is_color_like(color_dict):
645
647
  color_dict = {k0: [color_dict]*nmax for k0 in groups}
646
648
 
647
-
648
649
  cdef = {
649
- k0: _LCOLOR_DICT[0] for ii, k0 in enumerate(groups)
650
+ k0: _LCOLOR[0] for ii, k0 in enumerate(groups)
650
651
  }
651
652
  color_dict = _generic_check._check_var(
652
653
  color_dict, 'color_dict',
@@ -689,7 +690,7 @@ def _plot_as_array_check(
689
690
  )
690
691
 
691
692
  # bck
692
- if coll.ddata[key]['data'].size > 10000:
693
+ if coll2.ddata[key]['data'].size > 10000:
693
694
  bckdef = 'envelop'
694
695
  else:
695
696
  bckdef = 'lines'
@@ -707,6 +708,24 @@ def _plot_as_array_check(
707
708
  allowed=['nearest', 'bilinear', 'bicubic']
708
709
  )
709
710
 
711
+ # --------------------
712
+ # figure-specific
713
+ # -------------------
714
+
715
+ # wintit
716
+ if wintit is not None:
717
+ wintit = _generic_check._check_var(
718
+ wintit, 'wintit',
719
+ types=str,
720
+ )
721
+
722
+ # tit
723
+ tit = _generic_check._check_var(
724
+ tit, 'tit',
725
+ default=key,
726
+ types=str,
727
+ )
728
+
710
729
  # dcolorbar
711
730
  defdcolorbar = {
712
731
  # 'location': 'right',
@@ -746,27 +765,25 @@ def _plot_as_array_check(
746
765
  )
747
766
 
748
767
  return (
749
- key,
750
- keyX, refX, islogX,
751
- keyY, refY, islogY,
752
- keyZ, refZ, islogZ,
753
- keyU, refU, islogU,
768
+ key, lab,
769
+ dkeys,
754
770
  sameref, ind,
755
- cmap, vmin, vmax,
756
- ymin, ymax,
757
- aspect, nmax,
771
+ dscale, dvminmax,
772
+ cmap, aspect, nmax,
758
773
  color_dict,
759
774
  rotation,
760
775
  inverty,
761
776
  bck,
762
777
  interp,
778
+ wintit, tit,
763
779
  dcolorbar, dleg, label, connect,
764
780
  )
765
781
 
766
782
 
767
783
  def get_keyrefs(
768
- coll=None,
784
+ coll2=None,
769
785
  refs=None,
786
+ key=None,
770
787
  keyX=None,
771
788
  keyY=None,
772
789
  keyZ=None,
@@ -776,13 +793,14 @@ def get_keyrefs(
776
793
  ):
777
794
 
778
795
  # -----------
779
- # find order
796
+ # initialize
797
+ # -----------
780
798
 
781
799
  dk = {
782
- 'keyX': {'key': keyX, 'ref': None, 'islog': None, 'dim_min': 1},
783
- 'keyY': {'key': keyY, 'ref': None, 'islog': None, 'dim_min': 2},
784
- 'keyZ': {'key': keyZ, 'ref': None, 'islog': None, 'dim_min': 3},
785
- 'keyU': {'key': keyU, 'ref': None, 'islog': None, 'dim_min': 4},
800
+ 'X': {'key': keyX, 'ref': None, 'islog': None, 'dim_min': 1},
801
+ 'Y': {'key': keyY, 'ref': None, 'islog': None, 'dim_min': 2},
802
+ 'Z': {'key': keyZ, 'ref': None, 'islog': None, 'dim_min': 3},
803
+ 'U': {'key': keyU, 'ref': None, 'islog': None, 'dim_min': 4},
786
804
  }
787
805
 
788
806
  lk_in = sorted([k0 for k0, v0 in dk.items() if v0['key'] is not None])
@@ -791,18 +809,27 @@ def get_keyrefs(
791
809
 
792
810
  # -----------
793
811
  # find order
812
+ # -----------
794
813
 
795
814
  already = []
796
815
  for k0 in lk_in + lk_out:
797
816
 
817
+ if ndim >= 2 and k0 in ['X', 'Y']:
818
+ uniformi = True
819
+ monoti = True
820
+ else:
821
+ uniformi = uniform
822
+ monoti = False
823
+
798
824
  dk[k0]['key'], dk[k0]['ref'], dk[k0]['islog'] = _check_keyXYZ(
799
- coll=coll,
825
+ coll=coll2,
800
826
  refs=refs,
801
827
  keyX=dk[k0]['key'],
802
- keyXstr=k0,
828
+ keyXstr=f"key{k0}",
803
829
  ndim=ndim,
804
830
  dim_min=dk[k0]['dim_min'],
805
- uniform=uniform,
831
+ uniform=uniformi,
832
+ monot=monoti,
806
833
  already=already,
807
834
  )
808
835
 
@@ -812,2253 +839,71 @@ def get_keyrefs(
812
839
  lk_done = [v0['ref'] for k0, v0 in dk.items() if v0['key'] is not None]
813
840
  sameref = len(set(lk_done)) < ndim
814
841
 
815
- return (
816
- dk['keyX']['key'], dk['keyX']['ref'], dk['keyX']['islog'],
817
- dk['keyY']['key'], dk['keyY']['ref'], dk['keyY']['islog'],
818
- dk['keyZ']['key'], dk['keyZ']['ref'], dk['keyZ']['islog'],
819
- dk['keyU']['key'], dk['keyU']['ref'], dk['keyU']['islog'],
820
- sameref,
821
- )
822
-
823
-
824
- def _get_str_datadlab(keyX=None, nx=None, islogX=None, coll=None):
825
-
826
- keyX2 = keyX
827
- xstr = keyX != 'index' and coll.ddata[keyX]['data'].dtype.type == np.str_
828
- if keyX == 'index':
829
- dataX = np.arange(0, nx)
830
- labX = keyX
831
- dX2 = 0.5
832
- elif xstr:
833
- dataX = np.arange(0, nx)
834
- labX = ''
835
- dX2 = 0.5
836
- else:
837
- if islogX is True:
838
- keyX2 = f"{keyX}-log10"
839
- coll.add_data(
840
- key=keyX2,
841
- data=np.log10(coll.ddata[keyX]['data']),
842
- ref=coll.ddata[keyX]['ref'],
843
- )
844
- labX = r"$\log_{10}$" + f"({keyX} ({coll._ddata[keyX]['units']}))"
845
- dataX = coll.ddata[keyX2]['data']
846
- else:
847
- labX = f"{keyX} ({coll._ddata[keyX]['units']})"
848
- dataX = coll.ddata[keyX]['data']
849
- dX2 = np.nanmean(np.diff(dataX)) / 2.
850
-
851
- return keyX2, xstr, dataX, dX2, labX
852
-
853
-
854
- # #############################################################################
855
- # #############################################################################
856
- # plot_as_array: 1d
857
- # #############################################################################
858
-
859
-
860
- def plot_as_array_1d(
861
- # parameters
862
- coll=None,
863
- key=None,
864
- keyX=None,
865
- refX=None,
866
- islogX=None,
867
- ind=None,
868
- vmin=None,
869
- vmax=None,
870
- cmap=None,
871
- ymin=None,
872
- ymax=None,
873
- aspect=None,
874
- nmax=None,
875
- color_dict=None,
876
- lkeys=None,
877
- bstr_dict=None,
878
- rotation=None,
879
- # figure-specific
880
- dax=None,
881
- dmargin=None,
882
- fs=None,
883
- dcolorbar=None,
884
- dleg=None,
885
- ):
886
-
887
- # --------------
888
- # Prepare data
889
-
890
- data = coll.ddata[key]['data']
891
- if hasattr(data, 'nnz'):
892
- data = data.toarray()
893
- assert data.ndim == len(coll.ddata[key]['ref']) == 1
894
- n0, = data.shape
842
+ return dk, sameref
895
843
 
896
- keyX, xstr, dataX, dX2, labX = _get_str_datadlab(
897
- keyX=keyX, nx=n0, islogX=islogX, coll=coll,
898
- )
899
- ref = coll._ddata[key]['ref'][0]
900
- units = coll._ddata[key]['units']
901
- lab0 = f'ind ({ref})'
902
- lab1 = f'{key} ({units})'
903
-
904
- # --------------
905
- # plot - prepare
906
844
 
907
- if dax is None:
845
+ def get_data_str(dk=None, coll2=None, key=None, ndim=None, dscale=None):
908
846
 
909
- if fs is None:
910
- fs = (12, 8)
847
+ # ---------------------------
848
+ # add info about axis & slicing
849
+ # ---------------------------
911
850
 
912
- if dmargin is None:
913
- dmargin = {
914
- 'left': 0.05, 'right': 0.95,
915
- 'bottom': 0.10, 'top': 0.90,
916
- 'hspace': 0.15, 'wspace': 0.2,
917
- }
851
+ lorder = ['X', 'Y', 'Z', 'U']
852
+ refs = coll2.ddata[key]['ref']
853
+ for k0, v0 in dk.items():
918
854
 
919
- fig = plt.figure(figsize=fs)
920
- gs = gridspec.GridSpec(ncols=4, nrows=1, **dmargin)
921
-
922
- ax0 = fig.add_subplot(gs[0, :3], aspect='auto')
923
- ax0.set_ylabel(lab1)
924
- ax0.set_title(key, size=14, fontweight='bold')
925
- if xstr:
926
- ax0.set_xticks(dataX)
927
- ax0.set_xticklabels(
928
- coll.ddata[keyX]['data'],
929
- rotation=rotation,
930
- )
931
- else:
932
- ax0.set_xlabel(lab0)
855
+ if v0['key'] is None:
856
+ continue
933
857
 
934
- ax1 = fig.add_subplot(gs[0, 3], frameon=False)
935
- ax1.set_xticks([])
936
- ax1.set_yticks([])
858
+ # axis and size
859
+ dk[k0]['axis'] = refs.index(v0['ref'])
860
+ dk[k0]['nn'] = coll2.ddata[key]['data'].shape[dk[k0]['axis']]
937
861
 
938
- dax = {
939
- 'matrix': {'handle': ax0},
940
- 'text': {'handle': ax1},
941
- }
862
+ # slicing and labels
863
+ for k0, v0 in dk.items():
942
864
 
943
- dax = _generic_check._check_dax(dax=dax, main='matrix')
865
+ if v0['key'] is None:
866
+ continue
944
867
 
945
- # ---------------
946
- # plot fixed part
947
-
948
- axtype = 'matrix'
949
- lkax = [kk for kk, vv in dax.items() if axtype in vv['type']]
950
- for kax in lkax:
951
- ax = dax[kax]['handle']
952
-
953
- ax.plot(
954
- dataX,
955
- data,
956
- color='k',
957
- marker='.',
958
- ms=6,
868
+ laxis = [
869
+ dk[k1]['axis'] for k1 in lorder
870
+ if k1 != k0 and dk[k1]['key'] is not None
871
+ ]
872
+ dk[k0]['sli'] = _class1_compute._get_slice(
873
+ laxis=laxis,
874
+ ndim=ndim,
959
875
  )
960
876
 
961
- # plt.colorbar(im, ax=ax, **dcolorbar)
962
- if dleg is not False:
963
- ax.legend(**dleg)
964
-
965
- # ----------------
966
- # define and set dgroup
967
-
968
- dgroup = {
969
- 'X': {
970
- 'ref': [ref],
971
- 'data': ['index'],
972
- 'nmax': nmax,
973
- },
974
- }
975
-
976
- # ----------------
977
- # plot mobile part
978
-
979
- axtype = 'matrix'
980
- lkax = [kk for kk, vv in dax.items() if axtype in vv['type']]
981
- for kax in lkax:
982
- ax = dax[kax]['handle']
983
-
984
- # ind0, ind1
985
- for ii in range(nmax):
986
- lv = ax.axvline(ind[0], c=color_dict['X'][ii], lw=1., ls='-')
987
-
988
- # update coll
989
- kv = f'{key}_v{ii:02.0f}'
990
- coll.add_mobile(
991
- key=kv,
992
- handle=lv,
993
- refs=ref,
994
- data=keyX,
995
- dtype='xdata',
996
- axes=kax,
997
- ind=ii,
998
- )
999
-
1000
- dax[kax].update(refx=[ref], datax=[keyX])
1001
-
1002
- # ---------
1003
- # add text
1004
-
1005
- kax = 'text'
1006
- if dax.get(kax) is not None:
1007
- ax = dax[kax]['handle']
1008
-
1009
- _plot_text.plot_text(
1010
- coll=coll,
1011
- kax=kax,
1012
- key=key,
1013
- ax=ax,
1014
- ref=ref,
1015
- group='X',
1016
- ind=ind[0],
1017
- lkeys=lkeys,
1018
- nmax=nmax,
1019
- color_dict=color_dict,
1020
- bstr_dict=bstr_dict,
877
+ # labels
878
+ (
879
+ dk[k0]['data'],
880
+ dk[k0]['str'],
881
+ dk[k0]['d2'],
882
+ dk[k0]['lab'],
883
+ ) = _uplot._get_str_datadlab(
884
+ keyX=dk[k0]['key'],
885
+ nx=dk[k0]['nn'],
886
+ refX=dk[k0]['ref'],
887
+ islogX=dscale[k0] == 'log',
888
+ coll=coll2,
1021
889
  )
1022
890
 
1023
- return coll, dax, dgroup
1024
-
1025
-
1026
- # #############################################################################
1027
- # #############################################################################
1028
- # plot_as_array: 2d
1029
- # #############################################################################
1030
-
1031
-
1032
- def plot_as_array_2d(
1033
- # parameters
1034
- coll=None,
1035
- key=None,
1036
- keyX=None,
1037
- keyY=None,
1038
- keyZ=None,
1039
- refX=None,
1040
- refY=None,
1041
- refZ=None,
1042
- islogX=None,
1043
- islogY=None,
1044
- islogZ=None,
1045
- ind=None,
1046
- vmin=None,
1047
- vmax=None,
1048
- cmap=None,
1049
- ymin=None,
1050
- ymax=None,
1051
- aspect=None,
1052
- nmax=None,
1053
- color_dict=None,
1054
- lkeys=None,
1055
- bstr_dict=None,
1056
- rotation=None,
1057
- inverty=None,
1058
- interp=None,
1059
- # figure-specific
1060
- dax=None,
1061
- dmargin=None,
1062
- fs=None,
1063
- dcolorbar=None,
1064
- dleg=None,
1065
- interactive=None,
1066
- ):
1067
-
1068
- # --------------
1069
- # Prepare data
1070
-
1071
- data = coll.ddata[key]['data']
1072
- refs = coll.ddata[key]['ref']
1073
- if hasattr(data, 'nnz'):
1074
- data = data.toarray()
1075
- assert data.ndim == len(coll.ddata[key]['ref']) == 2
1076
- n0, n1 = data.shape
1077
-
1078
- # check if transpose is necessary
1079
- if refs.index(refX) == 0:
1080
- dataplot = data.T
1081
- nx, ny = n0, n1
1082
- axisX, axisY = 0, 1
891
+ # -----------
892
+ # check data
893
+
894
+ units = str(coll2.ddata[key]['units'])
895
+ if dscale['data'] == 'log':
896
+ key2 = f"{key}_log10"
897
+ coll2.add_data(
898
+ key=key2,
899
+ data=np.log10(coll2.ddata[key]['data']),
900
+ ref=coll2.ddata[key]['ref'],
901
+ units=units,
902
+ )
903
+ coll2.remove_data(key, propagate=False)
904
+ lab = r"$\log_{10}$" + f"({key} ({units}))"
905
+ key = key2
1083
906
  else:
1084
- dataplot = data
1085
- nx, ny = n1, n0
1086
- axisX, axisY = 1, 0
1087
-
1088
- # -----------------
1089
- # prepare slicing
1090
-
1091
- # here slice X => slice in dim Y and vice-versa
1092
- sliX = _class1_compute._get_slice(laxis=[1-axisX], ndim=2)
1093
- sliY = _class1_compute._get_slice(laxis=[1-axisY], ndim=2)
1094
-
1095
- # ----------------------
1096
- # labels and data
1097
-
1098
- keyX, xstr, dataX, dX2, labX = _get_str_datadlab(
1099
- keyX=keyX, nx=nx, islogX=islogX, coll=coll,
1100
- )
1101
- keyY, ystr, dataY, dY2, labY = _get_str_datadlab(
1102
- keyX=keyY, nx=ny, islogX=islogY, coll=coll,
1103
- )
1104
-
1105
- extent = (
1106
- dataX[0] - dX2, dataX[-1] + dX2,
1107
- dataY[0] - dY2, dataY[-1] + dY2,
1108
- )
1109
-
1110
- # --------------
1111
- # plot - prepare
1112
-
1113
- if dax is None:
1114
-
1115
- if fs is None:
1116
- fs = (14, 8)
1117
-
1118
- if dmargin is None:
1119
- dmargin = {
1120
- 'left': 0.05, 'right': 0.95,
1121
- 'bottom': 0.06, 'top': 0.90,
1122
- 'hspace': 0.2, 'wspace': 0.3,
1123
- }
1124
-
1125
- fig = plt.figure(figsize=fs)
1126
- fig.suptitle(key, size=14, fontweight='bold')
1127
- gs = gridspec.GridSpec(ncols=4, nrows=6, **dmargin)
1128
-
1129
- # axes for image
1130
- ax0 = fig.add_subplot(gs[:4, :2], aspect='auto')
1131
- ax0.tick_params(
1132
- axis="x",
1133
- bottom=False, top=True,
1134
- labelbottom=False, labeltop=True,
1135
- )
1136
- ax0.xaxis.set_label_position('top')
1137
-
1138
- # axes for vertical profile
1139
- ax1 = fig.add_subplot(gs[:4, 2], sharey=ax0)
1140
- ax1.set_xlabel('data')
1141
- ax1.set_ylabel(labY)
1142
- ax1.tick_params(
1143
- axis="y",
1144
- left=False, right=True,
1145
- labelleft=False, labelright=True,
1146
- )
1147
- ax1.tick_params(
1148
- axis="x",
1149
- bottom=False, top=True,
1150
- labelbottom=False, labeltop=True,
1151
- )
1152
- ax1.yaxis.set_label_position('right')
1153
- ax1.xaxis.set_label_position('top')
1154
-
1155
- # axes for horizontal profile
1156
- ax2 = fig.add_subplot(gs[4:, :2], sharex=ax0)
1157
- ax2.set_ylabel('data')
1158
- ax2.set_xlabel(labX)
1159
-
1160
- if np.isfinite(ymin):
1161
- ax1.set_xlim(left=ymin)
1162
- ax2.set_ylim(bottom=ymin)
1163
- if np.isfinite(ymax):
1164
- ax1.set_xlim(right=ymax)
1165
- ax2.set_ylim(top=ymax)
1166
-
1167
-
1168
- # axes for text
1169
- ax3 = fig.add_subplot(gs[:3, 3], frameon=False)
1170
- ax3.set_xticks([])
1171
- ax3.set_yticks([])
1172
- ax4 = fig.add_subplot(gs[3:, 3], frameon=False)
1173
- ax4.set_xticks([])
1174
- ax4.set_yticks([])
1175
-
1176
- if xstr:
1177
- ax0.set_xticks(dataX)
1178
- ax0.set_xticklabels(
1179
- coll.ddata[keyX]['data'],
1180
- rotation=rotation,
1181
- horizontalalignment='left',
1182
- verticalalignment='bottom',
1183
- )
1184
- ax2.set_xticks(dataX)
1185
- ax2.set_xticklabels(
1186
- coll.ddata[keyX]['data'],
1187
- rotation=rotation,
1188
- horizontalalignment='right',
1189
- verticalalignment='top',
1190
- )
1191
- else:
1192
- ax0.set_xlabel(labX)
1193
- ax2.set_xlabel(labX)
1194
-
1195
- if ystr:
1196
- ax0.set_yticks(dataY)
1197
- ax0.set_yticklabels(
1198
- coll.ddata[keyY]['data'],
1199
- rotation=rotation,
1200
- horizontalalignment='right',
1201
- verticalalignment='top',
1202
- )
1203
- ax1.set_yticks(dataY)
1204
- ax1.set_yticklabels(
1205
- coll.ddata[keyY]['data'],
1206
- rotation=rotation,
1207
- horizontalalignment='left',
1208
- verticalalignment='bottom',
1209
- )
1210
- else:
1211
- ax0.set_ylabel(labY)
1212
- ax1.set_ylabel(labY)
1213
-
1214
- dax = {
1215
- # data
1216
- 'matrix': {'handle': ax0, 'inverty': inverty},
1217
- 'vertical': {'handle': ax1, 'inverty': inverty},
1218
- 'horizontal': {'handle': ax2},
1219
- # text
1220
- 'text0': {'handle': ax3},
1221
- 'text1': {'handle': ax4},
1222
- }
1223
-
1224
- dax = _generic_check._check_dax(dax=dax, main='matrix')
1225
-
1226
- # ---------------
1227
- # plot fixed part
1228
-
1229
- axtype = 'matrix'
1230
- kax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1231
- if len(kax) == 1:
1232
- kax = kax[0]
1233
- ax = dax[kax]['handle']
1234
-
1235
- im = ax.imshow(
1236
- dataplot,
1237
- extent=extent,
1238
- interpolation=interp,
1239
- origin='lower',
1240
- aspect=aspect,
1241
- cmap=cmap,
1242
- vmin=vmin,
1243
- vmax=vmax,
1244
- )
1245
- if inverty is True:
1246
- ax.invert_yaxis()
1247
-
1248
- # ----------------
1249
- # define and set dgroup
1250
-
1251
- dgroup = {
1252
- 'X': {
1253
- 'ref': [refX],
1254
- 'data': ['index'],
1255
- 'nmax': nmax,
1256
- },
1257
- 'Y': {
1258
- 'ref': [refY],
1259
- 'data': ['index'],
1260
- 'nmax': nmax,
1261
- },
1262
- }
1263
-
1264
- # ----------------
1265
- # plot mobile part
1266
-
1267
- axtype = 'matrix'
1268
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1269
- if len(lax) == 1:
1270
- kax = lax[0]
1271
- ax = dax[kax]['handle']
1272
-
1273
- # ind0, ind1
1274
- axtype = 'vertical'
1275
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1276
- if len(lax) == 1:
1277
- for ii in range(nmax):
1278
- lh = ax.axhline(
1279
- dataY[ind[1]], c=color_dict['X'][ii], lw=1., ls='-',
1280
- )
907
+ lab = f"{key} ({units})"
1281
908
 
1282
- # update coll
1283
- kh = f'{key}_h{ii:02.0f}'
1284
- coll.add_mobile(
1285
- key=kh,
1286
- handle=lh,
1287
- refs=refY,
1288
- data=keyY,
1289
- dtype='ydata',
1290
- axes=kax,
1291
- ind=ii,
1292
- )
1293
-
1294
- # for ax clic
1295
- ax_refx = [refX]
1296
- ax_datax = [keyX]
1297
- else:
1298
- # for ax clic
1299
- ax_refx = None
1300
- ax_datax = None
1301
-
1302
- # ind0
1303
- axtype = 'horizontal'
1304
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1305
- if len(lax) == 1:
1306
- for ii in range(nmax):
1307
- lv = ax.axvline(
1308
- dataX[ind[0]], c=color_dict['Y'][ii], lw=1., ls='-',
1309
- )
1310
-
1311
- # update coll
1312
- kv = f'{key}_v{ii:02.0f}'
1313
- coll.add_mobile(
1314
- key=kv,
1315
- handle=lv,
1316
- refs=refX,
1317
- data=keyX,
1318
- dtype='xdata',
1319
- axes=kax,
1320
- ind=ii,
1321
- )
1322
-
1323
- # for ax clic
1324
- ax_refy = [refY]
1325
- ax_datay = [keyY]
1326
- else:
1327
- # for ax clic
1328
- ax_refy = None
1329
- ax_datay = None
1330
-
1331
- dax[kax].update(
1332
- refx=ax_refx,
1333
- datax=ax_datax,
1334
- refy=ax_refy,
1335
- datay=ax_datay,
1336
- )
1337
-
1338
- axtype = 'vertical'
1339
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1340
- if len(lax) == 1:
1341
- kax = lax[0]
1342
- ax = dax[kax]['handle']
1343
-
1344
- for ii in range(nmax):
1345
- l0, = ax.plot(
1346
- data[sliY(ind[0])],
1347
- dataY,
1348
- ls='-',
1349
- marker='.',
1350
- lw=1.,
1351
- color=color_dict['Y'][ii],
1352
- label=f'ind0 = {ind[0]}',
1353
- )
1354
-
1355
- km = f'{key}_vprof{ii:02.0f}'
1356
- coll.add_mobile(
1357
- key=km,
1358
- handle=l0,
1359
- refs=(refX,),
1360
- data=key,
1361
- dtype='xdata',
1362
- axes=kax,
1363
- ind=ii,
1364
- )
1365
-
1366
- l0 = ax.axhline(
1367
- dataY[ind[1]],
1368
- c=color_dict['X'][ii],
1369
- )
1370
- km = f'{key}_lh-v{ii:02.0f}'
1371
- coll.add_mobile(
1372
- key=km,
1373
- handle=l0,
1374
- refs=(refY,),
1375
- data=keyY,
1376
- dtype='ydata',
1377
- axes=kax,
1378
- ind=ii,
1379
- )
1380
-
1381
- dax[kax].update(refy=[refY], datay=[keyY])
1382
-
1383
- axtype = 'horizontal'
1384
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1385
- if len(lax) == 1:
1386
- kax = lax[0]
1387
- ax = dax[kax]['handle']
1388
-
1389
- for ii in range(nmax):
1390
- l1, = ax.plot(
1391
- dataX,
1392
- data[sliX(ind[1])],
1393
- ls='-',
1394
- marker='.',
1395
- lw=1.,
1396
- color=color_dict['X'][ii],
1397
- label=f'ind1 = {ind[1]}',
1398
- )
1399
-
1400
- km = f'{key}_hprof{ii:02.0f}'
1401
- coll.add_mobile(
1402
- key=km,
1403
- handle=l1,
1404
- refs=(refY,),
1405
- data=[key],
1406
- dtype='ydata',
1407
- axes=kax,
1408
- ind=ii,
1409
- )
1410
-
1411
- l0 = ax.axvline(
1412
- dataX[ind[0]],
1413
- c=color_dict['Y'][ii],
1414
- )
1415
- km = f'{key}_lv-h{ii:02.0f}'
1416
- coll.add_mobile(
1417
- key=km,
1418
- handle=l0,
1419
- refs=(refX,),
1420
- data=keyX,
1421
- dtype='xdata',
1422
- axes=kax,
1423
- ind=ii,
1424
- )
1425
-
1426
- dax[kax].update(refx=[refX], datax=[keyX])
1427
-
1428
- # ---------
1429
- # add text
1430
-
1431
- axtype = 'text0'
1432
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1433
- if len(lax) == 1:
1434
- kax = lax[0]
1435
- ax = dax[kax]['handle']
1436
-
1437
- _plot_text.plot_text(
1438
- coll=coll,
1439
- kax=kax,
1440
- key=key,
1441
- ax=ax,
1442
- ref=refX,
1443
- group='X',
1444
- ind=ind[0],
1445
- lkeys=lkeys,
1446
- nmax=nmax,
1447
- color_dict=color_dict,
1448
- bstr_dict=bstr_dict,
1449
- )
1450
-
1451
- axtype = 'text1'
1452
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1453
- if len(lax) == 1:
1454
- kax = lax[0]
1455
- ax = dax[kax]['handle']
1456
-
1457
- _plot_text.plot_text(
1458
- coll=coll,
1459
- kax=kax,
1460
- key=key,
1461
- ax=ax,
1462
- ref=refY,
1463
- group='Y',
1464
- ind=ind[1],
1465
- lkeys=lkeys,
1466
- nmax=nmax,
1467
- color_dict=color_dict,
1468
- bstr_dict=bstr_dict,
1469
- )
1470
-
1471
- return coll, dax, dgroup
1472
-
1473
-
1474
- # #############################################################################
1475
- # #############################################################################
1476
- # plot_as_array: 3d
1477
- # #############################################################################
1478
-
1479
-
1480
- def plot_as_array_3d(
1481
- # parameters
1482
- coll=None,
1483
- key=None,
1484
- keyX=None,
1485
- keyY=None,
1486
- keyZ=None,
1487
- refX=None,
1488
- refY=None,
1489
- refZ=None,
1490
- islogX=None,
1491
- islogY=None,
1492
- islogZ=None,
1493
- ind=None,
1494
- vmin=None,
1495
- vmax=None,
1496
- cmap=None,
1497
- ymin=None,
1498
- ymax=None,
1499
- aspect=None,
1500
- nmax=None,
1501
- color_dict=None,
1502
- lkeys=None,
1503
- bstr_dict=None,
1504
- rotation=None,
1505
- inverty=None,
1506
- bck=None,
1507
- interp=None,
1508
- # figure-specific
1509
- dax=None,
1510
- dmargin=None,
1511
- fs=None,
1512
- dcolorbar=None,
1513
- dleg=None,
1514
- label=None,
1515
- ):
1516
-
1517
- # --------------
1518
- # Prepare data
1519
-
1520
- data = coll.ddata[key]['data']
1521
- refs = coll.ddata[key]['ref']
1522
- if hasattr(data, 'nnz'):
1523
- data = data.toarray()
1524
- assert data.ndim == len(coll.ddata[key]['ref']) == 3
1525
- n0, n1, n2 = data.shape
1526
-
1527
- # check if transpose is necessary
1528
- [axX, axY, axZ] = [refs.index(rr) for rr in [refX, refY, refZ]]
1529
- [nx, ny, nz] = [data.shape[aa] for aa in [axX, axY, axZ]]
1530
-
1531
- # -----------------
1532
- # prepare slicing
1533
-
1534
- # here slice X => slice in dim Y and vice-versa
1535
- sliX = _class1_compute._get_slice(laxis=[axY, axZ], ndim=3)
1536
- sliY = _class1_compute._get_slice(laxis=[axX, axZ], ndim=3)
1537
- sliZ = _class1_compute._get_slice(laxis=[axX, axY], ndim=3)
1538
- sliZ2 = _class1_compute._get_slice(laxis=[axZ], ndim=3)
1539
-
1540
- if axX < axY:
1541
- datatype = 'data.T'
1542
- dataplot = data[sliZ2(ind[2])].T
1543
- else:
1544
- datatype = 'data'
1545
- dataplot = data[sliZ2(ind[2])]
1546
-
1547
- # ----------------------
1548
- # labels and data
1549
-
1550
- keyX, xstr, dataX, dX2, labX = _get_str_datadlab(
1551
- keyX=keyX, nx=nx, islogX=islogX, coll=coll,
1552
- )
1553
- keyY, ystr, dataY, dY2, labY = _get_str_datadlab(
1554
- keyX=keyY, nx=ny, islogX=islogY, coll=coll,
1555
- )
1556
-
1557
- keyZ, zstr, dataZ, dZ2, labZ = _get_str_datadlab(
1558
- keyX=keyZ, nx=nz, islogX=islogZ, coll=coll,
1559
- )
1560
-
1561
- extent = (
1562
- dataX[0] - dX2, dataX[-1] + dX2,
1563
- dataY[0] - dY2, dataY[-1] + dY2,
1564
- )
1565
-
1566
- # --------------
1567
- # plot - prepare
1568
-
1569
- if dax is None:
1570
- dax = _plot_as_array_3d_create_axes(
1571
- fs=fs,
1572
- dmargin=dmargin,
1573
- )
1574
-
1575
- dax = _generic_check._check_dax(dax=dax, main='matrix')
1576
-
1577
- if label:
1578
- _plot_as_array_3d_label_axes(
1579
- coll=coll,
1580
- dax=dax,
1581
- key=key,
1582
- labX=labX,
1583
- labY=labY,
1584
- labZ=labZ,
1585
- ymin=ymin,
1586
- ymax=ymax,
1587
- xstr=xstr,
1588
- ystr=ystr,
1589
- zstr=zstr,
1590
- keyX=keyX,
1591
- keyY=keyY,
1592
- keyZ=keyZ,
1593
- dataX=dataX,
1594
- dataY=dataY,
1595
- dataZ=dataZ,
1596
- inverty=inverty,
1597
- rotation=rotation,
1598
- )
1599
-
1600
- # ---------------
1601
- # plot fixed part
1602
-
1603
- axtype = 'tracesZ'
1604
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1605
- if len(lax) == 1:
1606
- kax = lax[0]
1607
- ax = dax[kax]['handle']
1608
-
1609
- if bck == 'lines':
1610
- shap = list(data.shape)
1611
- shap[axZ] = 1
1612
- bckl = np.concatenate((data, np.full(shap, np.nan)), axis=axZ)
1613
- bckl = np.swapaxes(bckl, axZ, -1).ravel()
1614
- zdat = np.tile(np.r_[dataZ, np.nan], nx*ny)
1615
- ax.plot(
1616
- zdat,
1617
- bckl,
1618
- c=(0.8, 0.8, 0.8),
1619
- ls='-',
1620
- lw=1.,
1621
- marker='None',
1622
- )
1623
- else:
1624
- bckenv = [
1625
- np.nanmin(data, axis=(axX, axY)),
1626
- np.nanmax(data, axis=(axX, axY)),
1627
- ]
1628
- zdat = dataZ
1629
- ax.fill_between(
1630
- zdat,
1631
- bckenv[0],
1632
- bckenv[1],
1633
- facecolor=(0.8, 0.8, 0.8, 0.8),
1634
- edgecolor='None',
1635
- )
1636
-
1637
- # ----------------
1638
- # define and set dgroup
1639
-
1640
- dgroup = {
1641
- 'X': {
1642
- 'ref': [refX],
1643
- 'data': ['index'],
1644
- 'nmax': nmax,
1645
- },
1646
- 'Y': {
1647
- 'ref': [refY],
1648
- 'data': ['index'],
1649
- 'nmax': nmax,
1650
- },
1651
- 'Z': {
1652
- 'ref': [refZ],
1653
- 'data': ['index'],
1654
- 'nmax': 1,
1655
- },
1656
- }
1657
-
1658
- # ----------------
1659
- # plot mobile part
1660
-
1661
- axtype = 'matrix'
1662
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1663
- if len(lax) == 1:
1664
- kax = lax[0]
1665
- ax = dax[kax]['handle']
1666
-
1667
- # image
1668
- im = ax.imshow(
1669
- dataplot,
1670
- extent=extent,
1671
- interpolation=interp,
1672
- origin='lower',
1673
- aspect=aspect,
1674
- cmap=cmap,
1675
- vmin=vmin,
1676
- vmax=vmax,
1677
- )
1678
-
1679
- km = f'{key}_im'
1680
- coll.add_mobile(
1681
- key=km,
1682
- handle=im,
1683
- refs=refZ,
1684
- data=key,
1685
- dtype=datatype,
1686
- axes=kax,
1687
- ind=0,
1688
- harmonize=False,
1689
- )
1690
-
1691
- if inverty is True:
1692
- ax.invert_yaxis()
1693
-
1694
- # ind0, ind1
1695
- for ii in range(nmax):
1696
- lh = ax.axhline(
1697
- dataY[ind[1]], c=color_dict['X'][ii], lw=1., ls='-',
1698
- )
1699
- lv = ax.axvline(
1700
- dataX[ind[0]], c=color_dict['Y'][ii], lw=1., ls='-',
1701
- )
1702
- mi, = ax.plot(
1703
- dataX[ind[0]],
1704
- dataY[ind[1]],
1705
- marker='s',
1706
- ms=6,
1707
- markeredgecolor=color_dict['X'][ii],
1708
- markerfacecolor='None',
1709
- )
1710
-
1711
- # update coll
1712
- kh = f'{key}_h{ii:02.0f}'
1713
- kv = f'{key}_v{ii:02.0f}'
1714
- coll.add_mobile(
1715
- key=kh,
1716
- handle=lh,
1717
- refs=refY,
1718
- data=keyY,
1719
- dtype='ydata',
1720
- axes=kax,
1721
- ind=ii,
1722
- harmonize=False,
1723
- )
1724
- coll.add_mobile(
1725
- key=kv,
1726
- handle=lv,
1727
- refs=refX,
1728
- data=keyX,
1729
- dtype='xdata',
1730
- axes=kax,
1731
- ind=ii,
1732
- harmonize=False,
1733
- )
1734
- km = f'{key}_m{ii:02.0f}'
1735
- coll.add_mobile(
1736
- key=km,
1737
- handle=mi,
1738
- refs=[refX, refY],
1739
- data=[keyX, keyY],
1740
- dtype=['xdata', 'ydata'],
1741
- axes=kax,
1742
- ind=ii,
1743
- harmonize=False,
1744
- )
1745
-
1746
- dax[kax].update(
1747
- refx=[refX],
1748
- refy=[refY],
1749
- datax=[keyX],
1750
- datay=[keyY],
1751
- )
1752
-
1753
- axtype = 'vertical'
1754
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1755
- if len(lax) == 1:
1756
- kax = lax[0]
1757
- ax = dax[kax]['handle']
1758
-
1759
- for ii in range(nmax):
1760
- l0, = ax.plot(
1761
- data[sliY(ind[0], ind[2])],
1762
- dataY,
1763
- ls='-',
1764
- marker='.',
1765
- lw=1.,
1766
- color=color_dict['Y'][ii],
1767
- label=f'ind0 = {ind[0]}',
1768
- )
1769
-
1770
- km = f'{key}_vprof{ii:02.0f}'
1771
- coll.add_mobile(
1772
- key=km,
1773
- handle=l0,
1774
- refs=((refX, refZ),),
1775
- data=[key],
1776
- dtype=['xdata'],
1777
- group_vis='X',
1778
- axes=kax,
1779
- ind=ii,
1780
- harmonize=False,
1781
- )
1782
-
1783
- l0 = ax.axhline(
1784
- dataY[ind[1]],
1785
- c=color_dict['X'][ii],
1786
- )
1787
- km = f'{key}_lh-v{ii:02.0f}'
1788
- coll.add_mobile(
1789
- key=km,
1790
- handle=l0,
1791
- refs=(refY,),
1792
- data=keyY,
1793
- dtype='ydata',
1794
- group_vis='Y',
1795
- axes=kax,
1796
- ind=ii,
1797
- harmonize=False,
1798
- )
1799
-
1800
- dax[kax].update(refy=[refY], datay=[keyY])
1801
-
1802
- axtype = 'horizontal'
1803
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1804
- if len(lax) == 1:
1805
- kax = lax[0]
1806
- ax = dax[kax]['handle']
1807
-
1808
- for ii in range(nmax):
1809
- l1, = ax.plot(
1810
- dataX,
1811
- data[sliX(ind[1], ind[2])],
1812
- ls='-',
1813
- marker='.',
1814
- lw=1.,
1815
- color=color_dict['X'][ii],
1816
- )
1817
-
1818
- km = f'{key}_hprof{ii:02.0f}'
1819
- coll.add_mobile(
1820
- key=km,
1821
- handle=l1,
1822
- refs=((refY, refZ),),
1823
- data=[key],
1824
- dtype=['ydata'],
1825
- group_vis='Y',
1826
- axes=kax,
1827
- ind=ii,
1828
- harmonize=False,
1829
- )
1830
-
1831
- l0 = ax.axvline(
1832
- dataX[ind[0]],
1833
- c=color_dict['Y'][ii],
1834
- )
1835
- km = f'{key}_lv-h{ii:02.0f}'
1836
- coll.add_mobile(
1837
- key=km,
1838
- handle=l0,
1839
- refs=(refX,),
1840
- data=keyX,
1841
- dtype='xdata',
1842
- group_vis='X',
1843
- axes=kax,
1844
- ind=ii,
1845
- harmonize=False,
1846
- )
1847
-
1848
- dax[kax].update(refx=[refX], datax=[keyX])
1849
-
1850
- # traces
1851
- axtype = 'tracesZ'
1852
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1853
- if len(lax) == 1:
1854
- kax = lax[0]
1855
- ax = dax[kax]['handle']
1856
-
1857
- for ii in range(nmax):
1858
- l1, = ax.plot(
1859
- dataZ,
1860
- data[sliZ(ind[0], ind[1])],
1861
- ls='-',
1862
- marker='None',
1863
- color=color_dict['X'][ii],
1864
- )
1865
-
1866
- km = f'{key}_traceZ{ii:02.0f}'
1867
- coll.add_mobile(
1868
- key=km,
1869
- handle=l1,
1870
- refs=((refX, refY),),
1871
- data=[key],
1872
- dtype=['ydata'],
1873
- axes=kax,
1874
- ind=ii,
1875
- harmonize=False,
1876
- )
1877
-
1878
- l0 = ax.axvline(
1879
- dataZ[ind[2]],
1880
- c='k',
1881
- )
1882
- km = f'{key}_lv-z'
1883
- coll.add_mobile(
1884
- key=km,
1885
- handle=l0,
1886
- refs=(refZ,),
1887
- data=keyZ,
1888
- dtype='xdata',
1889
- axes=kax,
1890
- ind=0,
1891
- harmonize=False,
1892
- )
1893
-
1894
- dax[kax].update(refx=[refZ], datax=[keyZ])
1895
-
1896
- # ---------
1897
- # add text
1898
-
1899
- axtype = 'textX'
1900
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1901
- if len(lax) == 1:
1902
- kax = lax[0]
1903
- ax = dax[kax]['handle']
1904
-
1905
- _plot_text.plot_text(
1906
- coll=coll,
1907
- kax=kax,
1908
- key=key,
1909
- ax=ax,
1910
- ref=refX,
1911
- group='X',
1912
- ind=ind[0],
1913
- lkeys=lkeys,
1914
- nmax=nmax,
1915
- color_dict=color_dict,
1916
- bstr_dict=bstr_dict,
1917
- )
1918
-
1919
- axtype = 'textY'
1920
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1921
- if len(lax) == 1:
1922
- kax = lax[0]
1923
- ax = dax[kax]['handle']
1924
-
1925
- _plot_text.plot_text(
1926
- coll=coll,
1927
- kax=kax,
1928
- key=key,
1929
- ax=ax,
1930
- ref=refY,
1931
- group='Y',
1932
- ind=ind[1],
1933
- lkeys=lkeys,
1934
- nmax=nmax,
1935
- color_dict=color_dict,
1936
- bstr_dict=bstr_dict,
1937
- )
1938
-
1939
- axtype = 'textZ'
1940
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
1941
- if len(lax) == 1:
1942
- kax = lax[0]
1943
- ax = dax[kax]['handle']
1944
-
1945
- _plot_text.plot_text(
1946
- coll=coll,
1947
- kax=kax,
1948
- key=key,
1949
- ax=ax,
1950
- ref=refZ,
1951
- group='Z',
1952
- ind=ind[2],
1953
- lkeys=lkeys,
1954
- nmax=nmax,
1955
- color_dict=color_dict,
1956
- bstr_dict=bstr_dict,
1957
- )
1958
-
1959
- return coll, dax, dgroup
1960
-
1961
-
1962
- def _plot_as_array_3d_create_axes(
1963
- fs=None,
1964
- dmargin=None,
1965
- ):
1966
-
1967
- if fs is None:
1968
- fs = (15, 9)
1969
-
1970
- if dmargin is None:
1971
- dmargin = {
1972
- 'left': 0.05, 'right': 0.95,
1973
- 'bottom': 0.06, 'top': 0.90,
1974
- 'hspace': 0.2, 'wspace': 0.3,
1975
- }
1976
-
1977
- fig = plt.figure(figsize=fs)
1978
- gs = gridspec.GridSpec(ncols=6, nrows=6, **dmargin)
1979
-
1980
- # axes for image
1981
- ax0 = fig.add_subplot(gs[:4, 2:4], aspect='auto')
1982
-
1983
- # axes for vertical profile
1984
- ax1 = fig.add_subplot(gs[:4, 4], sharey=ax0)
1985
-
1986
- # axes for horizontal profile
1987
- ax2 = fig.add_subplot(gs[4:, 2:4], sharex=ax0)
1988
-
1989
- # axes for traces
1990
- ax3 = fig.add_subplot(gs[:3, :2])
1991
-
1992
- # axes for text
1993
- ax4 = fig.add_subplot(gs[:3, 5], frameon=False)
1994
- ax5 = fig.add_subplot(gs[3:, 5], frameon=False)
1995
- ax6 = fig.add_subplot(gs[4:, :2], frameon=False)
1996
-
1997
- # dax
1998
- dax = {
1999
- # data
2000
- 'matrix': {'handle': ax0},
2001
- 'vertical': {'handle': ax1},
2002
- 'horizontal': {'handle': ax2},
2003
- 'tracesZ': {'handle': ax3},
2004
- # text
2005
- 'textX': {'handle': ax4},
2006
- 'textY': {'handle': ax5},
2007
- 'textZ': {'handle': ax6},
2008
- }
2009
- return dax
2010
-
2011
-
2012
- def _plot_as_array_3d_label_axes(
2013
- coll=None,
2014
- dax=None,
2015
- key=None,
2016
- labX=None,
2017
- labY=None,
2018
- labZ=None,
2019
- ymin=None,
2020
- ymax=None,
2021
- xstr=None,
2022
- ystr=None,
2023
- zstr=None,
2024
- keyX=None,
2025
- keyY=None,
2026
- keyZ=None,
2027
- dataX=None,
2028
- dataY=None,
2029
- dataZ=None,
2030
- inverty=None,
2031
- rotation=None,
2032
- ):
2033
-
2034
- # fig
2035
- fig = list(dax.values())[0]['handle'].figure
2036
- fig.suptitle(key, size=14, fontweight='bold')
2037
-
2038
- # axes for image
2039
- axtype = 'matrix'
2040
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2041
- if len(lax) == 1:
2042
- kax = lax[0]
2043
- ax = dax[kax]['handle']
2044
- ax.tick_params(
2045
- axis="x",
2046
- bottom=False, top=True,
2047
- labelbottom=False, labeltop=True,
2048
- )
2049
- ax.xaxis.set_label_position('top')
2050
-
2051
- # x text ticks
2052
- if xstr:
2053
- ax.set_xticks(dataX)
2054
- ax.set_xticklabels(
2055
- coll.ddata[keyX]['data'],
2056
- rotation=rotation,
2057
- horizontalalignment='left',
2058
- verticalalignment='bottom',
2059
- )
2060
- else:
2061
- ax.set_xlabel(labX)
2062
-
2063
- # y text ticks
2064
- if ystr:
2065
- ax.set_yticks(dataY)
2066
- ax.set_yticklabels(
2067
- coll.ddata[keyY]['data'],
2068
- rotation=rotation,
2069
- horizontalalignment='right',
2070
- verticalalignment='top',
2071
- )
2072
- else:
2073
- ax.set_ylabel(labY)
2074
-
2075
- dax[kax]['inverty'] = inverty
2076
-
2077
- # axes for vertical profile
2078
- axtype = 'vertical'
2079
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2080
- if len(lax) == 1:
2081
- kax = lax[0]
2082
- ax = dax[kax]['handle']
2083
- ax.set_xlabel('data')
2084
- ax.set_ylabel(labY)
2085
- ax.tick_params(
2086
- axis="y",
2087
- left=False, right=True,
2088
- labelleft=False, labelright=True,
2089
- )
2090
- ax.tick_params(
2091
- axis="x",
2092
- bottom=False, top=True,
2093
- labelbottom=False, labeltop=True,
2094
- )
2095
- ax.yaxis.set_label_position('right')
2096
- ax.xaxis.set_label_position('top')
2097
-
2098
- if np.isfinite(ymin):
2099
- ax.set_xlim(left=ymin)
2100
- if np.isfinite(ymax):
2101
- ax.set_xlim(right=ymax)
2102
-
2103
- # y text ticks
2104
- if ystr:
2105
- ax.set_yticks(dataY)
2106
- ax.set_yticklabels(
2107
- coll.ddata[keyY]['data'],
2108
- rotation=rotation,
2109
- horizontalalignment='left',
2110
- verticalalignment='bottom',
2111
- )
2112
- else:
2113
- ax.set_ylabel(labY)
2114
-
2115
- dax[kax]['inverty'] = inverty
2116
-
2117
- # axes for horizontal profile
2118
- axtype = 'horizontal'
2119
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2120
- if len(lax) == 1:
2121
- kax = lax[0]
2122
- ax = dax[kax]['handle']
2123
- ax.set_ylabel('data')
2124
- ax.set_xlabel(labX)
2125
-
2126
- if np.isfinite(ymin):
2127
- ax.set_ylim(bottom=ymin)
2128
- if np.isfinite(ymax):
2129
- ax.set_ylim(top=ymax)
2130
-
2131
- # x text ticks
2132
- if xstr:
2133
- ax.set_xticks(dataX)
2134
- ax.set_xticklabels(
2135
- coll.ddata[keyX]['data'],
2136
- rotation=rotation,
2137
- horizontalalignment='right',
2138
- verticalalignment='top',
2139
- )
2140
- else:
2141
- ax.set_xlabel(labX)
2142
-
2143
- # axes for traces
2144
- axtype = 'tracesZ'
2145
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2146
- if len(lax) == 1:
2147
- kax = lax[0]
2148
- ax = dax[kax]['handle']
2149
- ax.set_ylabel('data')
2150
- ax.set_xlabel(labZ)
2151
-
2152
- if np.isfinite(ymin):
2153
- ax.set_ylim(bottom=ymin)
2154
- if np.isfinite(ymax):
2155
- ax.set_ylim(top=ymax)
2156
-
2157
- # z text ticks
2158
- if zstr:
2159
- ax.set_yticks(dataZ)
2160
- ax.set_yticklabels(
2161
- coll.ddata[keyZ]['data'],
2162
- rotation=rotation,
2163
- horizontalalignment='right',
2164
- verticalalignment='top',
2165
- )
2166
- else:
2167
- ax.set_ylabel(labZ)
2168
-
2169
- # axes for text
2170
- axtype = 'textX'
2171
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2172
- if len(lax) == 1:
2173
- kax = lax[0]
2174
- ax = dax[kax]['handle']
2175
- ax.set_xticks([])
2176
- ax.set_yticks([])
2177
-
2178
- axtype = 'textY'
2179
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2180
- if len(lax) == 1:
2181
- kax = lax[0]
2182
- ax = dax[kax]['handle']
2183
- ax.set_xticks([])
2184
- ax.set_yticks([])
2185
-
2186
- axtype = 'textZ'
2187
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2188
- if len(lax) == 1:
2189
- kax = lax[0]
2190
- ax = dax[kax]['handle']
2191
- ax.set_xticks([])
2192
- ax.set_yticks([])
2193
-
2194
- return dax
2195
-
2196
-
2197
- # #############################################################################
2198
- # #############################################################################
2199
- # plot_as_array: 4d
2200
- # #############################################################################
2201
-
2202
-
2203
- def plot_as_array_4d(
2204
- # parameters
2205
- coll=None,
2206
- key=None,
2207
- keyX=None,
2208
- keyY=None,
2209
- keyZ=None,
2210
- keyU=None,
2211
- refX=None,
2212
- refY=None,
2213
- refZ=None,
2214
- refU=None,
2215
- islogX=None,
2216
- islogY=None,
2217
- islogZ=None,
2218
- islogU=None,
2219
- ind=None,
2220
- vmin=None,
2221
- vmax=None,
2222
- cmap=None,
2223
- ymin=None,
2224
- ymax=None,
2225
- aspect=None,
2226
- nmax=None,
2227
- color_dict=None,
2228
- lkeys=None,
2229
- bstr_dict=None,
2230
- rotation=None,
2231
- inverty=None,
2232
- bck=None,
2233
- interp=None,
2234
- # figure-specific
2235
- dax=None,
2236
- dmargin=None,
2237
- fs=None,
2238
- dcolorbar=None,
2239
- dleg=None,
2240
- label=None,
2241
- ):
2242
-
2243
- # --------------
2244
- # Prepare data
2245
-
2246
- data = coll.ddata[key]['data']
2247
- refs = coll.ddata[key]['ref']
2248
- if hasattr(data, 'nnz'):
2249
- data = data.toarray()
2250
- assert data.ndim == len(coll.ddata[key]['ref']) == 4
2251
- n0, n1, n2, n3 = data.shape
2252
-
2253
- # check if transpose is necessary
2254
- [axX, axY, axZ, axU] = [refs.index(rr) for rr in [refX, refY, refZ, refU]]
2255
- [nx, ny, nz, nu] = [data.shape[aa] for aa in [axX, axY, axZ, axU]]
2256
-
2257
- # -----------------
2258
- # prepare slicing
2259
-
2260
- # here slice X => slice in dim Y and vice-versa
2261
- sliX = _class1_compute._get_slice(laxis=[axY, axZ, axU], ndim=4)
2262
- sliY = _class1_compute._get_slice(laxis=[axX, axZ, axU], ndim=4)
2263
- sliZ = _class1_compute._get_slice(laxis=[axX, axY, axU], ndim=4)
2264
- sliU = _class1_compute._get_slice(laxis=[axX, axY, axZ], ndim=4)
2265
- sliZ2 = _class1_compute._get_slice(laxis=[axZ, axU], ndim=4)
2266
-
2267
- if axX < axY:
2268
- datatype = 'data.T'
2269
- dataplot = data[sliZ2(ind[2], ind[3])].T
2270
- else:
2271
- datatype = 'data'
2272
- dataplot = data[sliZ2(ind[2], ind[3])]
2273
-
2274
- # ----------------------
2275
- # labels and data
2276
-
2277
- keyX, xstr, dataX, dX2, labX = _get_str_datadlab(
2278
- keyX=keyX, nx=nx, islogX=islogX, coll=coll,
2279
- )
2280
- keyY, ystr, dataY, dY2, labY = _get_str_datadlab(
2281
- keyX=keyY, nx=ny, islogX=islogY, coll=coll,
2282
- )
2283
- keyZ, zstr, dataZ, dZ2, labZ = _get_str_datadlab(
2284
- keyX=keyZ, nx=nz, islogX=islogZ, coll=coll,
2285
- )
2286
- keyU, ustr, dataU, dU2, labU = _get_str_datadlab(
2287
- keyX=keyU, nx=nu, islogX=islogU, coll=coll,
2288
- )
2289
-
2290
- extent = (
2291
- dataX[0] - dX2, dataX[-1] + dX2,
2292
- dataY[0] - dY2, dataY[-1] + dY2,
2293
- )
2294
-
2295
- # --------------
2296
- # plot - prepare
2297
-
2298
- if dax is None:
2299
- dax = _plot_as_array_4d_create_axes(
2300
- fs=fs,
2301
- dmargin=dmargin,
2302
- )
2303
-
2304
- dax = _generic_check._check_dax(dax=dax, main='matrix')
2305
-
2306
- if label:
2307
- _plot_as_array_4d_label_axes(
2308
- coll=coll,
2309
- dax=dax,
2310
- key=key,
2311
- labX=labX,
2312
- labY=labY,
2313
- labZ=labZ,
2314
- labU=labU,
2315
- ymin=ymin,
2316
- ymax=ymax,
2317
- xstr=xstr,
2318
- ystr=ystr,
2319
- zstr=zstr,
2320
- ustr=ustr,
2321
- keyX=keyX,
2322
- keyY=keyY,
2323
- keyZ=keyZ,
2324
- keyU=keyU,
2325
- dataX=dataX,
2326
- dataY=dataY,
2327
- dataZ=dataZ,
2328
- dataU=dataU,
2329
- inverty=inverty,
2330
- rotation=rotation,
2331
- )
2332
-
2333
- # ---------------
2334
- # plot fixed part
2335
-
2336
- # tracesZ
2337
- axtype = 'tracesZ'
2338
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2339
- if len(lax) == 1:
2340
- kax = lax[0]
2341
- ax = dax[kax]['handle']
2342
-
2343
- if bck == 'lines':
2344
- shap = list(data.shape)
2345
- shap[axZ] = 1
2346
- bckl = np.concatenate((data, np.full(shap, np.nan)), axis=axZ)
2347
- bckl = np.swapaxes(bckl, axZ, -1).ravel()
2348
- zdat = np.tile(np.r_[dataZ, np.nan], nx*ny*nu)
2349
- ax.plot(
2350
- zdat,
2351
- bckl,
2352
- c=(0.8, 0.8, 0.8),
2353
- ls='-',
2354
- lw=1.,
2355
- marker='None',
2356
- )
2357
- else:
2358
- bckenv = [
2359
- np.nanmin(data, axis=(axX, axY, axU)),
2360
- np.nanmax(data, axis=(axX, axY, axU)),
2361
- ]
2362
- zdat = dataZ
2363
- ax.fill_between(
2364
- zdat,
2365
- bckenv[0],
2366
- bckenv[1],
2367
- facecolor=(0.8, 0.8, 0.8, 0.8),
2368
- edgecolor='None',
2369
- )
2370
-
2371
- # tracesU
2372
- axtype = 'tracesU'
2373
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2374
- if len(lax) == 1:
2375
- kax = lax[0]
2376
- ax = dax[kax]['handle']
2377
-
2378
- if bck == 'lines':
2379
- shap = list(data.shape)
2380
- shap[axU] = 1
2381
- bckl = np.concatenate((data, np.full(shap, np.nan)), axis=axU)
2382
- bckl = np.swapaxes(bckl, axU, -1).ravel()
2383
- udat = np.tile(np.r_[dataU, np.nan], nx*ny*nz)
2384
- ax.plot(
2385
- udat,
2386
- bckl,
2387
- c=(0.8, 0.8, 0.8),
2388
- ls='-',
2389
- lw=1.,
2390
- marker='None',
2391
- )
2392
- else:
2393
- bckenv = [
2394
- np.nanmin(data, axis=(axX, axY, axZ)),
2395
- np.nanmax(data, axis=(axX, axY, axZ)),
2396
- ]
2397
- udat = dataU
2398
- ax.fill_between(
2399
- udat,
2400
- bckenv[0],
2401
- bckenv[1],
2402
- facecolor=(0.8, 0.8, 0.8, 0.8),
2403
- edgecolor='None',
2404
- )
2405
-
2406
- # ----------------
2407
- # define and set dgroup
2408
-
2409
- dgroup = {
2410
- 'X': {
2411
- 'ref': [refX],
2412
- 'data': ['index'],
2413
- 'nmax': nmax,
2414
- },
2415
- 'Y': {
2416
- 'ref': [refY],
2417
- 'data': ['index'],
2418
- 'nmax': nmax,
2419
- },
2420
- 'Z': {
2421
- 'ref': [refZ],
2422
- 'data': ['index'],
2423
- 'nmax': 1,
2424
- },
2425
- 'U': {
2426
- 'ref': [refU],
2427
- 'data': ['index'],
2428
- 'nmax': 1,
2429
- },
2430
- }
2431
-
2432
- # -----------------
2433
- # plot mobile parts
2434
-
2435
- # matrix
2436
- axtype = 'matrix'
2437
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2438
- if len(lax) == 1:
2439
- kax = lax[0]
2440
- ax = dax[kax]['handle']
2441
-
2442
- # image
2443
- im = ax.imshow(
2444
- dataplot,
2445
- extent=extent,
2446
- interpolation=interp,
2447
- origin='lower',
2448
- aspect=aspect,
2449
- cmap=cmap,
2450
- vmin=vmin,
2451
- vmax=vmax,
2452
- )
2453
-
2454
- km = f'{key}_im'
2455
- coll.add_mobile(
2456
- key=km,
2457
- handle=im,
2458
- refs=((refZ, refU),),
2459
- data=key,
2460
- dtype=datatype,
2461
- axes=kax,
2462
- ind=0,
2463
- )
2464
-
2465
- if inverty is True:
2466
- ax.invert_yaxis()
2467
-
2468
- # ind0, ind1
2469
- for ii in range(nmax):
2470
- lh = ax.axhline(
2471
- dataY[ind[1]], c=color_dict['X'][ii], lw=1., ls='-',
2472
- )
2473
- lv = ax.axvline(
2474
- dataX[ind[0]], c=color_dict['Y'][ii], lw=1., ls='-',
2475
- )
2476
- mi, = ax.plot(
2477
- dataX[ind[0]],
2478
- dataY[ind[1]],
2479
- marker='s',
2480
- ms=6,
2481
- markeredgecolor=color_dict['X'][ii],
2482
- markerfacecolor='None',
2483
- )
2484
-
2485
- # update coll
2486
- kh = f'{key}_h{ii:02.0f}'
2487
- kv = f'{key}_v{ii:02.0f}'
2488
- coll.add_mobile(
2489
- key=kh,
2490
- handle=lh,
2491
- refs=refY,
2492
- data=keyY,
2493
- dtype='ydata',
2494
- axes=kax,
2495
- ind=ii,
2496
- )
2497
- coll.add_mobile(
2498
- key=kv,
2499
- handle=lv,
2500
- refs=refX,
2501
- data=keyX,
2502
- dtype='xdata',
2503
- axes=kax,
2504
- ind=ii,
2505
- )
2506
- km = f'{key}_m{ii:02.0f}'
2507
- coll.add_mobile(
2508
- key=km,
2509
- handle=mi,
2510
- refs=[refX, refY],
2511
- data=[keyX, keyY],
2512
- dtype=['xdata', 'ydata'],
2513
- axes=kax,
2514
- ind=ii,
2515
- )
2516
-
2517
- dax[kax].update(
2518
- refx=[refX],
2519
- refy=[refY],
2520
- datax=[keyX],
2521
- datay=[keyY],
2522
- )
2523
-
2524
- # vertical
2525
- axtype = 'vertical'
2526
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2527
- if len(lax) == 1:
2528
- kax = lax[0]
2529
- ax = dax[kax]['handle']
2530
-
2531
- for ii in range(nmax):
2532
- l0, = ax.plot(
2533
- data[sliY(ind[0], ind[2], ind[3])],
2534
- dataY,
2535
- ls='-',
2536
- marker='.',
2537
- lw=1.,
2538
- color=color_dict['Y'][ii],
2539
- label=f'ind0 = {ind[0]}',
2540
- )
2541
-
2542
- km = f'{key}_vprof{ii:02.0f}'
2543
- coll.add_mobile(
2544
- key=km,
2545
- handle=l0,
2546
- refs=((refX, refZ, refU),),
2547
- data=[key],
2548
- dtype=['xdata'],
2549
- group_vis='X',
2550
- axes=kax,
2551
- ind=ii,
2552
- )
2553
-
2554
- l0 = ax.axhline(
2555
- dataY[ind[1]],
2556
- c=color_dict['X'][ii],
2557
- )
2558
- km = f'{key}_lh-v{ii:02.0f}'
2559
- coll.add_mobile(
2560
- key=km,
2561
- handle=l0,
2562
- refs=(refY,),
2563
- data=keyY,
2564
- dtype='ydata',
2565
- group_vis='Y',
2566
- axes=kax,
2567
- ind=ii,
2568
- )
2569
-
2570
- dax[kax].update(refy=[refY], datay=[keyY])
2571
-
2572
- # horizontal
2573
- axtype = 'horizontal'
2574
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2575
- if len(lax) == 1:
2576
- kax = lax[0]
2577
- ax = dax[kax]['handle']
2578
-
2579
- for ii in range(nmax):
2580
- l1, = ax.plot(
2581
- dataX,
2582
- data[sliX(ind[1], ind[2], ind[3])],
2583
- ls='-',
2584
- marker='.',
2585
- lw=1.,
2586
- color=color_dict['X'][ii],
2587
- )
2588
-
2589
- km = f'{key}_hprof{ii:02.0f}'
2590
- coll.add_mobile(
2591
- key=km,
2592
- handle=l1,
2593
- refs=((refY, refZ, refU),),
2594
- data=[key],
2595
- dtype=['ydata'],
2596
- group_vis='Y',
2597
- axes=kax,
2598
- ind=ii,
2599
- )
2600
-
2601
- l0 = ax.axvline(
2602
- dataX[ind[0]],
2603
- c=color_dict['Y'][ii],
2604
- )
2605
- km = f'{key}_lv-h{ii:02.0f}'
2606
- coll.add_mobile(
2607
- key=km,
2608
- handle=l0,
2609
- refs=(refX,),
2610
- data=keyX,
2611
- dtype='xdata',
2612
- group_vis='X',
2613
- axes=kax,
2614
- ind=ii,
2615
- )
2616
-
2617
- dax[kax].update(refx=[refX], datax=[keyX])
2618
-
2619
- # tracesZ
2620
- axtype = 'tracesZ'
2621
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2622
- if len(lax) == 1:
2623
- kax = lax[0]
2624
- ax = dax[kax]['handle']
2625
-
2626
- for ii in range(nmax):
2627
- l1, = ax.plot(
2628
- dataZ,
2629
- data[sliZ(ind[0], ind[1], ind[3])],
2630
- ls='-',
2631
- marker='None',
2632
- color=color_dict['X'][ii],
2633
- )
2634
-
2635
- km = f'{key}_trace{ii:02.0f}'
2636
- coll.add_mobile(
2637
- key=km,
2638
- handle=l1,
2639
- refs=((refX, refY, refU),),
2640
- data=[key],
2641
- dtype=['ydata'],
2642
- axes=kax,
2643
- ind=ii,
2644
- )
2645
-
2646
- l0 = ax.axvline(
2647
- dataZ[ind[2]],
2648
- c='k',
2649
- )
2650
- km = f'{key}_lv-z'
2651
- coll.add_mobile(
2652
- key=km,
2653
- handle=l0,
2654
- refs=(refZ,),
2655
- data=keyZ,
2656
- dtype='xdata',
2657
- axes=kax,
2658
- ind=0,
2659
- )
2660
-
2661
- dax[kax].update(refx=[refZ], datax=[keyZ])
2662
-
2663
- # tracesU
2664
- axtype = 'tracesU'
2665
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2666
- if len(lax) == 1:
2667
- kax = lax[0]
2668
- ax = dax[kax]['handle']
2669
-
2670
- for ii in range(nmax):
2671
- l1, = ax.plot(
2672
- dataU,
2673
- data[sliU(ind[0], ind[1], ind[2])],
2674
- ls='-',
2675
- marker='None',
2676
- color=color_dict['U'][ii],
2677
- )
2678
-
2679
- km = f'{key}_traceU{ii:02.0f}'
2680
- coll.add_mobile(
2681
- key=km,
2682
- handle=l1,
2683
- refs=((refX, refY, refZ),),
2684
- data=[key],
2685
- dtype=['ydata'],
2686
- axes=kax,
2687
- ind=ii,
2688
- )
2689
-
2690
- l0 = ax.axvline(
2691
- dataU[ind[2]],
2692
- c='k',
2693
- )
2694
- km = f'{key}_lv-u'
2695
- coll.add_mobile(
2696
- key=km,
2697
- handle=l0,
2698
- refs=(refU,),
2699
- data=keyU,
2700
- dtype='xdata',
2701
- axes=kax,
2702
- ind=0,
2703
- )
2704
-
2705
- dax[kax].update(refx=[refU], datax=[keyU])
2706
-
2707
- # ---------
2708
- # add text
2709
-
2710
- # textX
2711
- axtype = 'textX'
2712
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2713
- if len(lax) == 1:
2714
- kax = lax[0]
2715
- ax = dax[kax]['handle']
2716
-
2717
- _plot_text.plot_text(
2718
- coll=coll,
2719
- kax=kax,
2720
- key=key,
2721
- ax=ax,
2722
- ref=refX,
2723
- group='X',
2724
- ind=ind[0],
2725
- lkeys=lkeys,
2726
- nmax=nmax,
2727
- color_dict=color_dict,
2728
- bstr_dict=bstr_dict,
2729
- )
2730
-
2731
- # textY
2732
- axtype = 'textY'
2733
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2734
- if len(lax) == 1:
2735
- kax = lax[0]
2736
- ax = dax[kax]['handle']
2737
-
2738
- _plot_text.plot_text(
2739
- coll=coll,
2740
- kax=kax,
2741
- key=key,
2742
- ax=ax,
2743
- ref=refY,
2744
- group='Y',
2745
- ind=ind[1],
2746
- lkeys=lkeys,
2747
- nmax=nmax,
2748
- color_dict=color_dict,
2749
- bstr_dict=bstr_dict,
2750
- )
2751
-
2752
- # textZ
2753
- axtype = 'textZ'
2754
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2755
- if len(lax) == 1:
2756
- kax = lax[0]
2757
- ax = dax[kax]['handle']
2758
-
2759
- _plot_text.plot_text(
2760
- coll=coll,
2761
- kax=kax,
2762
- key=key,
2763
- ax=ax,
2764
- ref=refZ,
2765
- group='Z',
2766
- ind=ind[2],
2767
- lkeys=lkeys,
2768
- nmax=nmax,
2769
- color_dict=color_dict,
2770
- bstr_dict=bstr_dict,
2771
- )
2772
-
2773
- # textU
2774
- axtype = 'textU'
2775
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2776
- if len(lax) == 1:
2777
- kax = lax[0]
2778
- ax = dax[kax]['handle']
2779
-
2780
- _plot_text.plot_text(
2781
- coll=coll,
2782
- kax=kax,
2783
- key=key,
2784
- ax=ax,
2785
- ref=refU,
2786
- group='U',
2787
- ind=ind[3],
2788
- lkeys=lkeys,
2789
- nmax=nmax,
2790
- color_dict=color_dict,
2791
- bstr_dict=bstr_dict,
2792
- )
2793
-
2794
- return coll, dax, dgroup
2795
-
2796
-
2797
- def _plot_as_array_4d_create_axes(
2798
- fs=None,
2799
- dmargin=None,
2800
- ):
2801
-
2802
- if fs is None:
2803
- fs = (17, 9)
2804
-
2805
- if dmargin is None:
2806
- dmargin = {
2807
- 'left': 0.05, 'right': 0.95,
2808
- 'bottom': 0.06, 'top': 0.90,
2809
- 'hspace': 0.5, 'wspace': 0.4,
2810
- }
2811
-
2812
- fig = plt.figure(figsize=fs)
2813
- gs = gridspec.GridSpec(ncols=7, nrows=6, **dmargin)
2814
-
2815
- # axes for image
2816
- ax0 = fig.add_subplot(gs[:4, 2:4], aspect='auto')
2817
-
2818
- # axes for vertical profile
2819
- ax1 = fig.add_subplot(gs[:4, 4], sharey=ax0)
2820
-
2821
- # axes for horizontal profile
2822
- ax2 = fig.add_subplot(gs[4:, 2:4], sharex=ax0)
2823
-
2824
- # axes for tracesZ
2825
- ax3 = fig.add_subplot(gs[:3, :2])
2826
-
2827
- # axes for tracesU
2828
- ax4 = fig.add_subplot(gs[3:, :2])
2829
-
2830
- # axes for text
2831
- ax5 = fig.add_subplot(gs[:3, 5], frameon=False)
2832
- ax6 = fig.add_subplot(gs[3:, 5], frameon=False)
2833
- ax7 = fig.add_subplot(gs[:3, 6], frameon=False)
2834
- ax8 = fig.add_subplot(gs[3:, 6], frameon=False)
2835
-
2836
- # dax
2837
- dax = {
2838
- # data
2839
- 'matrix': {'handle': ax0},
2840
- 'vertical': {'handle': ax1},
2841
- 'horizontal': {'handle': ax2},
2842
- 'tracesZ': {'handle': ax3},
2843
- 'tracesU': {'handle': ax4},
2844
- # text
2845
- 'textX': {'handle': ax5},
2846
- 'textY': {'handle': ax6},
2847
- 'textZ': {'handle': ax7},
2848
- 'textU': {'handle': ax8},
2849
- }
2850
- return dax
2851
-
2852
-
2853
- def _plot_as_array_4d_label_axes(
2854
- coll=None,
2855
- dax=None,
2856
- key=None,
2857
- labX=None,
2858
- labY=None,
2859
- labZ=None,
2860
- labU=None,
2861
- ymin=None,
2862
- ymax=None,
2863
- xstr=None,
2864
- ystr=None,
2865
- zstr=None,
2866
- ustr=None,
2867
- keyX=None,
2868
- keyY=None,
2869
- keyZ=None,
2870
- keyU=None,
2871
- dataX=None,
2872
- dataY=None,
2873
- dataZ=None,
2874
- dataU=None,
2875
- inverty=None,
2876
- rotation=None,
2877
- ):
2878
-
2879
- # fig
2880
- fig = list(dax.values())[0]['handle'].figure
2881
- fig.suptitle(key, size=14, fontweight='bold')
2882
-
2883
- # axes for image
2884
- axtype = 'matrix'
2885
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2886
- if len(lax) == 1:
2887
- kax = lax[0]
2888
- ax = dax[kax]['handle']
2889
- ax.tick_params(
2890
- axis="x",
2891
- bottom=False, top=True,
2892
- labelbottom=False, labeltop=True,
2893
- )
2894
- ax.xaxis.set_label_position('top')
2895
-
2896
- # x text ticks
2897
- if xstr:
2898
- ax.set_xticks(dataX)
2899
- ax.set_xticklabels(
2900
- coll.ddata[keyX]['data'],
2901
- rotation=rotation,
2902
- horizontalalignment='left',
2903
- verticalalignment='bottom',
2904
- )
2905
- else:
2906
- ax.set_xlabel(labX)
2907
-
2908
- # y text ticks
2909
- if ystr:
2910
- ax.set_yticks(dataY)
2911
- ax.set_yticklabels(
2912
- coll.ddata[keyY]['data'],
2913
- rotation=rotation,
2914
- horizontalalignment='right',
2915
- verticalalignment='top',
2916
- )
2917
- else:
2918
- ax.set_ylabel(labY)
2919
-
2920
- dax[kax]['inverty'] = inverty
2921
-
2922
- # axes for vertical profile
2923
- axtype = 'vertical'
2924
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2925
- if len(lax) == 1:
2926
- kax = lax[0]
2927
- ax = dax[kax]['handle']
2928
- ax.set_xlabel('data')
2929
- ax.set_ylabel(labY)
2930
- ax.tick_params(
2931
- axis="y",
2932
- left=False, right=True,
2933
- labelleft=False, labelright=True,
2934
- )
2935
- ax.tick_params(
2936
- axis="x",
2937
- bottom=False, top=True,
2938
- labelbottom=False, labeltop=True,
2939
- )
2940
- ax.yaxis.set_label_position('right')
2941
- ax.xaxis.set_label_position('top')
2942
-
2943
- if np.isfinite(ymin):
2944
- ax.set_xlim(left=ymin)
2945
- if np.isfinite(ymax):
2946
- ax.set_xlim(right=ymax)
2947
-
2948
- # y text ticks
2949
- if ystr:
2950
- ax.set_yticks(dataY)
2951
- ax.set_yticklabels(
2952
- coll.ddata[keyY]['data'],
2953
- rotation=rotation,
2954
- horizontalalignment='left',
2955
- verticalalignment='bottom',
2956
- )
2957
- else:
2958
- ax.set_ylabel(labY)
2959
-
2960
- dax[kax]['inverty'] = inverty
2961
-
2962
- # axes for horizontal profile
2963
- axtype = 'horizontal'
2964
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2965
- if len(lax) == 1:
2966
- kax = lax[0]
2967
- ax = dax[kax]['handle']
2968
- ax.set_ylabel('data')
2969
- ax.set_xlabel(labX)
2970
-
2971
- ax.set_ylim(ymin, ymax)
2972
-
2973
- # x text ticks
2974
- if xstr:
2975
- ax.set_xticks(dataX)
2976
- ax.set_xticklabels(
2977
- coll.ddata[keyX]['data'],
2978
- rotation=rotation,
2979
- horizontalalignment='right',
2980
- verticalalignment='top',
2981
- )
2982
- else:
2983
- ax.set_xlabel(labX)
2984
-
2985
- # axes for tracesZ
2986
- axtype = 'tracesZ'
2987
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
2988
- if len(lax) == 1:
2989
- kax = lax[0]
2990
- ax = dax[kax]['handle']
2991
- ax.set_ylabel('data')
2992
- ax.set_xlabel(labZ)
2993
-
2994
- ax.set_ylim(ymin, ymax)
2995
-
2996
- # z text ticks
2997
- if zstr:
2998
- ax.set_yticks(dataZ)
2999
- ax.set_yticklabels(
3000
- coll.ddata[keyZ]['data'],
3001
- rotation=rotation,
3002
- horizontalalignment='right',
3003
- verticalalignment='top',
3004
- )
3005
- else:
3006
- ax.set_ylabel(labZ)
3007
-
3008
- # axes for tracesU
3009
- axtype = 'tracesU'
3010
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
3011
- if len(lax) == 1:
3012
- kax = lax[0]
3013
- ax = dax[kax]['handle']
3014
- ax.set_ylabel('data')
3015
- ax.set_xlabel(labU)
3016
-
3017
- ax.set_ylim(ymin, ymax)
3018
-
3019
- # z text ticks
3020
- if zstr:
3021
- ax.set_yticks(dataU)
3022
- ax.set_yticklabels(
3023
- coll.ddata[keyU]['data'],
3024
- rotation=rotation,
3025
- horizontalalignment='right',
3026
- verticalalignment='top',
3027
- )
3028
- else:
3029
- ax.set_ylabel(labU)
3030
-
3031
- # axes for text
3032
- axtype = 'textX'
3033
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
3034
- if len(lax) == 1:
3035
- kax = lax[0]
3036
- ax = dax[kax]['handle']
3037
- ax.set_xticks([])
3038
- ax.set_yticks([])
3039
-
3040
- axtype = 'textY'
3041
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
3042
- if len(lax) == 1:
3043
- kax = lax[0]
3044
- ax = dax[kax]['handle']
3045
- ax.set_xticks([])
3046
- ax.set_yticks([])
3047
-
3048
- axtype = 'textZ'
3049
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
3050
- if len(lax) == 1:
3051
- kax = lax[0]
3052
- ax = dax[kax]['handle']
3053
- ax.set_xticks([])
3054
- ax.set_yticks([])
3055
-
3056
- axtype = 'textU'
3057
- lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
3058
- if len(lax) == 1:
3059
- kax = lax[0]
3060
- ax = dax[kax]['handle']
3061
- ax.set_xticks([])
3062
- ax.set_yticks([])
3063
-
3064
- return dax
909
+ return dk, key, lab