
    Zft                       d Z ddlZddlZddlZddlZddlZddlZ	ddlm
ZmZmZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZmZmZ  dd
l!m"Z"m#Z# dZ$dZ%ddgZ&dZ'g dZ(dejR                  d<   d Z*dAdZ+	 	 dBdZ,g dfdZ-dCdZ.dDdZ/dEdZ0dFdZ1dGdZ2dHdZ3	 	 dId!Z4dJd"Z5i fd#Z6i g dfd$Z7i g fd%Z8g d&d'dd fd(Z9g i fd)Z:ddd*d+gfd,Z;d+ddd-d+gddd.dddd/fd0Z< e=       dfd1Z>	 	 	 dKd2Z?d3 Z@dLd4ZAdMd5ZBddd6e	j                  z  e	j                  gdfd7ZDd e=       dfd8ZEddd6e	j                  z  e	j                  gdfd9ZF	 	 dNd:ZGdGd;ZHdOd<ZI	 	 dPd=ZJ	 	 dQd>ZK	 	 	 	 dRd?ZLdOd@ZMy)SzUtilities for plotting.    N)datespyplotticker)make_axes_locatable)stats)TIMESERIES_DSET_NAMESTIMESERIES_KEY_NAMES)ColormapExt)
coordinate)networkptimereadfileutils0)draw_lalo_labeldraw_scalebarg      @      $@g      .@g       @)
z#1f77b4z#ff7f0ez#2ca02cz#d62728z#9467bdz#8c564bz#e377c2z#7f7f7fz#bcbd22z#17becf)g    _g    _Bzaxes.formatter.limitsc                 2   | j                   rt        j                  j                  | j                         rVt	        d| j                           t        j                  | j                   dt              j                  t              | _
        | j                  t        j                  | j                        j                  dd      | _
        |j                  | j                  dddf   | j                  dddf   d	
      dd | _        t        j                  | j                        j                  j                  dd      | _        | j                  t        j                  | j                        j                  dd      | _        	 |j!                  | j                  dddf   | j                  dddf   d	
      dd | _
        t        j                  | j                        j                  j                  dd      | _
        | S | S # t"        $ r Y | S w xY w)zRead pts_* optionsz$read points lat/lon from text file: )r      )usecolsdtypeN   r   r   F	print_msg)pts_fileospathisfileprintnploadtxtbytesastypefloatpts_laloarrayreshape	geo2radarpts_yxT	radar2geo
ValueError)inps	coord_objs     J/home/exouser/operations/rsmas_insar/tools/MintPy/src/mintpy/utils/plot.pyread_pts2inpsr0   6   s    }}64T]]ODE

4==%uMTTUZ[ }} /77A>))MM!Q$MM!Q$ * 
 1	
 hht{{+--55b!< {{hht{{+33B:	%//AqD!AqD! 0  q	DM
 HHT]]355==b!DDM K4K  	K	s   	A<H	 		HHc           	          ddl m} ddlm} |t	        t
        j                  d         } ||f||dddd	|}| j                  |       |j                  j                  j                   |d
d      g       |S )Nr   )AnchoredText)
withStrokezlegend.fontsize)size              ?F)locproppad	borderpadframeonw   )
foreground	linewidth)matplotlib.offsetboxr2   matplotlib.patheffectsr3   dictpltrcParams
add_artisttxt_textset_path_effects)axtitler7   r8   kwargsr2   r3   ats           r/   add_inner_titlerM   ^   sy    11|&789	e 
/4#
/'-
/B MM"FFLL!!:#J"KLI    FTc                    t        |       ddd   }|dxx   |sdnd|z   z  cc<   |dxx   |sdnd|z   z  cc<   t        t        t        |      z  t        t	        |      z  t
        |d   z        }|D 	cg c]
  }	|	|z  |z   }
}	|
D 	cg c]  }	t        |	d       }
}	|rt        d|
d    d|
d    d       |
S c c}	w c c}	w )	a?  Get auto figure size based on input data shape
    Adjust if display colobar on the right and/or slider on the bottom

    Parameters: ds_shape          - tuple/list of 2 int for the 2D matrix shape in [length, width]
                scale             - floag, scale the final figure size
                disp_cbar/slider  - bool, plot colorbar on the right / slider on the bottom
                cbar/slider_ratio - float, size ratio of the additional colobar / slider
    Returns:    figsize           - list of 2 float for the figure size in [width, length] in inches
    Nr   r   r   .1fzfigure size : [, ])listminmin_figsize_singlemax_figsize_singlemaxmax_figsize_heightr$   r   )ds_shapescale	disp_cbardisp_slider
cbar_ratioslider_ratior   	fig_shape	fig_scalexfig_sizes              r/   auto_figure_sizerc   k   s     Xtt$IaLYAA
N:LaL[Aa,.>>L S^+S^+Yq\)I 099!I%9H9+34a3!4H4}Bx{m1=>O :4s   5B<
Cc                    |sg }t        |t              r|g}t        j                  j	                  t        j                  j                  |             \  }}t        j                  |       }|d   }t        |d         t        |d         z  }|dk(  r]t        |      dk(  r|d   }d| v r|dz  }n|d   j                  d	      d   }|j                         j                  d
      r|dz  }n|t        v rt        |      dk(  rd|j                         v r|d   }	nd|j                         v r|d   }	nd}	|	s|d   }n
|	 d|d    }d| v rvt        j                  j                  |       j                  d      d   j                  |      d   }
|
r0||
j                  d      r|
nd|
 z  }n|dk(  r.t        |      dk(  r|d   }n|d   j                  d      rd}n|}n|dv rt        t        j                  |             }|dkD  r^t        |      dk(  rPt        j                  j                  |       j!                  dd      }t        |      dkD  r|d   dz   nd}||d   z   }n[|}nXt        j                  j                  |       }t        |j#                  dd            }|dkD  rt        |      dk(  r|d|d    z  }|j#                  dd      r$|d   }|d   |d   z
  |d   |d   z
  z  |k  r|dz  }|j#                  dd      r|dz  }|j#                  dd t$        j&                  z  t$        j&                  g      }|d   |d   z
  }|dt$        j&                  z  k7  r'|t        |      k(  rt        |      }|t        |      z  }|S )!am  Get auto figure title from meta dict and input options
    Parameters: fname : str, input file name
                datasetNames : list of str, optional, dataset to read for multi dataset/group files
                inps_dict : dict, optional, processing attributes, including:
                    ref_date
                    pix_box
                    wrap
    Returns:    fig_title : str, output figure title
    Example:    'geo_velocity.h5' = auto_figure_title('geo_velocity.h5', None, vars(inps))
                '101020-110220_ERA5_ramp_demErr' = auto_figure_title('timeseries_ERA5_ramp_demErr.h5', '110220')
    	FILE_TYPEWIDTHLENGTHifgramStackr   r   unwCor_unwCor-ion_ionref_dateREF_DATEN_
timeseriesgeometrybperp)z.h5z.he5 BANDS1 - pix_boxr   r=   _subwrapF_wrap
wrap_range      )
isinstancestrr   r   splitextbasenamer   read_attributeintlensplitlower
startswithr	   keysget_dataset_listrsplitgetr    pi)fnamedatasetNames	inps_dictfbasefextatrk	num_pixel	fig_titlern   proc_suffixnum_dsetfpartssuffixnum_bandboxr|   s                    r/   auto_figure_titler      s    ,$$~''""277#3#3E#:;KE4

!
!%
(CKACL!CH$66IM|!$QI5 Y&	$Q--c215I{{}''.V#		
"	"s<'8A'=)) ,H388:%:HH$QI#*Al1o%67I 5 ''**5177EaHNNtTUVWKK,B,B3,G[qQ\P]M^^		
j|!$QI!_''0II		x0078a<C-2 WW%%e,33C;F(+FaVAY_RFa0I I GG$$U+	swww,-a<C-23|A/00I }}Y%	"FSVOAQ09<I }}VU#W	]]<#bee)RUU1CD
]Z]2
255 S_, _
Z(IrN   c                 N   d}d}d| j                         vrdd| j                         v rRdj                  | d         }| d   j                         j                  d      rd}|dz  }nd}|dz  }|rt	        |       |&|r|j                          |r|j                          |S ||fS )	zTCheck flip left-right and up-down based on attribute dict, for radar-coded file onlyFY_FIRSTORBIT_DIRECTIONz{} orbitaTz -> flip up-downz -> flip left-right)r   formatr   r   r   invert_xaxisinvert_yaxis)metadatarI   r   flip_lrflip_udmsgs         r/   auto_flip_directionr      s     GG ',=,P): ;<%&,,.99#>G%%CG((C#J	~OOOO	GrN   c                 &   | d   | d   z
  | d   | d   z
  z  |z  }|dkD  rd}nB|dkD  rd}n:|d	kD  rd
}n2|dkD  rd}n*|dkD  rd}n"|dkD  rd}n|dkD  rd}n|dkD  rd}n
|dkD  rd}nd}| d   | d   z
  | d   | d   z
  z  dk  rd}|dk  r|t        j                  d|z        z  }n!|dk  rn|t        j                  |dz        z  }t        t        j                  |            }|dkD  r+|r)t	        d|d       t	        dj                  |             |S )a^  Calculate the default/auto multilook number based on the input 3D shape.
    Parameters: box           - tuple of 4 int in (x0, y0, x1, y1) for the spatial bounding box
                num_time      - int, the 3rd / time dimension size
                max_memory    - float, max memory in GB
    Returns:    multilook_num - int, multilook number
    r   r   r=   r   g    B    g    eA   g    A   g    *uA   g    A   g    *uA   g    A   g    *uAg    Ai          @      @ztotal number of pixels: z.1EzL* multilook {0} by {0} with nearest interpolation for display to save memory)r    sqrtr   ceilr   r   )r   num_time
max_memoryr   r   multilook_nums         r/   auto_multilook_numr   
  s]    Q#a&SVc!f_5@I 
h	"-	h	"-	h	"-	h	"-	w	!-	w	!-	v	!-	v	!-	v	!-23- 	AQCFSVO,	9 Sz!122	s	 	c!122./M qY(389\ccdqrsrN   r   c                    t        t        j                  t        |       t        |      z              }t        |d         t        |d         z  }|d   |d   z  |z  }t	        t        j
                  ||z        d      }t	        t        j
                  ||z        d      }|dk(  r|}n|dk(  r|}t        j                  |      t        j                  |      z  |k  rE|dz  |dz  kD  r|dz  }n|dz  }t        j                  |      t        j                  |      z  |k  rEt        t        j                  |            }t        t        j                  |            }||fS )a"  Get optimal row and column number given figure size number of subplots
    Parameters: subplot_num : int, total number of subplots
                data_shape : list of 2 float, data size in pixel in row and column direction of each plot
                fig_size : list of 2 float, figure window size in inches
                fig_num : int, number of figure windows, optional, default = 1.
    Returns:    row_num : number of subplots in row    direction per figure
                col_num : number of subplots in column direction per figure
    r   r         ?r6   )r   r    r   r$   rW   r   rint)	subplot_num
