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.
@@ -0,0 +1,786 @@
1
+ # coding utf-8
2
+
3
+
4
+ # Common
5
+ import numpy as np
6
+ import matplotlib.pyplot as plt
7
+ from matplotlib import gridspec
8
+
9
+
10
+ # library-specific
11
+ from . import _generic_check
12
+ from . import _class1_compute
13
+ from . import _plot_text
14
+
15
+
16
+ # #############################################################
17
+ # #############################################################
18
+ # Main
19
+ # #############################################################
20
+
21
+
22
+ def main(
23
+ # parameters
24
+ coll=None,
25
+ key=None,
26
+ lab=None,
27
+ dkeys=None,
28
+ dscale=None,
29
+ dvminmax=None,
30
+ ind=None,
31
+ cmap=None,
32
+ aspect=None,
33
+ nmax=None,
34
+ color_dict=None,
35
+ lkeys=None,
36
+ bstr_dict=None,
37
+ rotation=None,
38
+ inverty=None,
39
+ bck=None,
40
+ interp=None,
41
+ # figure-specific
42
+ dax=None,
43
+ dmargin=None,
44
+ fs=None,
45
+ dcolorbar=None,
46
+ dleg=None,
47
+ label=None,
48
+ # unused
49
+ **kwdargs,
50
+ ):
51
+
52
+ # --------------
53
+ # Prepare data
54
+ # --------------
55
+
56
+ data = coll.ddata[key]['data']
57
+ if hasattr(data, 'nnz'):
58
+ data = data.toarray()
59
+ ndim = data.ndim
60
+
61
+ # safety check
62
+ if (ndim != len(coll.ddata[key]['ref'])) or (ndim < 2 or ndim > 4):
63
+ msg = (
64
+ "Wrong ndim for plot_as_array()!\n"
65
+ f"\t- ndim: {ndim}\n"
66
+ f"\t- coll.ddata['{key}']['ref']: {coll.ddata[key]['ref']}\n"
67
+ )
68
+ raise Exception(msg)
69
+
70
+ # lorder
71
+ lorder = ['X', 'Y', 'Z', 'U']
72
+ lorder = [ss for ss in lorder if dkeys[ss]['key'] is not None]
73
+
74
+ # -----------------
75
+ # prepare slicing
76
+ # -----------------
77
+
78
+ if ndim == 2:
79
+ def sliZ2(*args):
80
+ return (slice(None), slice(None))
81
+ inds = (None,)
82
+
83
+ elif ndim >= 3:
84
+ # here slice X => slice in dim Y and vice-versa
85
+ sliZ2 = _class1_compute._get_slice(
86
+ laxis=[dkeys[ss]['axis'] for ss in lorder],
87
+ ndim=ndim,
88
+ )
89
+ inds = [ind[ii] for ii in range(2, ndim)]
90
+
91
+ # check if transpose is necessary
92
+ if dkeys['X']['axis'] < dkeys['Y']['axis']:
93
+ datatype = 'data.T'
94
+ dataplot = data[sliZ2(*inds)].T
95
+ else:
96
+ datatype = 'data'
97
+ dataplot = data[sliZ2(*inds)]
98
+
99
+ # ----------------------
100
+ # labels and data
101
+ # ----------------------
102
+
103
+ extent = (
104
+ coll.ddata[dkeys['X']['data']]['data'][0] - dkeys['X']['d2'],
105
+ coll.ddata[dkeys['X']['data']]['data'][-1] + dkeys['X']['d2'],
106
+ coll.ddata[dkeys['Y']['data']]['data'][0] - dkeys['Y']['d2'],
107
+ coll.ddata[dkeys['Y']['data']]['data'][-1] + dkeys['Y']['d2'],
108
+ )
109
+
110
+ # --------------
111
+ # plot - prepare
112
+ # --------------
113
+
114
+ if dax is None:
115
+ dax = _create_axes(
116
+ fs=fs,
117
+ dmargin=dmargin,
118
+ ndim=ndim,
119
+ )
120
+
121
+ dax = _generic_check._check_dax(dax=dax, main='matrix')
122
+
123
+ # ----------------------------------
124
+ # plot fixed parts (traces envelops)
125
+ # ----------------------------------
126
+
127
+ for ss in lorder[2:]:
128
+
129
+ if dkeys[ss]['key'] is None:
130
+ continue
131
+
132
+ axis = dkeys[ss]['axis']
133
+ axtype = f'traces{ss}'
134
+ lax = [k1 for k1, v1 in dax.items() if axtype in v1['type']]
135
+ if len(lax) == 1:
136
+ kax = lax[0]
137
+ ax = dax[kax]['handle']
138
+ dat = coll.ddata[dkeys[ss]['data']]['data']
139
+
140
+ if bck == 'lines':
141
+ shap = list(data.shape)
142
+ shap[axis] = 1
143
+ nan = np.full(shap, np.nan)
144
+ bckl = np.concatenate((data, nan), axis=axis)
145
+ bckl = np.swapaxes(bckl, axis, -1).ravel()
146
+ dat = np.tile(np.r_[dat, np.nan], int(np.prod(shap)))
147
+ ax.plot(
148
+ dat,
149
+ bckl,
150
+ c=(0.8, 0.8, 0.8),
151
+ ls='-',
152
+ lw=1.,
153
+ marker='None',
154
+ )
155
+ else:
156
+ tax = tuple([
157
+ v1['axis'] for k1, v1 in dkeys.items()
158
+ if k1 != ss and v1['key'] is not None
159
+ ])
160
+ bckenv = [
161
+ np.nanmin(data, axis=tax),
162
+ np.nanmax(data, axis=tax),
163
+ ]
164
+ ax.fill_between(
165
+ dat,
166
+ bckenv[0],
167
+ bckenv[1],
168
+ facecolor=(0.8, 0.8, 0.8, 0.8),
169
+ edgecolor='None',
170
+ )
171
+
172
+ # ----------------
173
+ # define and set dgroup
174
+ # ----------------
175
+
176
+ dgroup = {
177
+ 'X': {
178
+ 'ref': [dkeys['X']['ref']],
179
+ 'data': ['index'],
180
+ 'nmax': nmax,
181
+ },
182
+ 'Y': {
183
+ 'ref': [dkeys['Y']['ref']],
184
+ 'data': ['index'],
185
+ 'nmax': nmax,
186
+ },
187
+ }
188
+
189
+ if dkeys['Z']['key'] is not None:
190
+ dgroup['Z'] = {
191
+ 'ref': [dkeys['Z']['ref']],
192
+ 'data': ['index'],
193
+ 'nmax': 1,
194
+ }
195
+ if dkeys['U']['key'] is not None:
196
+ dgroup['U'] = {
197
+ 'ref': [dkeys['U']['ref']],
198
+ 'data': ['index'],
199
+ 'nmax': 1,
200
+ }
201
+
202
+ # -----------------
203
+ # plot mobile parts
204
+ # -----------------
205
+
206
+ # matrix
207
+ axtype = 'matrix'
208
+ lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
209
+ if len(lax) == 1:
210
+ kax = lax[0]
211
+ ax = dax[kax]['handle']
212
+ refs = tuple([
213
+ dkeys[k1]['ref'] for k1 in ['Z', 'U']
214
+ if dkeys[k1]['key'] is not None
215
+ ])
216
+
217
+ # image
218
+ im = ax.imshow(
219
+ dataplot,
220
+ extent=extent,
221
+ interpolation=interp,
222
+ origin='lower',
223
+ aspect=aspect,
224
+ cmap=cmap,
225
+ vmin=dvminmax['data']['min'],
226
+ vmax=dvminmax['data']['max'],
227
+ )
228
+
229
+ # if inverty is True:
230
+ # ax.invert_yaxis()
231
+
232
+ if ndim >= 3:
233
+ km = f'{key}_im'
234
+ coll.add_mobile(
235
+ key=km,
236
+ handle=im,
237
+ refs=(refs,),
238
+ data=key,
239
+ dtype=datatype,
240
+ axes=kax,
241
+ ind=0,
242
+ )
243
+
244
+ # ind0, ind1
245
+ for ii in range(nmax):
246
+
247
+ lh = ax.axhline(
248
+ coll.ddata[dkeys['Y']['data']]['data'][ind[1]],
249
+ c=color_dict['X'][ii],
250
+ lw=1.,
251
+ ls='-',
252
+ )
253
+
254
+ lv = ax.axvline(
255
+ coll.ddata[dkeys['X']['data']]['data'][ind[0]],
256
+ c=color_dict['Y'][ii],
257
+ lw=1.,
258
+ ls='-',
259
+ )
260
+
261
+ mi, = ax.plot(
262
+ coll.ddata[dkeys['X']['data']]['data'][ind[0]],
263
+ coll.ddata[dkeys['Y']['data']]['data'][ind[1]],
264
+ marker='s',
265
+ ms=6,
266
+ markeredgecolor=color_dict['X'][ii],
267
+ markerfacecolor='None',
268
+ )
269
+
270
+ # update coll
271
+ kh = f'{key}_h{ii:02.0f}'
272
+ kv = f'{key}_v{ii:02.0f}'
273
+ coll.add_mobile(
274
+ key=kh,
275
+ handle=lh,
276
+ refs=dkeys['Y']['ref'],
277
+ data=dkeys['Y']['data'],
278
+ dtype='ydata',
279
+ axes=kax,
280
+ ind=ii,
281
+ )
282
+ coll.add_mobile(
283
+ key=kv,
284
+ handle=lv,
285
+ refs=dkeys['X']['ref'],
286
+ data=dkeys['X']['data'],
287
+ dtype='xdata',
288
+ axes=kax,
289
+ ind=ii,
290
+ )
291
+ km = f'{key}_m{ii:02.0f}'
292
+ coll.add_mobile(
293
+ key=km,
294
+ handle=mi,
295
+ refs=[dkeys['X']['ref'], dkeys['Y']['ref']],
296
+ data=[dkeys['X']['data'], dkeys['Y']['data']],
297
+ dtype=['xdata', 'ydata'],
298
+ axes=kax,
299
+ ind=ii,
300
+ )
301
+
302
+ dax[kax].update(
303
+ refx=[dkeys['X']['ref']],
304
+ refy=[dkeys['Y']['ref']],
305
+ datax=[dkeys['X']['data']],
306
+ datay=[dkeys['Y']['data']],
307
+ )
308
+
309
+ # --------------
310
+ # slices
311
+ # --------------
312
+
313
+ lslices = [('X', 'horizontal'), ('Y', 'vertical')]
314
+ for i0, (ss, axtype) in enumerate(lslices):
315
+ lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
316
+ if len(lax) == 1:
317
+ kax = lax[0]
318
+ ax = dax[kax]['handle']
319
+ sli = dkeys[ss]['sli']
320
+ iind = i0
321
+ args = [ind[jj] for jj in range(ndim) if jj != iind]
322
+ refs = tuple([dkeys[k1]['ref'] for k1 in lorder if k1 != ss])
323
+ dat = coll.ddata[dkeys[ss]['data']]['data']
324
+
325
+ for ii in range(nmax):
326
+ if ss == 'Y':
327
+ l0, = ax.plot(
328
+ data[sli(*args)],
329
+ dat,
330
+ ls='-',
331
+ marker='.',
332
+ lw=1.,
333
+ color=color_dict[ss][ii],
334
+ label=f'ind0 = {ind[iind]}',
335
+ )
336
+ xydata = 'xdata'
337
+ km = f'{key}_vprof{ii:02.0f}'
338
+ else:
339
+ l0, = ax.plot(
340
+ dat,
341
+ data[sli(*args)],
342
+ ls='-',
343
+ marker='.',
344
+ lw=1.,
345
+ color=color_dict[ss][ii],
346
+ label=f'ind0 = {ind[iind]}',
347
+ )
348
+ xydata = 'ydata'
349
+ km = f'{key}_vhor{ii:02.0f}'
350
+
351
+ coll.add_mobile(
352
+ key=km,
353
+ handle=l0,
354
+ refs=(refs,),
355
+ data=[key],
356
+ dtype=[xydata],
357
+ group_vis=lslices[1-i0][0], # 'X' <-> 'Y'
358
+ axes=kax,
359
+ ind=ii,
360
+ )
361
+
362
+ #
363
+ axline = ax.axhline if ss == 'Y' else ax.axvline
364
+ l0 = axline(
365
+ dat[ind[iind]],
366
+ c=color_dict[lslices[1-i0][0]][ii], # 'X' <-> 'Y'
367
+ )
368
+
369
+ if ss == 'Y':
370
+ xydata = 'ydata'
371
+ km = f'{key}_lh-v{ii:02.0f}'
372
+ else:
373
+ xydata = 'xdata'
374
+ km = f'{key}_lv-h{ii:02.0f}'
375
+ coll.add_mobile(
376
+ key=km,
377
+ handle=l0,
378
+ refs=(dkeys[ss]['ref'],),
379
+ data=dkeys[ss]['data'],
380
+ dtype=xydata,
381
+ group_vis=ss,
382
+ axes=kax,
383
+ ind=ii,
384
+ )
385
+
386
+ if ss == 'Y':
387
+ dax[kax].update(
388
+ refy=[dkeys[ss]['ref']],
389
+ datay=[dkeys[ss]['data']],
390
+ )
391
+ else:
392
+ dax[kax].update(
393
+ refx=[dkeys[ss]['ref']],
394
+ datax=[dkeys[ss]['data']],
395
+ )
396
+
397
+ # -----------------
398
+ # traces Z & U
399
+ # -----------------
400
+
401
+ for i0, ss in enumerate(lorder[2:]):
402
+
403
+ if dkeys[ss]['key'] is None:
404
+ continue
405
+
406
+ axtype = f'traces{ss}'
407
+ lax = [k1 for k1, v1 in dax.items() if axtype in v1['type']]
408
+ if len(lax) == 1:
409
+
410
+ kax = lax[0]
411
+ ax = dax[kax]['handle']
412
+ dat = coll.ddata[dkeys[ss]['data']]['data']
413
+ sli = dkeys[ss]['sli']
414
+ iind = i0 + 2
415
+ args = [ind[jj] for jj in range(ndim) if jj != iind]
416
+ refs = tuple([dkeys[k1]['ref'] for k1 in lorder if k1 != ss])
417
+
418
+ # individual time traces
419
+ for ii in range(nmax):
420
+ l1, = ax.plot(
421
+ dat,
422
+ data[sli(*args)],
423
+ ls='-',
424
+ marker='None',
425
+ color=color_dict[ss][ii],
426
+ )
427
+
428
+ km = f'{key}_trace{ss}{ii:02.0f}'
429
+ coll.add_mobile(
430
+ key=km,
431
+ handle=l1,
432
+ refs=(refs,),
433
+ data=[key],
434
+ dtype=['ydata'],
435
+ group_vis=('X', 'Y'), # 'X' <-> 'Y'
436
+ axes=kax,
437
+ ind=ii,
438
+ )
439
+
440
+ # vlines for single index selection
441
+ l0 = ax.axvline(
442
+ dat[ind[iind]],
443
+ c='k',
444
+ )
445
+ km = f'{key}_lv_{ss}'
446
+ coll.add_mobile(
447
+ key=km,
448
+ handle=l0,
449
+ refs=(dkeys[ss]['ref'],),
450
+ data=dkeys[ss]['data'],
451
+ dtype='xdata',
452
+ axes=kax,
453
+ ind=0,
454
+ )
455
+
456
+ dax[kax].update(refx=[dkeys[ss]['ref']], datax=[dkeys[ss]['data']])
457
+
458
+ # ---------
459
+ # add text
460
+ # ---------
461
+
462
+ for ii, ss in enumerate(lorder):
463
+
464
+ axtype = f'text{ss}'
465
+ lax = [k1 for k1, v1 in dax.items() if axtype in v1['type']]
466
+ if len(lax) == 1:
467
+ kax = lax[0]
468
+ ax = dax[kax]['handle']
469
+
470
+ _plot_text.plot_text(
471
+ coll=coll,
472
+ kax=kax,
473
+ key=key,
474
+ ax=ax,
475
+ ref=dkeys[ss]['ref'],
476
+ group=ss,
477
+ ind=ind[ii],
478
+ lkeys=lkeys,
479
+ nmax=nmax,
480
+ color_dict=color_dict,
481
+ bstr_dict=bstr_dict,
482
+ )
483
+
484
+ # -------------------
485
+ # labeling and limits
486
+ # -------------------
487
+
488
+ if label:
489
+ _label_axes(
490
+ coll=coll,
491
+ data_lab=lab,
492
+ dax=dax,
493
+ key=key,
494
+ dkeys=dkeys,
495
+ lorder=lorder,
496
+ dvminmax=dvminmax,
497
+ inverty=inverty,
498
+ rotation=rotation,
499
+ )
500
+
501
+ return coll, dax, dgroup
502
+
503
+
504
+ # #############################################################
505
+ # #############################################################
506
+ # Create axes
507
+ # #############################################################
508
+
509
+
510
+ def _create_axes(
511
+ fs=None,
512
+ dmargin=None,
513
+ ndim=None,
514
+ ):
515
+
516
+ # ---------------
517
+ # check / prepare
518
+ # ---------------
519
+
520
+ if fs is None:
521
+ fs = (17, 9)
522
+
523
+ if dmargin is None:
524
+ dmargin = {
525
+ 'left': 0.05, 'right': 0.95,
526
+ 'bottom': 0.06, 'top': 0.90,
527
+ 'hspace': 0.5, 'wspace': 0.4,
528
+ }
529
+
530
+ dax = {}
531
+
532
+ # ---------------
533
+ # create
534
+ # ---------------
535
+
536
+ fig = plt.figure(figsize=fs)
537
+ gs = gridspec.GridSpec(ncols=7, nrows=6, **dmargin)
538
+ j0 = 0 if ndim == 2 else 2
539
+
540
+ # axes for image
541
+ ax0 = fig.add_subplot(gs[:4, j0:4], aspect='auto')
542
+ dax['matrix'] = ax0
543
+
544
+ # axes for vertical profile
545
+ ax1 = fig.add_subplot(gs[:4, 4], sharey=ax0)
546
+ dax['vertical'] = ax1
547
+
548
+ # axes for horizontal profile
549
+ ax2 = fig.add_subplot(gs[4:, j0:4], sharex=ax0)
550
+ dax['horizontal'] = ax2
551
+
552
+ # axes for tracesZ
553
+ if ndim >= 3:
554
+ ax3 = fig.add_subplot(gs[:3, :2])
555
+ dax['tracesZ'] = ax3
556
+
557
+ # axes for tracesU
558
+ if ndim >= 4:
559
+ ax4 = fig.add_subplot(gs[3:, :2])
560
+ dax['tracesU'] = ax4
561
+
562
+ # --------------
563
+ # axes for text
564
+ # --------------
565
+
566
+ if ndim == 2:
567
+ ax5 = fig.add_subplot(gs[:, 5], frameon=False)
568
+ ax6 = fig.add_subplot(gs[:, 6], frameon=False)
569
+ else:
570
+ ax5 = fig.add_subplot(gs[:3, 5], frameon=False)
571
+ ax6 = fig.add_subplot(gs[3:, 5], frameon=False)
572
+ dax['textX'] = ax5
573
+ dax['textY'] = ax6
574
+
575
+ if ndim >= 3:
576
+ ax7 = fig.add_subplot(gs[:3, 6], frameon=False)
577
+ dax['textZ'] = ax7
578
+
579
+ if ndim >= 3:
580
+ ax8 = fig.add_subplot(gs[3:, 6], frameon=False)
581
+ dax['textU'] = ax8
582
+
583
+ return dax
584
+
585
+
586
+ # #############################################################
587
+ # #############################################################
588
+ # Label axes
589
+ # #############################################################
590
+
591
+
592
+ def _label_axes(
593
+ coll=None,
594
+ data_lab=None,
595
+ dax=None,
596
+ key=None,
597
+ dkeys=None,
598
+ lorder=None,
599
+ dvminmax=None,
600
+ inverty=None,
601
+ rotation=None,
602
+ ):
603
+
604
+ # ------------
605
+ # labels: fig
606
+ # ------------
607
+
608
+ fig = list(dax.values())[0]['handle'].figure
609
+ fig.suptitle(key, size=14, fontweight='bold')
610
+
611
+ # ---------------
612
+ # labels: image
613
+ # ---------------
614
+
615
+ axtype = 'matrix'
616
+ lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
617
+ if len(lax) == 1:
618
+ kax = lax[0]
619
+ ax = dax[kax]['handle']
620
+
621
+ if inverty is True:
622
+ ax.xaxis.set_label_position('top')
623
+ ax.tick_params(
624
+ axis="x",
625
+ bottom=False, top=True,
626
+ labelbottom=False, labeltop=True,
627
+ )
628
+
629
+ # x text ticks
630
+ k0 = 'X'
631
+ if dkeys[k0]['str'] is not False:
632
+ ax.set_xticks(coll.ddata[dkeys[k0]['data']]['data'])
633
+ ax.set_xticklabels(
634
+ dkeys[k0]['str'],
635
+ rotation=rotation,
636
+ horizontalalignment='left',
637
+ verticalalignment='bottom' if inverty else 'top',
638
+ )
639
+ else:
640
+ ax.set_xlabel(dkeys[k0]['lab'], size=12, fontweight='bold')
641
+
642
+ # y text ticks
643
+ k0 = 'Y'
644
+ if dkeys[k0]['str'] is not False:
645
+ ax.set_yticks(coll.ddata[dkeys[k0]['data']]['data'])
646
+ ax.set_yticklabels(
647
+ dkeys[k0]['str'],
648
+ rotation=rotation,
649
+ horizontalalignment='left',
650
+ verticalalignment='bottom',
651
+ )
652
+ else:
653
+ ax.set_ylabel(dkeys[k0]['lab'], size=12, fontweight='bold')
654
+
655
+ dax[kax]['inverty'] = inverty
656
+
657
+ # --------------------------------
658
+ # labels: horizontal and vertical
659
+ # --------------------------------
660
+
661
+ # axes for vertical profile
662
+ axtype = 'vertical'
663
+ lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
664
+ if len(lax) == 1:
665
+ ss = 'Y'
666
+ kax = lax[0]
667
+ ax = dax[kax]['handle']
668
+ ax.set_xlabel(data_lab, size=12, fontweight='bold')
669
+ ax.set_ylabel(dkeys[ss]['lab'], size=12, fontweight='bold')
670
+
671
+ ax.yaxis.set_label_position('right')
672
+ ax.tick_params(
673
+ axis="y",
674
+ left=False, right=True,
675
+ labelleft=False, labelright=True,
676
+ )
677
+
678
+ if inverty is True:
679
+ ax.xaxis.set_label_position('top')
680
+ ax.tick_params(
681
+ axis="x",
682
+ bottom=False, top=True,
683
+ labelbottom=False, labeltop=True,
684
+ )
685
+
686
+ if np.isfinite(dvminmax[ss]['min']):
687
+ ax.set_ylim(bottom=dvminmax[ss]['min'])
688
+ if np.isfinite(dvminmax[ss]['max']):
689
+ ax.set_ylim(top=dvminmax[ss]['max'])
690
+
691
+ if np.isfinite(dvminmax['data']['min']):
692
+ ax.set_xlim(left=dvminmax['data']['min'])
693
+ if np.isfinite(dvminmax['data']['max']):
694
+ ax.set_xlim(right=dvminmax['data']['max'])
695
+
696
+ # y text ticks
697
+ if dkeys[ss]['str'] is not False:
698
+ ax.set_yticks(coll.ddata[dkeys[ss]['data']]['data'])
699
+ ax.set_yticklabels(
700
+ dkeys[ss]['str'],
701
+ rotation=rotation,
702
+ horizontalalignment='left',
703
+ verticalalignment='bottom',
704
+ )
705
+
706
+ if inverty is True:
707
+ ax.invert_yaxis()
708
+ dax[kax]['inverty'] = inverty
709
+
710
+ # axes for horizontal profile
711
+ axtype = 'horizontal'
712
+ lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
713
+ if len(lax) == 1:
714
+ ss = 'X'
715
+ kax = lax[0]
716
+ ax = dax[kax]['handle']
717
+ ax.set_ylabel(data_lab, size=12, fontweight='bold')
718
+ ax.set_xlabel(dkeys[ss]['lab'], size=12, fontweight='bold')
719
+
720
+ if np.isfinite(dvminmax[ss]['min']):
721
+ ax.set_xlim(left=dvminmax[ss]['min'])
722
+ if np.isfinite(dvminmax[ss]['max']):
723
+ ax.set_xlim(right=dvminmax[ss]['max'])
724
+
725
+ if np.isfinite(dvminmax['data']['min']):
726
+ ax.set_ylim(bottom=dvminmax['data']['min'])
727
+ if np.isfinite(dvminmax['data']['max']):
728
+ ax.set_ylim(top=dvminmax['data']['max'])
729
+
730
+ # x text ticks
731
+ if dkeys[ss]['str'] is not False:
732
+ ax.set_yticks(coll.ddata[dkeys[ss]['data']]['data'])
733
+ ax.set_xticklabels(
734
+ dkeys[ss]['str'],
735
+ rotation=rotation,
736
+ horizontalalignment='right',
737
+ verticalalignment='top',
738
+ )
739
+
740
+ # --------------
741
+ # labels: traces
742
+ # --------------
743
+
744
+ for ss in lorder[2:]:
745
+ axtype = f'traces{ss}'
746
+ lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
747
+ if len(lax) == 1:
748
+ kax = lax[0]
749
+ ax = dax[kax]['handle']
750
+ ax.set_ylabel(data_lab, size=12, fontweight='bold')
751
+ ax.set_xlabel(dkeys[ss]['lab'], size=12, fontweight='bold')
752
+
753
+ if np.isfinite(dvminmax[ss]['min']):
754
+ ax.set_xlim(left=dvminmax[ss]['min'])
755
+ if np.isfinite(dvminmax[ss]['max']):
756
+ ax.set_xlim(right=dvminmax[ss]['max'])
757
+
758
+ if np.isfinite(dvminmax['data']['min']):
759
+ ax.set_ylim(bottom=dvminmax['data']['min'])
760
+ if np.isfinite(dvminmax['data']['max']):
761
+ ax.set_ylim(top=dvminmax['data']['max'])
762
+
763
+ # z text ticks
764
+ if dkeys[ss]['str'] is not False:
765
+ ax.set_yticks(coll.ddata[dkeys[ss]['data']]['data'])
766
+ ax.set_yticklabels(
767
+ dkeys[ss]['str'],
768
+ rotation=rotation,
769
+ horizontalalignment='right',
770
+ verticalalignment='top',
771
+ )
772
+
773
+ # -------------
774
+ # labels: text
775
+ # -------------
776
+
777
+ for ss in lorder:
778
+ axtype = f'text{ss}'
779
+ lax = [k0 for k0, v0 in dax.items() if axtype in v0['type']]
780
+ if len(lax) == 1:
781
+ kax = lax[0]
782
+ ax = dax[kax]['handle']
783
+ ax.set_xticks([])
784
+ ax.set_yticks([])
785
+
786
+ return dax