@@ -550,6 +550,95 @@ def _obj_key(d0=None, short=None, key=None, ndigits=None):
550550 )
551551
552552
553+ # #############################################################################
554+ # #############################################################################
555+ # Utilities for plotting
556+ # #############################################################################
557+
558+
559+ def _check_all_broadcastable (** kwdargs ):
560+
561+ # -------------------
562+ # Preliminary check
563+ # -------------------
564+
565+ dout = {}
566+ dfail = {}
567+ for k0 , v0 in kwdargs .items ():
568+ try :
569+ dout [k0 ] = np .atleast_1d (v0 )
570+ except Exception as err :
571+ dfail [k0 ] = f"Not convertible to np.ndarray! - { v0 } "
572+
573+ # Raise Exception
574+ if len (dfail ) > 0 :
575+ lstr = [f"\t - { k0 } : { v0 } " for k0 , v0 in dfail .items ()]
576+ msg = (
577+ "The following kwdargs are non-conform:\n "
578+ + "\n " .join (lstr )
579+ )
580+ raise Exception (msg )
581+
582+ # -------------------
583+ # check ndim
584+ # -------------------
585+
586+ dndim = {k0 : v0 .ndim for k0 , v0 in dout .items () if v0 .shape != (1 ,)}
587+ lndim = list (set (dndim .values ()))
588+
589+ if len (lndim ) == 0 :
590+ # all scalar
591+ return {k0 : v0 [0 ] for k0 , v0 in dout .items ()}, None
592+
593+ elif len (lndim ) == 1 :
594+ ndim = lndim [0 ]
595+
596+ else :
597+ lstr = [f"-t { k0 } : { v0 } " for k0 , v0 in dndim .items ()]
598+ msg = (
599+ "Some keyword args have non-compatible dimensions:\n "
600+ + "\n " .join (lstr )
601+ )
602+ raise Exception (msg )
603+
604+ # -------------------
605+ # check shapes
606+ # -------------------
607+
608+ dfail = {}
609+ shapef = np .ones ((ndim ,), dtype = int )
610+ for k0 , v0 in dout .items ():
611+
612+ if v0 .shape == (1 ,):
613+ dout [k0 ] = v0 [0 ]
614+ continue
615+
616+ for ii in range (ndim ):
617+ if v0 .shape [ii ] == 1 :
618+ pass
619+ elif shapef [ii ] == 1 :
620+ shapef [ii ] = v0 .shape [ii ]
621+ elif v0 .shape [ii ] == shapef [ii ]:
622+ pass
623+ else :
624+ dfail [k0 ] = f"Non-compatible shape = { v0 .shape } (ii = { ii } )"
625+ continue
626+
627+ shapef = tuple (shapef )
628+
629+ # raise Exception if needed
630+ if len (dfail ) > 0 :
631+ lstr = [f"\t - { k0 } : { v0 } " for k0 , v0 in dfail .items ()]
632+ msg = (
633+ "The following keywords args have non-compatible shape:\n "
634+ + "\n " .join (lstr )
635+ + f"\n Reference shape: { shapef } \n "
636+ )
637+ raise Exception (msg )
638+
639+ return dout , shapef
640+
641+
553642# #############################################################################
554643# #############################################################################
555644# Utilities for plotting
@@ -929,4 +1018,4 @@ def _check_cmap_vminvmax(data=None, cmap=None, vmin=None, vmax=None):
9291018 else :
9301019 vmax = nanmax
9311020
932- return cmap , vmin , vmax
1021+ return cmap , vmin , vmax
0 commit comments