data_shaperb   fig_numsubplot_num_per_figdata_shape_ratio	num_ratiorow_numcol_nums	            r/   auto_row_col_numr   :  s@    bggeK&85>&IJKZ]+eJqM.BBhqk),<<I"''-	9:B?G"''-	9:B?G"}%	B%
'''
RWWW-
-0C
CQ;1$sNGsNG	 '''
RWWW-
-0C
C "'''"#G"'''"#GGrN   c                 p   | j                   \  }}t        j                  ||dgt              }|d   |ddddf<   |d   |ddddf<   |d   |ddddf<   |d   |ddddf<   |rRt	        |j                               }g }t        |      D ])  }t        |      D ]  }|j                  ||   |           + |S )	ai  Return the auto lat/lon label location of subplots
    Parameters: axs : 2D np.ndarray of matplotlib.axes._subplots.AxesSubplot object
                loc : tuple of 4 bool, for (left, right, top, bottom)
                flatten : bool, return variable in 2D np.ndarray or in list of flattened array
    Returns:    locs : 2D np.ndarray of tuple of 4 bool.
    r   r   r   Nr   r   r   r=   )shaper    zerosr   rS   tolistrangeappend)	axsr7   flattennrowsncolslocsloc_listijs	            r/   auto_shared_lalo_locationr   Z  s     99LE588UE1%S1DFD!Qq&MFD!Bq&MFD!Qq&MFDQqM&u 	,A5\ ,HQKN+,	, KrN   c                     |s`| d   t        |      j                  d      d   g}| d   dk(  r| d   j                  d      r|dgz  }g dt        fd	|D              rd
nd}|rt	        d|       |S )z7Get auto/default colormap name based on input metadata.re   rk   r   rq   	DATA_TYPEcomplex.slc)		coherencetemporalCoherence	waterMask
shadowMask.corz.mlir   z.ampz.rampc              3   &   K   | ]  }|v  
 y wN ).0r   gray_ds_namess     r/   	<genexpr>z%auto_colormap_name.<locals>.<genexpr>~  s     !G!}"4!Gs   grayjetz	colormap:)r   r   r   anyr   )r   	cmap_namedatasetNamer   ds_namesr   s        @r/   auto_colormap_namer   q  s     [)3{+;+A+A#+Fq+IJK L0Xk5J5U5UV_5` H
 "!Gh!GGFU	k9%rN   c                    t        j                  | t        j                  |        t        j                  |       z           }t        j                  |      j                  t              }t        j                  |      j                  t              }||k(  r
d}||g}d }nt        j                  t        j                  t        j                  |                  j                  t              }	t        ||z
  |	z  dz         }
|
|k  r:|
}||	dz  z
  ||	dz  z   g}|r2d|j                   d| d}|dz  }t        |       nt	        | j                  dd        dk\  r|dkD  rd	d
lm}  || ||      }nt        j                   |       }d}t        j"                  |      t        j$                  |      g}d }t        |d	   t         j&                  z         t         j&                  z  dk\  r|d	   nt         j&                  dz  |d	<   t        |d   t         j&                  z
        t         j&                  z  dk\  r|d   nt         j&                  |d<   |||fS )N   r   r   z%data has uniform and limited number (z <= )z) of unique values --> discretize colormapd   r   )multilook_dataMbP?r   )r    uniqueisnanisfiniterT   r#   r$   rW   absdiffr   r4   r   r   mintpy.multilookr   r&   nanminnanmaxr   )datanum_multilookmax_discrete_num_stepr   unique_valuesmin_valmax_valcmap_lutvlimvstepmin_num_stepr   r   data_mlis                 r/   'auto_adjust_colormap_lut_and_disp_limitr    s    IIdBHHTN?R[[5F#FGHMff]#**51Gff]#**51G'! rvvbggm456==eDGg-6:; 00#HeAg%wq'89D=m>P>P=QQUVkUllmnBBc
 4::ab>"c)ma.?;)$}M88D>HIIh'8)<=D M "%T!Wruu_!5!=!Fd1gBEETVJDG!$T!Wruu_!5!=!Fd1gBEEDGT=((rN   r   皙?c           	         t        |d   t        j                        r:|D cg c]/  }|j                  |j	                         j
                  dz
  dz  z   1 }}||d   |z
  }|d   |z   dz   }t        |      }	t        ||	z
  dz        }
t        |      }t        ||z
  dz        }|
dkD  r|	dz  }	d}
|dkD  r|dz  }d}|
dk  r|	dz  }	d}
|dk  r|dz  }d}t        j                  |	|
ddd      }t        j                  ||ddd      }n&t        j                  | j                               \  }}| j                  ||       |s| j                         }| j                         j                  |j                  j                               }d	|j                   z  }t#        dt%        j&                  |||z
  j(                  z  dz  d
z        j+                  t                    }|s|dk  rd}n|dk  rd}n
|dk  rd}nd}t        j,                  d      | _        | j0                  j3                  t        j4                  |             | j0                  j7                  t        j,                  d             |r9| j0                  j9                  t        j:                  t=        dd|                   | j?                  |       | ||fS c c}w )aM  Adjust X axis
    Parameters: ax          - matplotlib figure axes object
                datevector  - list of float, date in years
                              i.e. [2007.013698630137, 2007.521917808219, 2007.6463470319634]
                              OR list of datetime.datetime objects
                every_year  - int, number of years per major locator
                buffer_year - float in years, None for keep the original xlim range.
    Returns:    ax          - matplotlib figure axes object
                xmin/max    - datetime.datetime object, X-axis min/max value
    r   r        v@Nr   皙?      (@r   g@   r=   r   z%Y-%m-%d %H:%M:%Sz%Y   	labelsize) r~   dtdatetimeyear	timetupletm_ydayr   mdatesnum2dateget_xlimset_xlim
get_figureget_window_extenttransformeddpi_scale_transinvertedwidthrW   r    r   daysr#   DateFormatter	fmt_xdataxaxisset_major_locatorYearLocatorset_major_formatterset_minor_locatorMonthLocatorr   tick_params)rI   
datevectorfontsize
every_yearbuffer_yearevery_monthr   t0t1y0m0y1m1xminxmaxfigbboxrZ   s                     r/   auto_adjust_xaxis_dater6    s    *Q--MWXaff 5 5 9VCCX
X ]k)^k)C/WCbD 01rWCbD 01r7bAgba7bAgba6bAgbb6bAgbb{{2r1a+{{2r1a+r{{}5tKKd mmo##%11#2E2E2N2N2PQdjj BGGETD[,>,>$>$G!$KLSSTWXY
1_a1_a2a.2 ''(;<BLHHv11*=>HH  !5!5d!;<
""6#6#6uQr+7N#OP NNXN&tT>W Ys   4Kc                     t        j                  t        j                  |            rt        d      t        j                  |      }t        j
                  |      }||z
  }||n|d|z  z
  }||n|d|z  z   }| j                  ||g       | S )a:  Adjust Y axis lower/upper limit.

    Parameters: ax        - matplotlib figure axes object
                data_list - list(float), Y-axis values
                fontsize  - float, font size
                ymin/max  - float, lower/upper Y-axis limit
    Returns:    ax        - matplotlib figure axes object
    z/All NaN values detected in the input data_list!r  )r    allr   r,   r   r   set_ylim)rI   	data_listr(  yminymaxdmindmaxdranges           r/   auto_adjust_yaxisr@    s     
vvbhhy!"JKK 99YD99YDD[F#4f)<D#4f)<DKKt IrN   c           
         d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d	|j                         vrd|d	<   d
|j                         vrd|d
<   d|j                         vrd|d<   d|j                         vrddg|d<   t        j                  |      }|D cg c]  }|j                  d      d    }}|D cg c]  }|j                  d      d    }}t	        t        j
                  t        t        ||z                           }t        j                  |      \  }}	t        j                  t        j                  |      j                               dz  dz  }
|D cg c]
  }||
dz  z
   }}t        j                  ||      }| j!                  |t        j"                  |d      |
j$                  dj'                  |d                | j!                  |t        j(                  |d      |
j$                  dj'                  |d                |d
   r#| j+                  dj'                  |d                t-        | |	|d   |d         d   } | j/                  |d   d   |d   d   g       | j1                  |d   |d          | j3                  d       | j5                  dd |d   dddd!       | S c c}w c c}w c c}w )"z:Plot min/max Coherence of all interferograms for each dateds_name	Coherencer(  r   r?   r   markercolororange
markersize
disp_titleTr)  r   r   r  r   rp   r   r=   r   axiszMax {}labelzMin {}z({} History: Min/Max of All Related Pairsr(  r)  
cbar_labelr(  best)r7   bothinwhich	directionr  bottomtopleftright)r   r   yyyymmdd_date12r   sortedyyyymmddrS   setdate_list2vectorut0most_commonr    r   r   pnetcoherence_matrixbarr   r  r   r   	set_titler6  r9  
set_ylabellegendr&  )rI   
date12ListcohListp_dictdate12m_datess_datesdateListr   r'  	bar_widthr   x_listcoh_mats                 r/   plot_coherence_historyrp    s    FKKM)[VI->FKKM)RVJ-?FKKM)QVK-@FKKM)XVM-BFKKM)RVL-AFKKM)TVL-AFKKM)QVL-AFKKM)c3ZVF^ &&z2J2<=v||C #=G=2<=v||C #=G=ennT#g.?*@%ABCH..x8E: 5 5 78:1<I%*+a	!m+F+##J8GFF6299W1-y~~X__U[\eUfEgFhFF6299W1-y~~X__U[\eUfEgFh l
?FFviGXYZ	J
9K+1,+?
AAB
DBKK"F6N1$567MM&&
1CMDII&INN46*;MDt4  A I3 >=
 ,s   K75K<Lc                 b   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd	|d<   d
|j                         vrd	|d
<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrddg|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd	|d<   t        |d   t              rt        |d         j                  }nJt        |d   t
        j                  j                        r|d   }nt        dj                  |d               |d   }d}	t        j                  t        |            }t        j                  |      \  }
}t        j                  |      d    }t        j                  |      }t!        |      }t#        j$                  |      }t#        j$                  |      }t'        |      D ]W  }||   j)                  d!      \  }}|j+                  |      }|j+                  |      }||   ||   z
  ||<   ||   ||   z
  ||<   Y |rXt-        d"t#        j.                  t#        j0                  |            d#d$       t-        d%t#        j.                  |       d&       t        t3        t5        |      t5        |      z
              }|sd'|d<   |D cg c]  }|j)                  d!      d     }}|D cg c]  }|j)                  d!      d    }}t        j                  t        t3        t5        ||z                           }t        t3        t5        |      t5        |      z
              }|D cg c]  }|j+                  |       }}|D cg c]  }|j+                  |       }}|Kt7        |      }t/        |      }|d   d    }|d   d   }|r8t-        d(       t-        d)||g        t-        d*j                  |d                |d   rt9        |       j;                  d+|d   |d   ,      } t
        j                  j=                  ||-      }!t
        j>                  jA                  | ||!.      }"|"jB                  jE                  |d   /       |"jG                  |d   |d   0       |D cg c]  }||j+                  |          }#}t        tI        |#|            D $%cg c]  \  }$}%|%	 }}$}%|rA|D cg c]  }|
|   	 }&}|D cg c]  }||   	 }'}| jK                  |&|'d1d|d   |d   2       |r>|D cg c]  }|
|   	 }&}|D cg c]  }||   	 }'}| jK                  |&|'d1d|d   d32       |d   r|D ]  }(|(j)                  d!      \  })}*|j+                  |)      }+|j+                  |*      },t#        jL                  |
|+   |
|,   g      }%t#        jL                  ||+   ||,   g      }-|@||j+                  |(         }.|.z
  |z
  z  }/| jK                  |%|-d4|d   |	 ||/      5       | jK                  |%|-d4|d   |	d65        |D ]  }(|(j)                  d!      \  })}*|j+                  |)      }+|j+                  |*      },t#        jL                  |
|+   |
|,   g      }%t#        jL                  ||+   ||,   g      }-|@||j+                  |(         }.|.z
  |z
  z  }/| jK                  |%|-d7|d   |	 ||/      5       | jK                  |%|-d7|d   |	d65        |d   r| jO                  d8|d   0       tQ        | ||d   |d   9      d    } tS        | ||d   0      } | jU                  |d
   |d   0       | jW                  |d   |d   0       | jE                  d:d;|d   dddd<       |d   | jY                  |d   d=d6d>|d   ?       |d   ra|d   r\t
        jZ                  j]                  g g d6d@dAB      }0t
        jZ                  j]                  g g d6dCdDB      }1| j_                  |0|1gE       | S c c}w c c}w c c}w c c}w c c}w c c}%}$w c c}w c c}w c c}w c c}w )Fa  Plot Temporal-Perp baseline Network
    Parameters: ax         - matplotlib axes object
                date12List - list(str) for date12 in YYYYMMDD_YYYYMMDD format
                dateList   - list(str), for date in YYYYMMDD format
                pbaseList  - list(float), perp baseline, len=number of acquisition
                p_dict     - dictionary with the following items:
                                fontsize
                                linewidth
                                markercolor
                                markersize
                cohList    - list(float), coherence value of each interferogram, len = number of ifgrams
                colormap   - str, colormap name
                disp_title - bool, show figure title or not, default: True
                disp_drop  - bool, show dropped interferograms or not, default: True
    Returns:    ax         - matplotlib axes object
    r(  r   r?   r   rD  rE  rF  rg  NxlabelylabelzPerp Baseline [m]rM  zAverage Spatial Coherence	cbar_size3%r[   TcolormapRdBur   r  r   rG  	disp_dropdisp_legendr)  r   numberunrecognized colormap input: {}ffffff?r   rp   zmax perpendicular baseline: .2fz mzmax temporal      baseline: z daysFzshowing coherencezdata range: zdisplay range: {}rX  r9   )vminvmax)cmapnormr  rN  koalphamsmfcr   --)lwr  cr   rk   zInterferogram NetworkrL  rP  rQ  rR  )gQ?gq=
ףp?zaxes fractionxycolorxycoordsr(  solidzIfgram used)r  lsrK  dashedzIfgram dropped)handles)0r   r~   r   r
   rv  mplcolorsLinearSegmentedColormapr,   r   r   r[  rZ  r]  date_list2tbaserY  r   r    r   r   r   indexr   rW   r   rS   r\  rT   r   append_axes	NormalizecolorbarColorbarBaserI   r&  	set_labelzipplotr&   rc  r6  r@  
set_xlabelrd  annotatelinesLine2Dre  )2rI   rf  rl  	pbaseListrh  date12List_dropr   r  rg  transparencyr   r'  	tbaseList
ifgram_numpbase12tbase12r   m_dates_datem_idxs_idxdate12List_keeprj  rk  dateList_keepdateList_dropidx_date_keepidx_date_dropdata_mindata_maxdisp_mindisp_maxcaxr  cbarcohList_keeprp   ra   rn  y_listri  date1date2idx1idx2yvalval_norm
solid_line	dash_lines2                                                     r/   plot_networkr  8  s`	   & FKKM)BF:,>FKKM)AF;,?FKKM)HF=,AFKKM)BF<,@ FKKM)DF9,=FKKM)DF8,<FKKM)DWF8,<FKKM)D_F<,@FKKM)DF;,?FKKM)DF;,?FKKM)FF:,>FKKM)S#JF6NFKKM)DF<,@FKKM)DF;,?FKKM)DF=,AFKKM)AF<,@FKKM)DF8,< &$c*6*-.77	F:&

(J(J	Kj!:AA&BTUVVYGL ~~fX./H..x8E:%%h/2I &&z2JZJhhz"Ghhz"G: 9#A,,S1v&v&u%	%(88
u%	%(88
9 ,RVVBFF7O-DS,ILM,RVVG_,=UCD T#j/C4H"HIJO#{ )881qwws|A8G8(781qwws|A8G8NN6$s7W3D/E*F#GHM4HM0B BCDM0=>1X^^A&>M>0=>1X^^A&>M> w<w<&>!$&>!$%&L(H!5 678%,,VF^<=+%b)55gvk?RX^_jXk5lC::''XH'ED<<,,St$,GDGG&*<=NN6,/&:LNM ?NN
 0 0 34NN)/L/0R)STA1TT $12q%(22(561)A,66
CF<4HfUbNcd$12q%(22(561)A,66
CF<4HfU k% 	WF!<<,LE5>>%(D>>%(D%+uT{34A)D/9T?;<A"j..v67(Nx(/BC1dvk':,RVW_R`a1dvk':,RUV	W " R||C(u~~e$~~e$HHeDk5;/0HHioy78***623Ch8h+>?HGGAq#&"5\TRZ^G\GGAq#&"5\SGQR l
,vj7IJ 
 J
9K+1,+?
AAB
DB	2y6*3E	FBMM&"VJ-?M@MM&"VJ-?M@NN46*;MDt4  A h#
F8$S,vj7I 	 	K kvm4YY%%b"CGM%Z
YY%%b"CHL\%]	
		:y1	2Iw 98 ?>* OT 36 36s<   c>3d0dd2d'd<dd"?d'd,c           
         d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd	|d<   d
|j                         vrd|d
<   d}t        j                  |      }t        j                  |      \  }}t	        t        t        |                  }g }	|D ]5  }
|j                  |
      }|j                  |       |	j                  |       7 |rE|D 
cg c]  }
||
   	 }}
|D 
cg c]  }
||
   	 }}
| j                  ||d||d   |d   |d          |	r>|	D 
cg c]  }
||
   	 }}
|	D 
cg c]  }
||
   	 }}
| j                  ||d||d   d       |d   r| j                  d|d          t        | ||d   |d
         d   } t        | ||d         } | j                  d|d          | S c c}
w c c}
w c c}
w c c}
w )a`   Plot Perpendicular Spatial Baseline History
    Parameters: ax            - matplotlib axes object
                dateList      - list(str), date in YYYYMMDD format
                pbaseList     - list(float), perp baseline
                p_dict        - dictionary with the following items:
                                   fontsize
                                   linewidth
                                   markercolor
                                   markersize
                                   disp_title : bool, show figure title or not, default: True
                                   every_year : int, number of years for the major tick on xaxis
                dateList_drop - list(str), date dropped in YYYYMMDD format
                                e.g. ['20080711', '20081011']
    Returns:    ax            - matplotlib axes object
    r(  r   r?   r   rD  rE  rF  rG  Tr)  r   r|  z-ko)r  r  r  r  r  r   r  zPerpendicular Baseline HistoryrN  rL  r   zPerpendicular Baseline [m])r   r   r[  r]  rS   r   r   r  remover   r  rc  r6  r@  rd  )rI   rl  r  rh  r  r  r   r'  idx_keepidx_dropr   idxrn  r  s                 r/   plot_perp_baseline_histr    sG   " FKKM)RVJ-?FKKM)QVK-@FKKM)XVM-BFKKM)RVL-AFKKM)TVL-AFKKM)QVL-AL ~~h'H..x8E: E#h-()HH nnQ $,-q%(--(011)A,11
\f[>Q,'VM-B 	 	D $,-q%(--(011)A,11
L,'V 	 	5 l
5z@RS 
 J
9K+1,+?
AAB
DB	2y6*3E	FBMM.
9KMLI- .1 .1s   G6+G; H 2Hg     Frw  c                    t        |t              rt        |      j                  }n3t        |t        j
                  j                        rnt        d|       t        j                  ||      }|r|D 	cg c]  }	|	j                  d      d    }
}	|D 	cg c]  }	|	j                  d      d    }}	t        t        t        |
|z                     |D ]4  }fd|j                  d      D        \  }}t        j                  |||f<   6 |j                   d   }t        j"                  t        j$                  |             \  }}t        j&                  t        j(                  ||z
              }t        j*                  t        j,                  |            }t        j                  ||dk(  <   | j/                  |ddd	      }|j1                  t        j2                  j5                         j7                  |      | j8                  z          | j/                  ||d|
      }|j1                  t        j2                  j5                         j7                  |      | j8                  z          t        j:                  |dz  dz        dz   }| j=                  dt        j:                  |dz  dz        dz
         |r| j?                  d|       n| j?                  d|z  |       | jA                         jC                  g        | jE                         jC                  g        | jG                  d       | |fS c c}	w c c}	w )zSPlot Rotated Coherence Matrix, suitable for Sentinel-1 data with sequential networkzunrecognized colormap input: rp   r   r   c              3   @   K   | ]  }j                  |        y wr   r  )r   r   	date_lists     r/   r   z4plot_rotate_diag_coherence_matrix.<locals>.<genexpr>9  s     H)//!,H   r5   gray_rr   )r  r  r  )r  r  r  r   r   ?r   r|  r}   off)$r~   r   r
   rv  r  r  r  r,   r`  ra  r   rZ  rS   r\  r    nanr   wherer   rW   r   diagonesimshowset_transform
transformsAffine2D
rotate_deg	transDatar   r  r9  	get_xaxis	set_ticks	get_yaxisrI  )rI   coh_listdate12_listdate12_list_dropr  r  	disp_halfr  ro  r   rj  rk  ri  r  r  num_imgnum_conndiag_matimr<  r  s                       @r/   !plot_rotate_diag_coherence_matrixr  &  s    $4 ))	D#**<<	=8?@@ ##K:G,78q1773<?88,78q1773<?884Gg$5 678	& 	)FHfll36GHJD$"$&&GD$J	)
 mmAG288G,,-JD$vvbffTD[)*H wwrwww'(H!vvHX^	8(3	?BS^^,,.99*ETU	7	=BS^^,,.99*ETU 778Q;#$s*DKKBGGGQJN+C/0
At
CHd#LLNR LLNR GGENr6M? 98s   7L7L<c           	      	   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d	|j                         vrd|d	<   d
|j                         vrd|d
<   d|j                         vrdj                  |d         |d<   d|j                         vrd|d<   d|j                         vr|d   |d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   d|j                         vrd|d<   t        |d   t              rt	        |d         j
                  }nJt        |d   t        j                  j                        r|d   }nt        dj                  |d               t        j                  |      }t        j                  ||      }|r|D cg c]  }|j                  d      d    }}|D cg c]  }|j                  d      d    }	}t        t!        t#        ||	z                     |D ]4  }
fd|
j                  d      D        \  }}t$        j&                  |||f<   6 t%        j(                  t%        j*                  |j,                  d               }t$        j&                  ||dk(  <   | j/                  |dddd       }| j/                  |||d   d   |d   d   d       }|j,                  d   }|d!k  rd"}n|d#k  rd$}n
|d%k  rd&}nd!}t!        t1        d||            }| j3                         j5                  |       | j7                         j5                  |       | j9                  d'|d   (       | j;                  d'|d   (       | j=                  d)d*|d   dddd+       |d
   r| j?                  |d          |d   rOtA        |       }|jC                  d,d-d-.      }tE        jF                  ||/      }|jI                  |d   |d   (       |rC|d   r>| jK                  g g d01       | jK                  g g d21       | jM                  |d   d3       | ||fS c c}w c c}w )4a  Plot Coherence Matrix of input network
    if date12List_drop is not empty, plot KEPT pairs in the upper triangle and
                                          ALL  pairs in the lower triangle.
    Parameters: ax : matplotlib.pyplot.Axes,
                date12List : list of date12 in YYYYMMDD_YYYYMMDD format
                cohList    : list of float, coherence value
                date12List_drop : list of date12 for date12 marked as dropped
                p_dict  : dict of plot setting
    Returns:    ax : matplotlib.pyplot.Axes
                coh_mat : 2D np.array in size of [num_date, num_date]
                im : mappable
    rB  rC  r(  r   r?   r   rD  rE  rF  rG  Tr   z	{} Matrixrv  r   rM  r   )r  r   r[   
legend_locrO  ry  r{  rp   r   r   c              3   @   K   | ]  }j                  |        y wr   r  )r   r   rl  s     r/   r   z(plot_coherence_matrix.<locals>.<genexpr>  s     G(..+Gr  r5   r  r   nearest)r  r  r  interpolation   r
  2   
   r   r   zImage NumberrN  rP  rQ  rR  rX  ru  r~  )r  zUpper: Ifgrams usedrJ  zLower: Ifgrams all)r7   handlelength)'r   r   r~   r   r
   rv  r  r  r  r,   r   rY  r`  ra  r   rZ  rS   r\  r    r  r  r  r   r  r   r  r  r  r  rd  r&  rc  r   r  rC   r  r  r  re  )rI   rf  rg  r  rh  r  ro  r   rj  rk  ri  r  r  r  r  date_num	tick_step	tick_listdividerr  r  rl  s                        @r/   plot_coherence_matrixr  W  sl    FKKM)[VI->FKKM)RVJ-?FKKM)QVK-@FKKM)XVM-BFKKM)RVL-AFKKM)TVL-AFKKM)[EWEWX^_hXiEjVK-@FKKM)UVJ-?FKKM)VIEVVL-AFKKM)ZVF^FKKM)TVK-@FKKM)VVL-AFKKM)TVM-B &$c*6*-.77	F:&

(J(J	Kj!:AA&BTUVV&&z2J##J8G,67q1773<?77,67q1773<?77$s7W#4567% 	)FGV\\#5FGJD$"$&&GD$J	)
 wwrwww}}Q/01H!vvHX^	8(3i	XB	F^AF^A 
 
B }}QH"}Q	BR	CR%'U1h	23ILLNY'LLNY'MM.6*+=M>MM.6*+=M>NN46*;MDt4  A l
VK() k%b)!!'4T!:||BC(vl+fZ6HI 6-0
B34
B23
		f\*	;w?c 87s   )Q>
R	   r=   c           
      z   |st        j                  d       t        j                  |       \  }t	        t        j                  |            }t        j                  dd|      \  }}|d   }|j                  |dd      }	t        fd	d
D              r.|j                  t	        d         t	        d         ddd       t        |d       |j                  |	|       |j                  d|       |d   }|j                  |t        j                  |          j!                         d|fd|       |j#                  d|       |j%                  d|       |j&                  j)                  t+        j,                                |j.                  j1                  t+        j2                  dd             |j.                  j)                  t+        j2                  ddd             |j.                  j5                  t+        j6                                |D ]  }|j9                  dd |dddd!        |j;                          t<        j>                  jA                  |       d    d"}
tC        d#|
       |jE                  |
d$dd%&       |rt        jF                          y't        jH                  |       y')(zPlot the histogram for the number of triplets with non-zero integer ambiguity.

    Fig. 3d-e in Yunjun et al. (2019, CAGEO).

    Parameters: fname - str, path to the numTriNonzeroIntAmbiguity.h5 file.
    Aggr   r   )r   r   figsizer   RdBu_rr  )r  r  c              3   B   K   | ]  }|j                         v   y wr   )r   )r   keyr   s     r/   r   zBplot_num_triplet_with_nonzero_integer_ambiguity.<locals>.<genexpr>  s     
:3#((*
:s   )REF_YREF_Xr  r  swhiter=   )r  r  F)rI   r   )rI   z	$T_{int}$rN  T)r   logbinsz0# of triplets w non-zero int ambiguity $T_{int}$z# of pixelsr      )basenumticks)	r  r  g333333?g?r6   333333?r|  g?r  )r  r  subsrP  rQ  rR  z.pngzplot and save figure to filetight,  bbox_inchestransparentdpiN)%rC   switch_backendr   readr   r    r   subplotsr  r8  r  r   r  rc  histr   r   r  rd  r   r$  r   AutoMinorLocatoryaxisr!  
LogLocatorset_minor_formatterNullFormatterr&  tight_layoutr   r   r   r   savefigshowclose)r   disp_fig	font_sizerb   r   r  r4  r   rI   r  out_figr   s              @r/   /plot_num_triplet_with_nonzero_integer_ambiguityr    sY    5! e$ID#ryyD ||!1h?HC 
QB	4hi	@B 
:(9
::
CL!3s7|#4cQO e4LLLLL	L2 
QBGGD"((4.!))+At9$TGR MMEPYMZMM-)M4HHv6689HHv00dRHIHHv00dR6[ ] ^HH  !5!5!78 E
Vty"4t 	 	EE  !!%(+,D1G	
('2KKW$CKH
  			#
rN   r
  rO  zResidual phase RMS [mm]c           	      
   |st        j                  d       t        j                  | t              j                  t              }|dddf   j                  t        j                        dz  }t        |dddf         }t        j                  |      \  }}t        j                  |      }	 t        t        j                  t        j                  |      j!                         d            d	z  d
z  }t        j                  |      }t        j"                  |      \  }}|j%                  |||j&                  d       t        j(                  |      }|j%                  ||   ||   |j&                  dd       t        j*                  |d|      }||kD  }t        j,                  |dk(        r&|j%                  ||   ||   |j&                  dd       t/        ||||      \  }}}|j1                  t        j                  ||g      t        j                  ||g      dd|        t3        |t        j4                  ||      |d      }|j7                  ||       |j9                  dd|dddd       |	rt;        |      }|j=                  dd d!"      }|j1                  t        j>                  |j@                  t        j                        d#z  |d$d%d&       |j1                  t        j>                  |j@                  t        j                        |   d#z  ||   d$d%d&       t        j,                  |dk(        rK|j1                  t        j>                  |j@                  t        j                        |   d#z  ||   d$d%d&       |j1                  t        j                  ddg      t        j                  ||g      d       |jC                  |jE                                |jG                  ddg       |j9                  dd|dddd       |jI                         jK                  g        |jM                         jO                  g        |r|jQ                  |d'|(       |
rU|jE                         \  }}||z
  d)z  }||z
  d#||z
  z  kD  r|d*z  }|jS                  d| |||z
  d+z  z   ||z   fd,d-|.       |r tU        d/|       |jW                  |d0d1       |rt        jX                          yt        jZ                          y#  t        j                  t        j                  |      j!                               d	z  d
z  }Y \xY w)2aH   Bar plot for the phase residual RMS time series.

    Parameters: rms_file - str, path to the time series RMS text file
                           Generated by utils1.get_residual_rms().
                cutoff   - float, cutoff value of MAD outlier detection
                fig_size - list of 2 float, figure size in inch
    r  r   Nr        @@r   r   )r   r=   r   r  C0)r  C1zReference date)r  rK  r5   )centercutoffTdarkgrayzExclude date)r)  z--kzMedian Abs Dev * rJ  )r;  rN  rP  rQ  rR  rX  z10%z2%r~  r6   onone)r  r  F)r7   r;   r(  r  r}   g?r   r   r  zsave figure to file:r	  )r  r  ).rC   r  r    r!   r"   r#   r   float32rS   r   r]  r&   rT   r^  r_  r   r   r  rb  r  argminmedian_abs_deviation_thresholdr   r6  r  r@  r   rd  r&  r   r  r  r   r9  get_ylimr  r  r  r  set_ticklabelsre  r  r   r  r  r  )rms_filer&  r  r  rb   r  tick_year_numr  ry  disp_side_plotdisp_thres_textrs  fcrms_listr  r   r'  rm  rmsr4  rI   ref_idxrms_thresholdex_idxr2  r3  r  ax2r;  r<  yoffs                                  r/   plot_timeseries_rmsr;    s    5! 
HE	*	1	1#	6B!Q$xrzz*U2HR1XI..y9E:HHUOE8(=(=(?1EFqHJ	 ((8
C ll8,GCFF5#y~~TF2 iinGFF5>3w<tK[F\ 66s2fUM= F	vvfdl
uV}c&k9>>Sab .b*iTabRtGGBHHdD\"BHHm]-K$Le%fX.  0 
2ryym<ic	RBMM&9M-NN49Dt4  A %b)!!'5d!;BJJ/#5sCVSWXBJJ/83>GcW]eij66&$,HHRWWSYY

3F;cA3v;PSY_gqHr1a&!288]M,J#KUSR[[]#aVf	#D 	 	F!!"%&&r*
		j%)	D [[]
dts"D C4$;$77CKD
'x0T	4//1EG 	 	D
 $g.GdC
  			
M8FF2775>0023A5a7	s   /AT >Uc                 "   ddl m} ddlm} |rt        nd }|j
                  \  }}	t        |j                  t              rt        |j                        j                  n|j                  }
t        |      }d|d<   t        ||j                        d   }|j                  r|j                  n|j                  d	d
      }|j                  r|j                  n|j                  dd
      }d|j!                         v rFt#        j$                  ||d   |d         \  }}t#        j$                  ||d   |d         \  }}||||f}|j'                  ||||j(                        \  }}}|j*                  dk(  r,t-        j.                  d| d| d| d       t	        d       | S |j0                  r |d      j3                  t5        j6                  |j0                  d   |j*                        t5        j6                  |j0                  d   |j*                        ||      d   }t5        j8                  |      }d}|||    d||    d||    dz  }t	        |       d|j!                         v rt#        j:                  |||      \  }}|j<                  r|j>                  |j>                  j@                  dk(  r|j>                  n t5        jB                  |j>                  d      }tE        |      }|jG                  ||      dd \  }}|||f   dk7  }||   }||   }||   }|j*                  dk(  rtI        d      |jJ                  r'|jJ                  |vrtI        d|jJ                   d      |d    }|jL                  r|d!vrd
|_&         |d"| d#       t        |jN                  dz  d$d%d&'      }|jL                  rm |d(       d)}||d*k(  rd*nd+z  }|d,|jL                   d-z  }||jJ                  rd.|jJ                   d/nd/z  } ||        |d0tQ        |               |d1|         |d2|         |d3|jL                          |d*k(  rd*nd+} |jS                  || ||||j(                  |jL                  |jT                  ||jV                  4
      }!|jJ                  rH|jY                         j[                  |jJ                        }"|!|"   }#t5        j\                  |#      s|!|#z  }!|!|z  }!|j^                  r}t5        j`                  |D $cg c]  }$|$|j^                  v  c}$t4        jb                  5      }%t5        jd                  |%      dkD  r& |d6||%           ||%    }||%    }||%    }|!|%    }!t5        j\                  |!      }&t5        jd                  |&      dkD  r- |d7t5        jd                  |&       d8        |d9||&           tg        |||!      D ]C  \  }'}(})t5        j\                  |)      r |
|)|z
  |	|z
  z        }* | jh                  |(|'fd:|*i| E n |d;        | jh                  ||fd:d<i| |jj                  r6tg        |||      D ]&  \  }+}'}(| jm                  |+|(|'f|jn                  =       ( | S c c}$w )>a\  Plot GNSS as scatters on top of the input matplotlib.axes.

    Parameters: ax       - matplotlib.axes object
                SNWE     - tuple of 4 float, for south, north, west and east
                inps     - Namespace object, from view.py
                metadata - dict, mintpy metadata
    Returns:    ax       - matplotlib.axes object
    r   )Geod)gnssc                       y r   r   argsrK   s     r/   <lambda>zplot_gnss.<locals>.<lambda>e      rN   mUNITr   	disp_unitr   
START_DATENEND_DATEUTM_ZONEr=   r   )
start_dateend_datesourcezNo GNSS found within z during rw   !z  continue without GNSS plots.WGS84)ellpsz1nearest GNSS site (potential --ref-gnss choice): z at [rQ   rR   r   rH  zNo GNSS left after --mask-gnss!zinput reference GNSS site "z" not available!re   )velocityrq   displacementz,WARNING: --gnss-comp is not implemented for z. file yet, set --gnss-comp = None and continuer   r6   r  )r   
edgecolorsr  zorderz------------------------------zplotting GNSS rQ  rR  z in IGS14 reference frame in z
 directionz with respect to  ...z#number of available GNSS stations: zstart date: zend   date: zcomponents projection: )
metaobs_type
site_namesrK  rL  rM  	gnss_comphorz_az_angler   redor   z+ignore the following specified stations:
  zignore the following z5 stations due to limited overlap/observations in time  r  zshowing GNSS locationsr<   )r  r(  )8pyprojr=  mintpy.objectsr>  r   r   r~   rv  r   r
   rB   scale_data2disp_unitrG  gnss_start_dater   gnss_end_dater   r^  
utm2latlonsearch_gnssgnss_sourcer4   warningswarnref_laloinvr    tiler+  
latlon2utm	mask_gnssmskndimprodr   r(   r,   ref_gnss_sitegnss_componentgnss_marker_sizer   get_los_obsrZ  	gnss_redor   r  r   ex_gnss_sitesr&   bool_sumr  scatterdisp_gnss_labelr  r  ),rI   SNWEr-   r   r   r=  r>  vprintr  r  r  r   unit_facrK  rL  southwestnortheastrX  	site_lats	site_lons	site_distn_indr   rl  coordsite_yssite_xsflagr   plot_kwargsrW  site_obsref_indref_valra   ex_flagnan_flaglatlonobsr  	site_names,                                               r/   	plot_gnssr  Y  s    #U%AFJD$2<T]]C2P;t}}%..VZVcVcD
x.CCK#SDNNKANH)-)=)=%%8<<P\^bCcJ%)%7%7t!!X\\*VZ=[H X]]_$nnS$q'47;tnnS$q'47;tudD) (,'7'7	 (8 ($J	9 !-dV8J<s8*TUVW./	 }}w'++GGDMM!$joo6GGDMM!$joo6	

 	 		)$A*U#$E)E*:);2i>N=OqQQc
 X]]_$"~~h	9M	9 ~~$((.((--1,dhh"''$((2L8$ ??9i@1E7G#$)%
dO	dO	??a>??d00
B6t7I7I6JJZ[\\Aq(RR"=aS@nop..1ccRTUKvQ*_z.@.t/B/B.C:NNt?Q?Q"4#5#5"6d;W]]s4S_4EFGj\*+hZ()()<)<(=>?
 "#j:n##!!##)),, $ 
  '')//0B0BCG w'G88G$G# 	H hhLAT%7%7 7LTVT\T\]Gvvg"EjQXFYEZ[\'1
%wh/	%wh/	#WH-88H%66(a*266(+;*<<qrsR
8,-./ !Ix@ 	AMCc88C=sTzdTk:<

3@5@K@	A 	'(

9iBsBkB #&z9i#H 	KIsCKK	sCj4>>KJ	K I;  Ms   Zc
           
         d}
d}g d}t        |      }dgdg|dz
  z  z   }t        d|d       t        j                  ||d	d
      }|d   }|d   }|d   }||d      |z  }|et        j                  |D cg c]  }||v  c}t        j
                        }t        j                  |      dkD  r||    }||    }||    }||    }t        d| d       t        j                  |       }t        |d         t        |d         }}t        |      j                  ||      dd \  }}|rt        j                  |      d   n&t        j                  ||ft        j
                        }|j                  }t        j                  |t        j                         t        j"                  z  }t%        j&                  |      }t)        |      D ]  }||   ||   }!} d| cxk  r|k  rEn nBd|!cxk  r|k  r7n n4||!| f   r-| |!| dz   |!dz   f}"t        j                  | d|"      d   |z  ||<   |j+                  |dz   |dz    d| d||            |j-                          t        j.                  ||z
        }#t        d|#dd       |r=t        d |        |j1                         j3                  |      }$|||$   z  }|||$   z  }t        d!|        t        j4                  t        j6                  |       t        j6                  |             }%|=t        d"| d|
        |%||d   k\  z  }%|%||d   k  z  }%|%||d   k\  z  }%|%||d   k  z  }%||%   }||%   }||%   }t        d#t        j8                  |      dd$t        j:                  |      d       t        d%t        j8                  |      dd$t        j:                  |      d       t        j<                  t        j                  ||z
  dz        |j                  dz
  z        }&t?        j@                  ||      d   }'t        d&|&dd|
        t        d'|'d       tC        jD                  tG        ||z
        d(      }(t        d)|(dd*|        t        d+       tI        |||      D ]4  \  })}*}+tG        |*|+z
        |(|z  kD  st        |)dd,|*d-d.|+d-d/|
        6 |	rxtJ        jL                  j+                  d0d1i       |Ht        jN                  |      t        jP                  |      g}|d   |d   z
  d2z  },|d   |,z
  |d   |,z   g}tK        jR                  |3      \  }-}.|.jU                  |d   |d   f|d   |d   fd4       |.jU                  ||d5d67       |.jW                  |       |.jY                  |       |.j[                  | d8|
 d9       |.j]                  d:|
 d9       |.j_                  d;d<       |-ja                          |jc                          d=}/tK        jd                  |/d>d
d?@       t        dA|/       tK        jf                          |||fS c c}w )Ba&  Scatter plot to compare the velocities between SAR/InSAR and GNSS.

    Parameters: vel_file      - str, path of InSAR LOS velocity HDF5 file.
                csv_file      - str, path of GNSS CSV file, generated after running view.py --gnss-comp
                msk_file      - str, path of InSAR mask file.
                ref_gnss_site - str, reference GNSS site name
                cutoff        - float, threshold in terms of med abs dev (MAD) for outlier detection
                xname         - str, xaxis label
                vlim          - list of 2 float, display value range in the unit of cm/yr
                                Default is None to grab from data
                                If set, the range will be used to prune the SAR and GNSS observations
                ex_gnss_sites - list of str, exclude GNSS sites for analysis and plotting.
    Returns:    sites         - list of str, GNSS site names used for comparison
                insar_obs     - 1D np.ndarray in float32, InSAR velocity in cm/yr
                gnss_obs      - 1D np.ndarray in float32, GNSS  velocity in cm/yr
    Example:
        from mintpy.utils import plot as pp
        csv_file = os.path.join(work_dir, 'geo/gnss_enu2los_UNR.csv')
        vel_file = os.path.join(work_dir, 'geo/geo_velocity.h5')
        msk_file = os.path.join(work_dir, 'geo/geo_maskTempCoh.h5')
        pp.plot_insar_vs_gnss_scatter(
            vel_file,
            ref_gnss_site='CACT',
            csv_file=csv_file,
            msk_file=msk_file,
            vlim=[-2.5, 2],
        )
    zcm/yr      Y@)SiteLonLatDisplacementVelocityU10f8r   zread GNSS velocity from file: r   ,T)r   	delimiternamesr  r  r  r   Nr   r   zread InSAR velocity from file: rg   rf   r   )maxValuerQ  )r   r   / )r   zBmedian offset between InSAR and GNSS [before common referencing]: r}  z cm/yearz.referencing both InSAR and GNSS data to site: z*removing sites with NaN values in GNSS or z pruning sites with value range: zGNSS   min/max:  / zInSAR min/max: zRMSE = zR^2 = )r%  zAPreliminary outliers detection: abs(InSAR - GNSS) > med abs dev (z) * zSite:  InSAR  GNSSz: z5.1frQ   r\  z	font.sizer   r  r"  zk--.r  )r  z [rR   zGNSS [equalr   z_vs_gnss_scatter.pdfr	  r
  r  zsave figure to file)4r   r   r    
genfromtxtr&   ru  rv  r   r   r   r   r(   r  r  r4   r   r*  r  r   progressBarr   updater  	nanmedianr   r  multiplyr   r   r   r   r   
linregressr^  median_abs_deviationr   r  rC   rD   rT   rW   r  r  r  r9  r  rd  
set_aspectr  r   r  r  )0vel_filecsv_filemsk_filero  r&  rb   xnamer   rt  displayrG  r{  	col_namesnum_col	col_typesr3  siteslatslonsgnss_obssiter  r   lengthr  ysxsrl  num_site	insar_obsprog_barr   ra   r  r   off_medr  r  rmser2diff_madr  	insar_valgnss_valvbufferr4  rI   r  s0                                                   r/   plot_insar_vs_gnss_scatterr    sw   @ IH CI)nG4&GaK00I	*8A,
78	xyCt	LBvJEe9De9D)B- 8+H ((eDdDM1DBHHU66'?Q7(OE>D>D)H 
+HQ<
89

!
!(
+CH&CL(9EF_&&tT22A6FB(0(--
!!
$bggvuoUWU]U]6^CzzH4rvv=I  (3H8_ D!ube1NUNa&c!Q$ia1ac"C#==zsSTUVYaaIaL!qse1XJaaz$BCD NNll9x/0G	NwWZm[c
de >}oNO,,.&&}5HW%%Yw''	 
6ug
>?;;++bhhx.@-@AD0a	{CDDG##DG##	T!W$$	T!W$$~H$I$KE 
RYYx05S89LS8Q
RS	OBIIi05S99Mc8R
ST772669x/!348IJKD			)X	.q	1B	GD:Qyk
*+	F2c(
 ''I,@(A!LH	MhWZ^[_`f_g
hi	
*-eY*I T&	9hy8#$x&'88YqMId#32ht_BykRST
 ["-.<FF9%rvvi'89DAwa(C/GGg%tAw'89D,,x0R
a$q'"T!Wd1g$6>
	8SR0 	D
D
r)A./
yk+,
gu% [[]O#78GdL#W-
)X%%{ Es   8Yc                 	   | j                   dv rd}nd}| j                  d   | j                  d   z
  dz  }| j                  d   |z
  }| j                  d   |z   }| j                  s|| j                  d   k  r|| j                  d   k\  rd| _        n_|| j                  d   kD  r|| j                  d   k\  rd| _        n3|| j                  d   k  r|| j                  d   k  rd	| _        nd
| _        t	        |t
        j                  z         t
        j                  z  dk  rSt	        |t
        j                  z
        t
        j                  z  dk  r#t
        j                   dt
        j                  g}nHt        | d      r:| j                  .t        | j                        dk  rt        | j                        }nd }| j                  s't        j                  |||| j                  |      }d}	nt        || ||g||       d}	d }| j                  r/| j                  dk  rg|	dk(  r|j!                  | j                         nl|dk(  r|j#                  | j                         nJ|dk(  rD|j%                  | j                         n'|	dk(  r6t'        j(                  | j                        |_        |j-                          n|dk(  r:|j.                  j1                  t'        j(                  | j                               n|dk(  r|j2                  j1                  t'        j(                  | j                               nn| j4                  rb|	dk(  r|j!                  | j4                         nA|dk(  r|j#                  | j4                         n |dk(  r|j%                  | j4                         |r_t        |      dk(  rQ|t
        j                   dt
        j                  gk(  r,|dk(  r|j7                  g d       n|j9                  g d       |j;                  d
d| j<                  | j>                         | j@                  r| j@                  }
n| jB                  dk7  r| jB                  }
nd }
|
qtE        | j<                  | j>                        }|	dk(  r |jF                  |
fi | | |fS |dk(  r |jH                  |
fi | | |fS |dk(  r |jJ                  |
fi | | |fS )N)rW  rX  vertical
horizontalr   r   g-C6?neitherrT   rW   rP  r   r   r
  )r  orientationextendticksr  )r   r  r  imgr   )nbinsr=   )z-$\pi$0z$\pi$out)rS  rT  r  r  rv   r(  r  )&cbar_locr   cbar_extdlimr   r    r   hasattrr   r   rS   disp_dem_blendrC   r  blend_colorbar
cbar_nbinsr  
set_yticks
set_xticksr   MaxNLocatorlocatorupdate_ticksr  r!  r   
cbar_ticksset_yticklabelsset_xticklabelsr&  r  
font_colorrM  rG  rB   r  rd  r  )r-   r  r  r  epsilonr  r  r  r  	cbar_typerM  rK   s               r/   plot_colorbarr    s    }})) " yy|diil*f4G99Q<'!D99Q<'!D ==TYYq\!ddiil&:)DMTYYq\!ddiil&:%DMTYYq\!ddiil&:%DM#t} 4"%%<255 5(S->-F-N%%BEE"		'D,>,>,JsSWSeSeOfjkOkT''( ||BC[^cd	 	sDd|TYZ	 ??a E!tyy)
*tyy),tyy) E!%11H!!#
*		++F,>,>T__,UV,		++F,>,>T__,UV	NN4??+J&NN4??+L(NN4??+ UqUvq"%%.@%@*$ :; :;OO&ET^^TXTcTcOd __
	3	^^

t~~T__EDNN:00 : J&CNN:00 : L(CNN:00:rN   c                 @   |rt        d|        t        j                  ||||      }t        |      dk(  r+t	        j
                  d| d| d       t        d       | |fS t        |      dk  rd	n|}t        j                  t        |      |
      }t        |      D ]>  \  }}	| j                  |	dddf   |	dddf   d|       |j                  |dz   d       @ |j                          |\  }
}}}| j                  ||       | j                  |
|       | |fS )a  Plot fault lines.

    Parameters: ax             - matplotlib.axes object
                faultline_file - str, path to the fault line file in GMT lonlat format
                SNWE           - tuple of 4 float, for south, north, west and east
    Returns:    ax             - matplotlib.axes object
                faults         - list of 2D np.ndarray in size of [num_point, 2] in float32
                                 with each row for one point in [lon, lat] in degrees
    z'plot fault lines from GMT lonlat file: )ry  min_distr   r   zNo fault lines found within z with length >= z km!z  continue without fault lines.  F)r  r   Nr   zk-)r  r  )every)r   r   read_gmt_lonlat_filer   re  rf  r   r  	enumerater  r  r  r  r9  )rI   faultline_filery  r?   r  r   faultsr  r   faultSNWEs                 r/   plot_faultliner    s0    77GHI **	F 6{a4TF:J8*TXYZ/06z Vt+I  #f+KHf% '5
ac
E!A#J;!2&' NN JAq!QKK1KK1v:rN   c           
         || j                         }| j                         }| j                         }||j                         }t	        j
                  t	        j                  ||z
              }|dk(  r)|dz   }||j                  k\  r&|j                  dz
  }|dz
  }n|dz
  }|dk  rd}|dz   }| j                  j                  d||   ||   f||   ||   ft        d|d      |      }	|	S )	a  Add an arrow to a line.

    Link: https://stackoverflow.com/questions/34017866

    Parameters: line      - Line2D object
                position  - x-position of the arrow. If None, mean of xdata is taken
                direction - 'left' or 'right'
                size      - size of the arrow in fontsize points
                color     - if None, line color is taken.
    Returns:    ann       - matplotlib.text.Annotation object
    rX  r   r   rt   z->r  )
arrowstyler  	linestyle)xytextr  
arrowpropsr4   )	get_color	get_xdata	get_ydatameanr    r+  absoluter4   axesr  rB   )
linepositionrT  r4   r  xdataydata	start_indend_indanns
             r/   	add_arrowr    s    } NNENNE ::< 		"++eh&678IGa-ejj jj1nG!Ia-a<G!I
))

Ri %	"23'NE'N+4uE	  C JrN   r}   c                    |s{| d   j                  dd      }| j                  dd      }| d   j                         }|dv r7|j                  d      d	   j	                  d
      r|j                  d      sd}n|dv rd}|ro|j                  d      d	   dvrd}t        d|        ||fS |j                  d      d	   dk7  r.|d   |d	   z
  dt        j                  z  k(  rd}|rt        d       ||fS )zGet auto disp_unit for input dataset
    Example:
        if not inps.disp_unit:
            inps.disp_unit = pp.auto_disp_unit(atr)
    re   r  rt   r   r*  rE  )rq   giantTimeseriesrQ  HDFEOSr  r   rD  r   cm)mlislcampdB)radiandegreerD  r  mmrv   pixelFz-WARNING: re-wrap is disabled for disp_unit = r  r   r   z+change disp_unit = radian due to rewrapping)	replacer   r   r   endswithr   r   r    r   )r   rG  rz   r|   r   ftyper   s          r/   check_disp_unit_and_wrapr  G  s    %--c"5[)4V$**,	LLOOC(+44S9((3I++I??3"*]]DA)MN d? __S!!$0jmjQRm6SXZ[][`[`X`5` ICDd?rN   c                 D   |sd|d<   d}|d   j                         j                  d      }|j                         j                  d      }||k(  r| |d   |fS |d   j                  d      r|d   dk(  r|dz  }n|d   dk(  r|d	z  }n|d   d
k(  r|dz  }n|d   dk(  r|dz  }n|d   dk(  r|dz  }nr|d   dv r|dz  }ne|d   dv r|dz  }nX|d   dv r|dz  }nK|d   dv r|dz  }n>|d   dv r(dt        j                  z  t        |d         z  }||z  }nt        d|d          |d   dk(  r|dz  }n|d   dk(  r|dz  }n|d   d
k(  r|dz  }n|d   dk(  r|dz  }n|d   dk(  rt        |d          dt        j                  z  z  }|d   dk(  r
||dz  z  }nC|d   dk(  r
||d	z  z  }n1|d   d
k(  r
||dz  z  }n|d   dk(  r
||dz  z  }n|d   dk(  r||dz  dz  z  }n|d   dv r	||dz  z  }n|d   dv r	||dz  z  }n|d   dv r	||dz  z  }n|d   dv r	||dz  z  }n|d   dv rnt        d|d          n|d   d k(  r|d   d!k(  rl| jd#|d<   |d$   d%v r/d&t        j                  t        j                  | dd"'            z  } nTd(t        j                  t        j                  | dd"'            z  } n%	 |t        |d         z  }nt        d*|       |d   g}t        |      d+k(  rP	 |d   d,v rd-|d<   n3|d   d.v rd/|d<   |d0z  }n!|d   d1v rd2|d<   |d3z  }nt        d4|d          |d   dz   |d   z   }n|d   }| )|dk7  r$| t        j                  || j                  5      z  } | ||fS #  t        d)|d          Y xY w#  |j                  d-       Y oxY w)6a  Scale data based on data unit and display unit
    Parameters: data      - 2D np.ndarray
                metadata  - dictionary, meta data
                disp_unit - str, display unit
    Returns:    data      - 2D np.ndarray, data after scaling
                disp_unit - str, display unit
                            Default data file units in MintPy are:  m, m/yr, radian, 1
    rD  rE  r   r  r   r  r!  r  r  dmr   kmr   )rQ  inchgo_C@)ftfootgD
)?
@)ydyardgA	3m?)mimilegp\D?)radiansr  radrg      
WAVELENGTHz'Unrecognized display phase/length unit:g{Gz?r  r  r   r   zUnrecognized phase/length unit:rv   dbNr  re   )r   z.intz.unwr  )a_mina_maxr   zUn-scalable display unit:zUn-scalable data unit:r   )r  yrr  r  )rD  monmonthr*  r	  )ddayr-  r  z#Unrecognized time unit for display:r   )r   r   r  r    r   r$   r   log10clipr   r   r&   r   )r   r   rG  rZ   	data_unitrange2phasephase2ranges          r/   r_  r_  h  s     E &&(..s3I!'',I IXf%u,, |S!q\T!EVOEq\T!EUNEq\T!ETMEq\S ESLEq\T!EUNEq\]*Ug-=Uq\]*Ug-=Uq\]*Ug-=Uq\]*Uk-AUq\;;+h|.D(EEK[ E;Yq\J q\T!EUNEq\T!ETMEq\T!ESLEq\T!EUNE	1	!Xl344"%%@q\T!E[6-A$AEq\T!E[5-@$@Eq\T!E[4-?$?Eq\S E[3->$>Eq\T!E[1_V-C$CEq\]*UkG6K-KUq\]*UkG6K-KUq\]*UkG6K-KUq\]*UkK6O-OUq\;;3Yq\B 
1	Q<4D$4IaL$(@@BHHRWWTT%JKK BHHRWWTT%JKKAy|,, 	&	2f%&	 9~	%1!44Vil1!44UilEUYME1!44UilEU[OE=y|L aL$Yq\1	aL	 ESLdjj11E!!/A19Q<@	%V$s   =M4 0A N
 4N
Nc                     |st        |d|||      \  }}d}||d   k(  st        | ||      \  } }}|r;|d   t        j                  | |d   z
  |d   |d   z
        z   } |rt	        d|        | |||fS )	a   Scale 2D matrix value according to display unit and re-wrapping flag
    Parameters: data      - 2D np.ndarray
                metadata  - dict, including the following attributes:
                            UNIT
                            FILE_TYPE
                            WAVELENGTH
                disp_unit  - str, optional
                wrap       - bool, optional
    Returns:    data       - 2D np.ndarray, scaled data matrix
                disp_unit  - str
                wrap       - bool
    N)rG  rz   r|   r   r   rE  rF  r   r   zre-wrapping data to )r  r_  r    modr   )r   r   rG  rz   r|   r   
disp_scales          r/   scale_data4disp_unit_and_rewrapr6    s     2!
	4 J((&:'
#i !}rvvdZ]&:JqMJWXM<YZZ(56J,,rN   c	                    |rt         nd }	t        j                  |       d   }
|s|
dv rd| vrdD ]  }d| v rd}t        j                  j                  |       j                  d      rd| }t        j                  j                  t        j                  j                  |       t        |            }t        j                  j                  |      r nd} d}t        j                  j                  t        |            r	 t        j                  |      t        fd	d
D              rrd}t        d fD              r|j                  d      d   }d| }t        j                  ||||      d   } |	dt        j                  j                  |             n<d}d| }|d|  dd    dd    z  }|d| dd    dd    z  }|dz  } |	|       n|
dv rD|j                  d      d   t        v r| }t        j                  | d|      d   } |	d|
 d       nf| j                  d       rU| }t!        j"                  | d!      5 }|d"   dd d#k(  }ddd        |	dt        j                  j                  |        d$       |n||z  dkD  rft%        |j&                  d   |z        }t%        |j&                  d   |z        }|t%        |d%z        d|t%        |d%z        d|f   }|d|d|f   }|d}||fS t)        j*                  |      }|||k\  } |	d&|        |||k  } |	d'|        t        j                  j                  |      j                  d(      r|| |	d)       |dk(  }n |	d*       d|t)        j,                  |      <   |dk7  }||fS #  d} |	d|       Y *xY w# 1 sw Y   `xY w)+a  Find and read mask for input data file fname
    Parameters: fname       - str, data file name/path
                mask_file   - str, optional, mask file name
                datasetName - str, optional, dataset name for HDFEOS file type
                box         - tuple of 4 int, for reading part of data
    Returns:    mask        - 2D np.ndarray in bool, mask data
                mask_file   - str, file name of mask data
    c                       y r   r   r@  s     r/   rB  zread_mask.<locals>.<lambda>  rC  rN   re   )rQ  rq   rl  )zmaskTempCoh.h5zmaskResInv.h5PhaseVelocityNgeo_c              3   X   K   | ]!  }t        |         t        |         k(   # y wr   )r   )r   r  r   atr_msks     r/   r   zread_mask.<locals>.<genexpr>  s'     T#3ws|$CH5Ts   '*)rg   rf   c              3   ,   K   | ]  }|d    dk(    yw)re   rh   Nr   )r   rV  s     r/   r   zread_mask.<locals>.<genexpr>"  s     UdtK(M9Us   rk   r   zconnectComponent-)r   r   r   r   zread mask from file:z7WARNING: input file has different size from mask file: z
    data file z row/column number: rg   r  rf   z
    mask file z
    Continue without mask.zCan not open mask file:)r
  mask)r   r   zread z contained mask dataset.z	PARAMS.h5r$  cmaskr   z contained cmask datasetr   zhide pixels with mask value < zhide pixels with mask value > numTriNonzeroIntAmbiguityzEkeep pixels with numTriNonzeroIntAmbiguity == 0 and mask out the restzP--mask-vmin/vmax is specified, skip translating numTriNonzeroIntAmbiguity values)r   r   r   r   r   r   r   joindirnamer   r   r8  r   r  r   r  h5pyFiler   r   r    r&   r   )r   	mask_filer   r   xstepystepr  r  r   rz  r   	mask_datadsNameri  r   fxsizeysizer>  r   r<  s                      @@r/   	read_maskrM    s;     U%AF

!
!%
(CKA //U"< 	!I%' 	 ww&11&9"9+.	 RWW__U%;S^LIww~~i( 		!  I	ww~~c)n%	9--i8GTASTTUsGnUU(..s3A6F09F %MM &'	
 	 -rww/?/?	/JK !	OPY{[)%0DS]OSVWZ[bWcVdee))4HQYIZH[[^_fgn_o^pqq55s 
jS!!$(==I e9UVWXIU1#567		$	YYuc" 	,a'
1+I	,rww''.//GHI !2IOOA&./IOOA&./ c%'l1E1!%'l1E12 3	fuffufn-	 4 ?1 xx	" $D3D6:;$D3D6:; 77I&112MN|^_ A~ij %&RXXi ! qy?o	9I,i8	, 	,s   CN' N:'N7:Oc                    |r,t        dt        j                  j                  |        d       t	        j
                  |       }|d   dk(  rd}nd }t        |      }|ddt        |d         t        |d         f}|r|j                  |      }n|}|j                  |d	
      }t	        j                  | |||      \  }	}|||k7  r|rt        d       t        j                  |d   |d   z
  |d   |d   z
  f|	j                        t        j                  z  }
|	|
|d   |d   z
  |d   |d   z
  |d   |d   z
  |d   |d   z
  f<   t        j                  |
      }	|	||fS )Nzreading DEM: rU  re   rr   heightr   rf   rg   Fr   )r   r   r   z align DEM to the input data filer=   r   r   r   )r   r   r   r   r   r   r   r   box_geo2pixelcheck_box_within_data_coverager  r    r   r   r  r&   )dem_filerx   geo_boxr   dem_metarI  r  dem_pix_boxbox2readdemdem_tmps              r/   read_demrY  t  s   bgg..x89>?&&x0H
* x EaXg./Xh5G1HI ))'233K53QHMM	MC x;645((KN[^;'N[^;=DGIIOQSQWQWX JM 	KN*8A;{1~+EEKN*8A;{1~+EEF 	Ghhw+%%rN   c                    d}d}d}|j                   dk(  rt        j                  |       dz   |_         |j                  r,ddlm}  ||j                  |j                        }t        j                         5  t        j                  dt               |j                  | |j                  t        d	      j                  |j                   |j                   
      }ddd       t        j"                  |t        j$                  |dddddf         <   |rWd|j                   dd|j                   dd}|d|j                   d|j                   d|j                   dz  }t'        |       |j(                  rt        j                  |       t        j*                  |       z
  |j,                  dz  k  rYdt        j*                  |       ddt        j                  |       dd}|d|j,                  dz  ddz  }|dz  }t'        |       nddlm}	 |	j3                  | |j4                  d      }t        j6                  |j,                  d|j,                        }|r-d|j,                   d}|d|j4                   z  }t'        |       |r|j8                  r||||fD 
cg c]  }
|
|
j:                  dd  c}
d   }|j<                  j:                  |k(  rR|rt'        d        | t        j"                  ||j<                  dk(  <   |,t        j"                  ||j<                  dk(  <   nt'        d!       |||fS # 1 sw Y   exY wc c}
w )"a  Prepare to plot DEM on background
    Parameters: dem  - 2D np.int16 matrix, dem data
                inps - Namespace with the following 4 items:
                       'disp_dem_shade'    : bool,  True/False
                       'disp_dem_contour'  : bool,  True/False
                       'dem_contour_step'  : float, 200.0
                       'dem_contour_smooth': float, 3.0
    Returns:    dem_shade       - 3D np.ndarray in size of (length, width, 4)
                dem_contour     - 2D np.ndarray in size of (length, width)
                dem_contour_seq - 1D np.ndarray
    Examples:
        from mintpy.cli import view
        from mintpy.utils import plot as pp

        inps = view.cmd_line_parse()
        dem = readfile.read('inputs/geometryRadar.h5')[0]
        dem_shade, dem_contour, dem_contour_seq = pp.prep_dem_background(
            dem=dem,
            inps=inps,
        )
    Ng     8@i  r   LightSourceazdegaltdegignore)categoryr   )	vert_exagr  r  r  z show shaded relief DEM (min/max=z.0fr  z m; zexag=z	; az/alt=z deg)r   zWARNING: elevation range (rP   rk   z m)z < 2 contour levels (z+ --> skip plotting DEM contour and continue)ndimage)sigmaorderi(#  )stepzshow contour in step of z m zwith a smoothing factor of z2mask DEM to be consistent with valid data coveragezJWARNING: DEM has different size than mask, ignore --mask-dem and continue.)	shade_maxr    r   disp_dem_shadematplotlib.colorsr\  shade_azdegshade_altdegre  catch_warningssimplefilterRuntimeWarningshade
shade_exagr
   rv  	shade_minr  r   r   disp_dem_contourr   dem_contour_stepscipyrc  gaussian_filterdem_contour_smootharangemask_demr   rl  )rW  r-   r   	dem_shadedem_contourdem_contour_seqr\  r  r   rc  ra   	dem_shapes               r/   prep_dem_backgroundr}    s   . IKO ~~3$. 1t//8I8IJ$$& 	!!(^D// (11^^^^ ! I	 35&&	"((9Q1W-./4T^^C4H$..Y\I]]abCU4??+9T5E5E4FaHYHYGZZ_``C#J IIcNRYYs^+t/D/Dq/HH.ryy~c.B!BIIcNSVCWWZ[C*4+@+@+B3*GsKKC@@C#J &!11#T=T=T\]1^K ii(=(=t$J_J_`O01F1F0GsK4T5L5L4MNNc
 9#8K<S+4k*BTQamQWWRa[TUVW	88>>Y&JK$+-66	$((a-(&-/VVDHHM*^_k?22[	 	D Us   8A#L>$M,M>Mc                    t        d |||fD              r|t        |||      \  }}}||d   |d   |d   |d   f}nyt        |d      rt        |j                        }	n9|||fD 
cg c]  }
|
|
	 c}
d   }dd|j
                  d   |j
                  d   f}	|	d   dz
  |	d   dz
  |	d   dz
  |	d   dz
  f}|Ut        d	dd
      }| | j                  |fdi| n/t        | t        j                        r | j                  |fdi| ||t        d
d|j                  dd      }|d|d<   |dt        j                  |d   |d   |j
                  d   dz  |d   |d   |j
                  d   dz  f   \  }} | j                  ||||fdi| | S t        | t        j                        r | j                  ||fdi| | S c c}
w )a  Plot DEM as background.
    Parameters: ax   - matplotlib.pyplot.Axes or BasemapExt object
                geo_box         - tuple of 4 float in order of (E, N, W, S), geo bounding box
                dem_shade       - 3D np.ndarray in size of (length, width, 4)
                dem_contour     - 2D np.ndarray in size of (length, width)
                dem_contour_seq - 1D np.ndarray
                dem  - 2D np.array of DEM data
                inps - Namespace with the following 4 items:
                       'disp_dem_shade'    : bool,  True/False
                       'disp_dem_contour'  : bool,  True/False
                       'dem_contour_step'  : float, 200.0
                       'dem_contour_smooth': float, 3.0
                       'pix_box'           : 4-tuple of int, (x0, y0, x1, y1)
    Returns:    ax   - matplotlib.pyplot.Axes or BasemapExt object
    Examples:   ax = pp.plot_dem_background(ax, geo_box=inps.geo_box, dem=dem, inps=inps)
                ax = pp.plot_dem_background(ax, geo_box=None, inps=inps,
                                            dem_shade=dem_shade,
                                            dem_contour=dem_contour,
                                            dem_contour_seq=dem_contour_seq)
    c              3   $   K   | ]  }|d u  
 y wr   r   )r   r   s     r/   r   z&plot_dem_background.<locals>.<genexpr>
  s     
H19
Hs   )r-   r   r   r   r=   r   rx   r6   spline16upper)r  rT  originextentblack)r  r  
linewidthsr  rT  rT  y              ?)r8  r}  r  tuplerx   r   rB   r  r~   rC   Axesdem_contour_linewidthr    mgridcontour)rI   rS  ry  rz  r{  rW  r-   r   
geo_extentrx   r   r   
rdr_extentrK   yyxxs                   r/   plot_dem_backgroundr    s@   0 
Hy+G
HHS_2E3
/	; aj'!*aj'!*.
 4#DLL)G #Y<N!ANqQD!TZZ]DJJqM:Gajngajnajngajn6
 JqIBIIi=
=f=CHH%BIIi=
=f= ?#>WW!%!;!;+  F8 XXgajK4E4Ea4H4KK%ajK4E4Ea4H4KKL MFB BJJr2{OYJYRXY I CHH%BJJ{OQJQ&QII Os   (G0Gc                    ddl m} d}	d}
t        j                  t        j                  dd|
      j                  dd      d|	f      }t        j                  t        j                   dz  t        j                  dz  |	      }t        j                  |      t        j                  d|z        z  }|d	k(  rd|	|d   |d   g}n$|d   |d   d|	g}|j                  }|j                  } ||j                  |j                  
      }t        j                  j                  t        j                   j#                  dd      |j$                        }|j'                  |      ddddddf   }|j)                  |||||      }| j+                  ||d       t-        |j.                  |j0                  d      }t-        |j.                  |j0                        }|d	k(  r| | j2                  ddddd|  | j4                  |j6                  fddi| | j8                  j;                  d       | j8                  j=                          | j?                  g        ny | j2                  ddddd|  | j@                  |j6                  fi | | jB                  j;                  d       | jB                  jE                          | jG                  g        |(|d	k(  r| jG                  |       y| j?                  |       y)a  Create a shade-illuminated colorbar.

    Parameters: cax         - colorbar axis
                inps        - inps : Namespace with the following items:
                              'shade_azdeg' : float,  True/False
                              'shade_alt'   : float, 200.0
                              'colormap'    : string or matplotlib.colors.colormap class
                              'cbar_label'  : string
                vlim        - list of 2 float, colorbar range
                orientation - str, vertical or horizontal
                ticks       - list of float or None, colorbar ticks
                fraction    - float, increases or decreases the contrast of the hillshade
                blend_mode  - {'hsv', 'overlay', 'soft'} or callable
                vert_exag   - float, the amount to exaggerate the elevation values by
                              when calculating illumination
    Examples:   blend_colorbar(cax, inps, vlim=[-3, 6], orientation='vertical')
    r   r[  r     r   r   r   r  r  r]  r  r  Nr=   fraction
blend_moderb  auto)r  aspectrP  )r  r  rS  r  F)rU  rV  labelbottomrotationZ   rX  )rW  rX  labeltoprU  r   )$ri  r\  r    ri  linspacer'   r   	ones_likecosr*   rj  rk  rC   r  ScalarMappabler  r  r  rv  to_rgba	shade_rgbr  rB   r  r  r&  rd  rM  r  set_label_position
tick_rightr  r  r   tick_bottomr  )r  r-   r   r  r  r  r  rb  r\  nxnyarrra   elevr  r  mappableimg_rgb	illum_rgbtick_kwargslabel_kwargss                        r/   r  r  A  s   & . 
B	B
''"++aB'//A6B
@C 	RUUF1HbeeAgr*A<<rvvc!e},Dj Ra$q'*q'47Ar*eevv 
4++D4E4E	FBvv$$#***>*>q*C$--$XHs#Aq"1"H-G	  I JJyJ7 vVKtGLj Ru%URkRtDD|D		$$W-		rOU%%O;Ot7,7		$$X.		r *$NN5!  NN5!
rN   c           	         ddl m} | j                  |j                  k7  rddlm} t        d| j                   d|j                   d       d}t        dd	d
d
      }| j                  |j                  k  r>t        d| j                   d|j                   d| d        || |j                  fi |} n=t        d|j                   d| j                   d| d        ||| j                  fi |}t        j                  j                  |       } t        j                  j                  |      }|r|nt        j                  |       }|r|nt        j                  |       }| |z
  ||z
  z  }t        j                  j                  t         j"                  j%                  dd      |      }|j'                  |      ddddddf   }||| j(                  ddf<    |||	      }|j+                  |||||
      }t        j,                  |t        j.                  |dddddf         g      }|r|||j(                  df<   |r||| j(                  df<   |S )a  Prepare the illuminated RGB array for the data, using shaded relief DEM from a light source,
    like the `gmt grdimage -I` feature, i.e. hillshade + DEM-blended data.

    Parameters: data          - 2D np.ndarray in size of (m, n), data to be blended
                dem           - 2D np.ndarray in size of (m, n), dem data
                vmin/max      - float, lower/upper display limit of the data
                cmap          - str or matplotlib.colors.colormap class
                base_color    - float or color hex codes
                shade_frac    - float, increases or decreases the contrast of the hillshade
                blend_mode    - {'hsv', 'overlay', 'soft'} or callable
                az/altdeg     - float, azimuth/altitude angle of the light source
                vert_exag     - float, the amount to exaggerate the elevation values by
                                when calculating illumination
                mask_nan_dem  - bool, whether to mask blended image based on nan dem pixels
                mask_nan_data - bool, whether to mask blended image based on nan data pixels
                fill_value    - float, set the masked pixels as alpha = fill_value (transparent)
    Returns:    illum_rgb     - 3D np.ndarray of float32 in size of (m, n, 4), ranging between 0-1.
                                1st to 3rd layers are the RGB values; 4th layer is the transparency
    Examples:   illum_rgb = pp.prep_blend_image(data, dem, vmin, vmax)
    r   r[  )resizez*different dimension detected between data z	 and DEM rN  z%via skimage.transform.resize(order=1)r   edgeT)re  modeanti_aliasingpreserve_rangezresampling data from z to r  z...zresampling DEM from r  Nr=   r]  r  r   )ri  r\  r   skimage.transformr  r   rB   r4   r    mamasked_invalidr   r   rC   r  r  r  r  r  r  r>  r  dstackr  )r   rW  r  r  r  
base_color
shade_fracr  r^  r_  rb  mask_nan_demmask_nan_data
fill_valuer\  r  r   rK   	data_normr  r  r  r  s                          r/   prep_blend_imager    s&   0 . zzSYY,:4::,iPSPYPY{Z[\]5AF$tT99sxx)$**T#))AcU#NO$		4V4D(4

|1SEMNdjj3F3C 55%D55$C 4RYYt_D4RYYt_D-I vv$$#***>*>q*C$$OH y)!Q(3G 'GDIIqL 
5	0B	  I 		9bll9Q1W3E&FGHI
 ",	#((B,#-	$))R- rN   c                    |rbd}|d|j                   ddz  }|d|j                  dd|j                   dz  }|d|j                   d|j                   d	z  }t        |       t        |||j                  d
   |j                  d   |j                  |j                  |j                   |j                  |j                  |j                  |j                  |j                        }| j                  ||j                  ddd       t        j                  j                  t         j"                  j%                  |j                  d
   |j                  d         |j                        }|S )a  Plot DEM-blended image.

    Parameters: ax - matplotlib.pyplot.Axes or BasemapExt object
                data - 2D np.ndarray, image to be blended
                dem  - 2D np.ndarray, topography used for blending
                inps - Namespace object with the following items:
                       'base_color'   : float
                       'blend_mode'   : str
                       'colormap'     : str or matplotlib.colors.colormap class
                       'extent'       : tuple of 4 float
                       'shade_altdeg' : float
                       'shade_azdeg'  : float
                       'shade_exag'   : float
                       'shade_frac'   : float
                       'mask_dem'     : bool
                       'vlim'         : list of 2 float
                print_msg - bool, print verbose message or not
    Returns:    im   - matplotlob.pyplot.AxesImage
    zplotting data z'blended by DEM shaded relief (contrast=rP   rQ   zbase_color=z, exag=zaz/alt=r  z	 deg) ...r   r   )
r  r  r  r  r  r  r^  r_  rb  r  r  r  )r  r  rT  r  r  )r  r  rp  rj  rk  r   r  r   rv  r  rx  r  r  rC   r  r  r  r  r  )rI   r   rW  r-   r   r   	blend_imgr  s           r/   plot_blend_imager    sA   ( 88MRPPT__S18ILL))*!D,=,=+>iHHc
 !cYYq\YYq\]]??????  //mmI IIi:aX_I`			CJJ$8$81tyyQR|$T[_[h[h		iBIrN   r   )r   FFg      ?g333333?T)NT)r   T)r   ))r   r   r   r   F)NNT)r   r   T)r   Nr  N)r   NN)	zgnss_enu2los_UNR.csvNNr
  )r   r   InSARNNT)r6   r  T)NrX  r  N)NNNr   r   NNT)T)NNNNNNT)r  Ng      ?softip  )NNviridisr|  r6   overlayi;  -   r6   TFr   )N__doc__r  r  r   re  rC  
matplotlibr  numpyr    r   r  r   rC   r   mpl_toolkits.axes_grid1r   rt  r   r^  r   r	   mintpy.objects.colorsr
   mintpy.objects.coordr   mintpy.utilsr   r`  r   r   r   r^  mintpy.utils.mapr   r   rU   rV   default_figsize_multirX   
MPL_COLORSrD   r0   rM   rc   r   r   r   r   r   r   r  r6  r@  rp  r  r  r  r  r  r;  rB   r  r  r  r  r  r   r  r_  r6  rM  rY  r}  r  r  r  r  r   rN   r/   <module>r     sZ     	     = = 7  F - + H H ;  s  

 )6$ %$P
 HMCG@ +- `F8-`@.*+)\ VY'+9x< <> 'T >@QS_c gT =?b AH SU15Fe^a.b DFb Zz EJUWcdefbg =@ *+D4"#Q2QSY$(u8_J (,v ]@ hlbf'+M&`_D(V,b 26EsSUSXSXyZ\Z_Z_N`lp B #TVt e"P ?C\_`b`e`e\egiglgl[m.2%-P QR.2vx(&VP3f ]a7;K^ CG?CJZ <E@IGK56Pf.rN   