U
     c6                    @   s  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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 d dlmZ d dlmZmZ d dlmZmZ d d	lmZmZm Z!m"Z# d
Z$dZ%ddgZ&dZ'ddddddddddg
Z(dd Z)dlddZ*dmd!d"Z+g dfd#d$Z,dnd%d&Z-dod(d)Z.dpd+d,Z/dqd.d/Z0drd0d1Z1dsd3d4Z2dtd7d8Z3dud9d:Z4i fd;d<Z5i g d fd=d>Z6i g fd?d@Z7g dAdBdd6fdCdDZ8g i fdEdFZ9dd5dGdHgfdIdJZ:dHdd dKdHgd5d*dLd d ddMfdNdOZ;e< d fdPdQZ=dRdddKdSdSgdTdg d f	dUdVZ>dWdX Z?dvd[d\Z@ddd]ejA ejAgd fd^d_ZBde< dfd`daZCddd]ejA ejAgd fdbdcZDdwdddeZEdxdfdgZFdydhdiZGdzdjdkZHdS ){    N)pyplottickerdates)make_axes_locatable)stats)
coordinate)ColormapExt)timeseriesKeyNamestimeseriesDatasetNames)draw_lalo_labeldraw_scalebar)ptimereadfilenetworkutils0g      @      $@g      .@g       @z#1f77b4z#ff7f0ez#2ca02cz#d62728z#9467bdz#8c564bz#e377c2z#7f7f7fz#bcbd22z#17becfc                 C   s<  | j r>tj| j r>td| j  tj| j dtd	t
| _| jdk	rt| jdd| _|j| jdddf | jdddf d	d
dd | _t| jjdd| _| jdk	r8t| jdd| _zR|j| jdddf | jdddf d	d
dd | _t| jjdd| _W n tk
r6   Y nX | S )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formatnploadtxtbytesastypefloatpts_laloarrayreshape	geo2radarpts_yxT	radar2geo
ValueError)inpsZ	coord_obj r-   H/home/exouser/operations/rsmas_insar/sources/MintPy/mintpy/utils/plot.pyread_pts2inps8   s2    
r/   c                 K   sr   ddl m} ddlm} |d kr0ttjd d}||f||dddd	|}| | |jj	
|d
ddg |S )Nr   )AnchoredText)
withStrokezlegend.fontsize)size              ?F)locproppad	borderpadframeonw   )
foreground	linewidth)matplotlib.offsetboxr0   matplotlib.patheffectsr1   dictpltrcParams
add_artisttxt_textset_path_effects)axtitler5   r6   kwargsr0   r1   atr-   r-   r.   add_inner_title\   s    
 
rK         ?F      ?333333?Tc           	         s   t | ddd }|r*|d  d| 9  < |rB|d  d| 9  < ttt| tt| t|d    fdd|D }|rtd|d |d  |S )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, lenght] in inches
    Nr   r   r   c                    s   g | ]}|   qS r-   r-   .0iZ	fig_scalescaler-   r.   
<listcomp>   s     z$auto_figure_size.<locals>.<listcomp>zfigure size : [{:.2f}, {:.2f}])listminmin_figsize_singlemax_figsize_singlemaxmax_figsize_heightr   r   )	ds_shaperS   	disp_cbarZdisp_sliderZ
cbar_ratioZslider_ratior   Z	fig_shapefig_sizer-   rR   r.   auto_figure_sizei   s    

r^   c                 C   s
  |sg }t |tr|g}tjtj| \}}t| }|d }t|d t|d  }|dkrt	|dkr|d }d| kr|d7 }n(|d 
d	d }| d
r|d7 }n|tkrXt	|dkrXd| kr|d }	nd| kr|d }	nd}	|	s|d }nd|	|d }z,tj| 
dd 
|d }
||
7 }W n   Y nX n|dkrt	|dkrz|d }n|d drd}n|}n|dkrt	t| }|dkrt	|dkrtj| dd}t	|dkr|d d nd}||d  }n|}nFtj| }t|dd}|dkrRt	|dkrR|d|d 7 }|ddr|d }|d |d  |d |d   |k r|d7 }|ddr|d7 }|d d!tj tjg}|d |d  }|dtj kr|t|krt|}|t|7 }|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   ZunwCorZ_unwCor-ionZ_ionref_dateREF_DATENz{}_{}
timeseriesgeometrybperp)z.h5z.he5_ BANDS1z - {}pix_boxr   r;   _subwrapF_wrap
wrap_range      )
isinstancestrr   r   splitextbasenamer   read_attributeintlensplitlower
startswithr	   keysr   get_dataset_listrsplitgetr   pi)fnamedatasetNames	inps_dictfbasefextatrk	num_pixel	fig_titlere   processMarkZnum_dsetZfpartssuffixnum_bandboxrr   r-   r-   r.   auto_figure_title   sx    





 


&r   c                 C   s   d}d}d|   krfd|   krfd| d }| d  drNd}|d7 }nd}|d7 }|rft| |d	k	r|rz|  |r|  |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-rightN)r~   r   r|   r}   r   invert_xaxisinvert_yaxis)metadatarG   r   flip_lrflip_udmsgr-   r-   r.   auto_flip_direction   s$    
r         @c                 C   sD  | d | d  | d | d   | }|dkr2d}nt|dkr@d}nf|d	krNd
}nX|dkr\d}nJ|dkrjd}n<|dkrxd}n.|dkrd}n |dkrd}n|dkrd}nd}| d | d  | d | d   dkrd}|dkr|t d| 9 }n|dkrn|t |d  }tt |}|dkr@|r@td| td| |S )a^  Calcualte 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          @r   ztotal number of pixels: {:.1E}zL* multilook {0} by {0} with nearest interpolation for display to save memory)r   sqrtry   ceilr   r   )r   Znum_time
max_memoryr   r   multilook_numr-   r-   r.   auto_multilook_num  s@    $         $r   r   c           	      C   s   t tt| t| }t|d t|d  }|d |d  | }tt|| d}tt|| d}|dkr||}n|dkr|}t|t| |k r|d |d kr|d7 }q|d7 }qt t|}t t|}||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   rL   r4   )ry   r   r   r#   rY   r   rint)	Zsubplot_num
data_shaper]   fig_numZsubplot_num_per_figZdata_shape_ratioZ	num_ratiorow_numcol_numr-   r-   r.   auto_row_col_num8  s     	

r   r   r   r   r   c           	      C   s   | j \}}tj||dgtd}|d |ddddf< |d |ddddf< |d |ddddf< |d |ddddf< |rt| }g }t|D ]$}t|D ]}||| |  qq|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   zerosry   rU   tolistrangeappend)	axsr5   flattennrowsncolslocsZloc_listrQ   jr-   r-   r.   auto_shared_lalo_locationX  s    
r   c              	      s   |sv| d t |dd g}| d dkrB| d drB|dg7 }dd	d
ddddddg	 t fdd|D rrdnd}|rtd| |S )z7Get auto/default colormap name based on input metadata.r_   rc   r   rg   	DATA_TYPEcomplexz.slc	coherencetemporalCoherence	waterMask
shadowMask.corz.mliz.ampz.rampc                 3   s   | ]}| kV  qd S Nr-   rO   Zgray_ds_namesr-   r.   	<genexpr>{  s     z%auto_colormap_name.<locals>.<genexpr>grayjetz	colormap:)ru   r{   r}   anyr   )r   Z	cmap_namedatasetNamer   ds_namesr-   r   r.   auto_colormap_nameo  s    
    
r   r   c                 C   s  t | t |  t |   }t |t}t |t}||krZd}||g}d }nt t t 	|t}	t
|| |	 d }
|
|kr|
}||	d  ||	d  g}|rd|j|}|d7 }t| n4ddlm} || ||}d}t |t |g}d }|||fS )N   r   r   z.data has uniform and limited number ({} <= {})z) of unique values --> discretize colormapr   )multilook_data)r   uniqueisnanisfiniterV   r"   r#   rY   absdiffry   r   r2   r   mintpy.multilookr   nanminnanmax)datanum_multilookZmax_discrete_num_stepr   unique_valuesmin_valmax_valcmap_lutvlimZvstepZmin_num_stepr   r   Zdata_mlir-   r-   r.   'auto_adjust_colormap_lut_and_disp_limit  s,     
r   r   皙?c                 C   s  t |d tjrdd |D }|dk	r|d | }|d | d }t|}t|| d }	t|}
t||
 d }|	dkr|d	7 }d	}	|dkr|
d	7 }
d	}|	d	k r|d	8 }d}	|d	k r|
d	8 }
d}t||	d	dd}t|
|d	dd}nt|  \}}| || |s0td	t	
|| jd
 d t}|sj|dkrFd	}n$|dkrVd}n|dkrfd}nd}td| _| jt| | jtd |r| jttd	d| | j|d | ||fS )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   c                 S   s$   g | ]}|j | jd  d  qS )r        v@)year	timetupletm_ydayrO   r-   r-   r.   rT     s     z*auto_adjust_xaxis_date.<locals>.<listcomp>Nr   皙?      (@r   r   r      r;   r   z%Y-%m-%d %H:%M:%Sz%Y   	labelsize)rt   dtdatetimery   mdatesnum2dateget_xlimset_xlimrY   r   r   daysr"   DateFormatter	fmt_xdataxaxisset_major_locatorYearLocatorset_major_formatterset_minor_locatorMonthLocatorr   tick_params)rG   
datevectorfontsize
every_yearZbuffer_yearZevery_montht0t1y0m0y1m1xminxmaxr-   r-   r.   auto_adjust_xaxis_date  sT              $
 
 
 r  c                 C   sR   t |t| }|dkr(t|d|  }|dkr@t |d|  }| ||g | S )a  Adjust Y axis
    Input:
        ax       : matplot figure axes object
        dataList : list of float, value in y axis
        fontsize : float, font size
        ymin     : float, lower y axis limit
        ymax     : float, upper y axis limit
    Output:
        ax
    Nr   )rY   rV   set_ylim)rG   ZdataListr   yminymaxZ	dataRanger-   r-   r.   auto_adjust_yaxis  s    r	  c                    s  d|  krd|d< d|  kr(d|d< d|  kr<d|d< d|  krPd|d< d	|  krdd|d	< d
|  krxd|d
< d|  krd|d< d|  krddg|d< t|}dd |D }dd |D }tttt|| }t|\}}t	t
| d d   fdd|D }	t||}
| j|	t
j|
dd jd|d d | j|	t
j|
dd jd|d d |d
 r| d|d  t| ||d |d dd } | |d d |d d g | j|d |d d | jdd  | S )!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   rL   c                 S   s   g | ]}| d d qS rj   r   r{   rP   date12r-   r-   r.   rT     s     z*plot_coherence_history.<locals>.<listcomp>c                 S   s   g | ]}| d d qS rj   r   r  r  r-   r-   r.   rT     s     r;   r   c                    s   g | ]}| d   qS )r   r-   rO   	bar_widthr-   r.   rT     s     r   axiszMax {}labelzMin {}z({} History: Min/Max of All Related Pairsr   r   r   best)r5   )r~   r   yyyymmdd_date12sortedyyyymmddrU   setdate_list2vectorut0most_commonr   r   r   pnetcoherence_matrixbarr   r   r   r   	set_titler  r  
set_ylabellegend)rG   
date12ListcohListp_dictm_datess_datesdateListr   r   x_listcoh_matr-   r  r.   plot_coherence_history  sJ            
((
r3  c           /   	      sV  d|  krd|d< d|  kr(d|d< d|  kr<d|d< d|  krPd|d< d|  krdd	|d< d
|  krxd	|d
< d|  krd|d< d|  krd|d< d|  krd|d< d|  krd|d< d|  krd|d< d|  krddg|d< d|  kr
d|d< d|  kr d|d< d|  kr6d|d< d|  krLd|d< d|  krbd	|d< t|d trt|d j}n0t|d tjjr|d }ntd	|d |d  d}t
tt
\}	t
d  }
t
t}t|}t|}t|D ]T}| d!\}}|}|}| |  ||< |
| |
|  ||< q|rtd"	tt| td#	t| tttt| }|sd$|d< d%d& |D }d'd& |D }t
ttt|| }tttt| }fd(d&|D }fd)d&|D } d	k	r8t }t }|d d  }|d d }|rtd* td+	||g td,	|d  |d rt| jd-|d |d d.}tjj||d/}tjj |||d0} | j!j"|d d1 | j#|d |d d2  fd3d&|D }!d4d& tt$|!|D }|rfd5d&|D }"fd6d&|D }#| j%|"|#d7d|d |d d8 |rćfd9d&|D }"fd:d&|D }#| j%|"|#d7d|d d;d8 |d r|D ]}$|$d!\}%}&|%}'|&}(t&|' |( g})t&|' |( g}* d	k	rl |$ }+|+| ||  },| j%|)|*d<|d |||,d= n| j%|)|*d<|d |d>d= q|D ]}$|$d!\}%}&|%}'|&}(t&|' |( g})t&|' |( g}* d	k	r( |$ }+|+| ||  },| j%|)|*d?|d |||,d= n| j%|)|*d?|d |d>d= q|d rb| j'd@|d d2 t(| |	|d |d dAd  } t)| |d d2} | j*|d
 |d d2 | j+|d |d d2 | j"dBdC|d dddddD |d d	k	r| j,|d dEd>dF|d dG |d rR|d rRtj-j.g g d>dHdIdJ}-tj-j.g g d>dKdLdJ}.| j/|-|.gdM | S )Nai  Plot Temporal-Perp baseline Network
    Inputs
        ax : matplotlib axes object
        date12List : list of string for date12 in YYYYMMDD_YYYYMMDD format
        dateList   : list of string, for date in YYYYMMDD format
        pbaseList  : list of float, perp baseline, len=number of acquisition
        p_dict   : dictionary with the following items:
                      fontsize
                      linewidth
                      markercolor
                      markersize

                      cohList : list of float, coherence value of each interferogram, len = number of ifgrams
                      colormap : string, colormap name
                      disp_title : bool, show figure title or not, default: True
                      disp_drop: bool, show dropped interferograms or not, default: True
    Output
        ax : matplotlib axes object
    r   r   r=   r   r  r  r  r,  NxlabelylabelzPerp Baseline [m]
cbar_labelzAverage Spatial Coherence	cbar_size3%r\   TcolormapRdBur   r   rL   r  Z	disp_dropdisp_legendr   r   numberunrecognized colormap input: {}ffffff?r   rj   z$max perpendicular baseline: {:.2f} mz#max temporal      baseline: {} daysFc                 S   s   g | ]}| d d qS r  r  rO   r-   r-   r.   rT   u  s     z plot_network.<locals>.<listcomp>c                 S   s   g | ]}| d d qS r  r  rO   r-   r-   r.   rT   v  s     c                    s   g | ]}  |qS r-   indexrO   r0  r-   r.   rT   y  s     c                    s   g | ]}  |qS r-   r?  rO   rA  r-   r.   rT   z  s     zshowing coherencezdata range: {}zdisplay range: {}rightr7   )vminvmax)cmapnormr   r  c                    s   g | ]}  | qS r-   r?  rO   )r,  r+  r-   r.   rT     s     c                 S   s   g | ]\}}|qS r-   r-   )rP   rj   xr-   r-   r.   rT     s     c                    s   g | ]} | qS r-   r-   rO   r   r-   r.   rT     s     c                    s   g | ]} | qS r-   r-   rO   	pbaseListr-   r.   rT     s     koalphamsmfcc                    s   g | ]} | qS r-   r-   rO   rI  r-   r.   rT     s     c                    s   g | ]} | qS r-   r-   rO   rJ  r-   r.   rT     s     r   --)lwrN  cr   rc   zInterferogram Networkr  bothinwhich	directionr   bottomtopleftrB  )gQ?gq=
ףp?zaxes fractionxycolorxycoordsr   solidzIfgram used)r^  lsr  dashedzIfgram dropped)handles)0r~   rt   ru   r   r9  mplcolorsLinearSegmentedColormapr+   r   r   r   r  r"  date_list2tbaser  rz   r   r   r   r{   r@  r   rY   r   rU   r!  rV   r   append_axes	NormalizecolorbarColorbarBaserG   r   	set_labelzipplotr%   r(  r  r	  
set_xlabelr)  annotatelinesLine2Dr*  )/rG   r+  r0  rK  r-  date12List_dropr   rF  transparencyr   Z	tbaseListZ
ifgram_numZpbase12Ztbase12rQ   Zm_dateZs_datem_idxZs_idxZdate12List_keepr.  r/  ZdateList_keepdateList_dropZidx_date_keepZidx_date_dropZdata_minZdata_maxdisp_mindisp_maxcaxrG  cbarZcohList_keepr1  y_listr  date1date2idx1idx2rH  yvalZval_normZ
solid_lineZ	dash_liner-   )r,  r+  r0  r   rK  r.   plot_network&  s                    











 


 
    r  c              	      s  d|  krd|d< d|  kr(d|d< d|  kr<d|d< d|  krPd|d< d|  krdd	|d< d
|  krxd|d
< d}t|}t|\ }ttt|}g }|D ]"}	||	}
||
 |	|
 q|r fdd|D }fdd|D }| j
||d||d |d |d d |rb fdd|D }fdd|D }| j
||d||d dd |d r~| jd|d d t| ||d |d
 dd } t| |d d} | jd|d d | S )a   Plot Perpendicular Spatial Baseline History
    Inputs
        ax : matplotlib axes object
        dateList : list of string, date in YYYYMMDD format
        pbaseList : list of 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 of string, date dropped in YYYYMMDD format
                          e.g. ['20080711', '20081011']
    Output:
        ax : matplotlib axes object
    r   r   r=   r   r  r  r  r  Tr   r   r>  c                    s   g | ]} | qS r-   r-   rO   rI  r-   r.   rT      s     z+plot_perp_baseline_hist.<locals>.<listcomp>c                    s   g | ]} | qS r-   r-   rO   rJ  r-   r.   rT     s     z-ko)rN  rR  rO  rP  c                    s   g | ]} | qS r-   r-   rO   rI  r-   r.   rT     s     c                    s   g | ]} | qS r-   r-   rO   rJ  r-   r.   rT     s     rL  r   rM  zPerpendicular Baseline Historyr  r  r   zPerpendicular Baseline [m])r~   r   r   r"  rU   r   rz   r@  remover   rn  r(  r  r	  r)  )rG   r0  rK  r-  rv  rt  r   Zidx_keepZidx_droprQ   idxr1  r{  r-   )r   rK  r.   plot_perp_baseline_hist  sZ          


  
r  g     Fr:  c                    s  t |trt|j}nt |tjjr&ntd|t	
||}|rdd |D }	dd |D }
ttt|	|
  |D ].} fdd|dD \}}tj|||f< qx|jd }tt| \}}tt|| }tt|}tj||dk< | j|d	dd
d}|tj || j  | j||d|d}|tj || j  t|d d d }| dt|d d d  |r|  d| n|  d| | | ! "g  | # "g  | $d | |fS )zSPlot Rotated Coherence Matrix, suitable for Sentinel-1 data with sequential networkr=  c                 S   s   g | ]}| d d qS r  r  rO   r-   r-   r.   rT   (  s     z5plot_rotate_diag_coherence_matrix.<locals>.<listcomp>c                 S   s   g | ]}| d d qS r  r  rO   r-   r-   r.   rT   )  s     c                    s   g | ]}  |qS r-   r?  rO   	date_listr-   r.   rT   ,  s     rj   r   r3   gray_rrL   )rF  rD  rE  r   )rD  rE  rF  r   r   ?r   r>  rs   off)%rt   ru   r   r9  rd  re  rf  r+   r   r%  r&  r  rU   r!  r{   r   nanr   wherer   rY   r   diagonesimshowset_transform
transformsAffine2D
rotate_deg	transDatar   r   r  	get_xaxis	set_ticks	get_yaxisr  )rG   Zcoh_listdate12_listZdate12_list_dropr  rF  Z	disp_halfrw  r2  r.  r/  r  r~  r  Znum_imgnum_conndiag_matimr  r-   r  r.   !plot_rotate_diag_coherence_matrix  s>    


r  c              	      s  d|  krd|d< d|  kr(d|d< d|  kr<d|d< d|  krPd|d< d	|  krdd|d	< d
|  krxd|d
< d|  krd|d |d< d|  krd|d< d|  kr|d |d< d|  krd|d< d|  krd|d< d|  krd|d< d|  krd|d< t|d tr4t|d j}n0t|d tjjrR|d }nt	d|d t
|}t||}|rdd |D }dd |D }ttt||  |D ]0}	 fdd|	dD \}
}tj||
|f< qtt|jd }tj||dk< | j|ddd d!d"}| j|||d d |d d# d!d"}|jd }|d$k r\d%}n$|d&k rld'}n|d(k r|d)}nd$}ttd||}|  | |  | | jd*|d d+ | jd*|d d+ | jd,d-|d ddddd. |d
 r| |d  |d rJt | }|j!d/d0d0d1}t"j#||d2}|j$|d |d d+ |r|d r| j%g g d3d4 | j%g g d5d4 | j&|d dd6 | ||fS )7a  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 settting
    Returns:    ax : matplotlib.pyplot.Axes
                coh_mat : 2D np.array in size of [num_date, num_date]
                im : mappable
    r
  r  r   r   r=   r   r  r  r  r  Tr   z	{} Matrixr9  r   r6  r   )r   rL   r\   
legend_locr  r;  r=  c                 S   s   g | ]}| d d qS r  r  rO   r-   r-   r.   rT   s  s     z)plot_coherence_matrix.<locals>.<listcomp>c                 S   s   g | ]}| d d qS r  r  rO   r-   r-   r.   rT   t  s     c                    s   g | ]}  |qS r-   r?  rO   rA  r-   r.   rT   x  s     rj   r   r3   r  rL   nearest)rF  rD  rE  interpolationr      r   2   
   d   r   zImage Numberr  rT  rU  rV  rB  r8  rC  )ry  zUpper: Ifgrams usedr  zLower: Ifgrams all)r5   handlelength)'r~   r   rt   ru   r   r9  rd  re  rf  r+   r   r  r%  r&  r  rU   r!  r{   r   r  r  r  r   r  r   r  r  r  ro  r)  r   r(  r   rh  rA   rj  rl  rn  r*  )rG   r+  r,  rs  r-  rF  r2  r.  r/  r  r~  r  r  r  Zdate_numZ	tick_stepZ	tick_listdividerry  rz  r-   rA  r.   plot_coherence_matrixJ  s                 





 
 
    

r  	   r;   c              
      s  t | \} tt|}tjdd|d\}}|d }|j|ddd}	t fdd	d
D r|j	t d t d dddd t
 |dd |j|	|d |jd|d |d }|j|t|   d|fd|d |jd|d |jd|d |jt  |jtjddd |jtjdddd |jt  |D ]}|jdd |ddddd! qH|  d"tj | d }
t!d#|
 |j"|
d$dd%d& |rt#  n
t$| d'S )(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.
    r   r   )r   r   figsizer   RdBu_rr  )rF  r  c                 3   s   | ]}|   kV  qd S r   )r~   rP   keyr   r-   r.   r     s     zBplot_num_triplet_with_nonzero_integer_ambiguity.<locals>.<genexpr>)REF_YREF_Xr  r  swhiter;   )r^  rO  F)rG   r   )rG   z	$T_{int}$r  T)r   logbinsz0# of triplets w non-zero int ambiguity $T_{int}$z# of pixelsr      )basenumticks)	r   r   g333333?g?r4   g333333?r>  g?r  )r  r  subsrT  rU  rV  z{}.pngzplot and save figure to filetight,  bbox_inchestransparentdpiN)%r   readry   r   r   rA   subplotsr  allrn  r   rj  r(  histr   r   ro  r)  r   r   r   AutoMinorLocatoryaxisr   
LogLocatorset_minor_formatterNullFormatterr   tight_layoutr   r   r   rv   r   savefigshowclose)r   display	font_sizer]   r   rE  figr   rG   r  out_figr-   r  r.   /plot_num_triplet_with_nonzero_integer_ambiguity  sF    	$&
   



r  r   r  zResidual phase RMS [mm]c              	   C   s  t j| tdt}|dddf t jd }t|dddf }t|\}}t 	|}z(t
tjt | ddd d	 }W n(   t 
t | d d	 }Y nX t 	|}tj|d
\}}|j|||jdd t |}|j|| || |jddd tj|d|d}||k}t |dkrJ|j|| || |jddd t||||d\}}}|jt 	||gt 	||gdd|d t|t |||dd}|j||d |jdd|ddddd |	rt|}|jddd d!}|jt |j t jd" |d#d$dd% |jt |j t j| d" || d#d$dd% t |dkrt|jt |j t j| d" || d#d$dd% |t 	ddgt 	||gd |!|"  |#ddg |jdd|ddddd |$ %g  |& 'g  |r|j(|d&|d' |
rf|" \}}|| d( }|| d"||  kr8|d)9 }|j)d|||| d*  || fd+d,|d- |rt*d.| |j+|d/dd0 |rt,  nt-  dS )1aH   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   Nr        @@r   r   )r   r;   r   r  C0)r^  C1zReference date)r^  r  r3   )centercutoffTdarkgrayzExclude date)r   z--kzMedian Abs Dev * {}r  )r  r  rT  rU  rV  rB  z10%z2%rC  r4   onone)rP  r^  F)r5   r9   r   r   rs   g?r   r   r\  zsave figure to file:r  )r  r  ).r   r    r!   r"   ru   float32rU   r   r"  r%   rV   r#  r$  r   r   rA   r  r'  r   argminmedian_abs_deviation_thresholdr   r  rn  r   r	  r   r)  r   r   rh  r  r   r  get_ylimr   r  r  r  set_ticklabelsr*  rp  r   r  r  r  )rms_filer  r  disp_figr]   r  Ztick_year_numr  r;  Zdisp_side_plotZdisp_thres_textr5  fcrms_listr  r   r   r  rmsr  rG   ref_idxZrms_thresholdZex_idxr  r  r  ax2r  r  yoffr-   r-   r.   plot_timeseries_rms  s    
("


   $,,"
     

r  c           #         s0  ddl m} |rtndd } j\}}t jtr>t jjn j}	t|}
d|
d< t	|
 j
dd } jrr jn
|d	d
} jr jn
|dd
}||||\}}}|jdkrtd||| td | S  jrf jd
k	rf jjdkr jntj jdd}t|}|||dd \}}|||f dk}|| }|| }|| }|jdkrftd jr j|krtd j|d } jr|dkrd
 _|d|  jr|d d}||dkrdnd7 }|d j7 }| jrd jnd7 }|| |dt| |d| |d| |d j |dkrbdnd}|j||||| j j| j d 	} jr|! " j}|| }t#|s||8 }||9 } j$r4tj% fd!d"|D tj&d#}t'|dkr4|d$||  ||  }||  }||  }||  }t#|}t'|dkrt|d%t'| |d&||  t(|||D ]J\}}} t#| s|	| | ||  }!| j)|||! j*d d'd(d)d* qn&|d+ | j)|| j*d d,d'd(d)d-  j+r,t(|||D ]"\}"}}| j,|"||f j-d. q| S )/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   )gpsc                  _   s   d S r   r-   argsrI   r-   r-   r.   <lambda>L      zplot_gps.<locals>.<lambda>mUNITr   	disp_unitr   
START_DATENEND_DATEz'No GNSS found within {} during {} - {}!zContinue without GNSS plots.r   r  zNo GNSS left after --mask-gps!z,input reference GPS site "{}" not available!r_   )velocityrg   displacementzZWARNING: --gps-comp is not implemented for {} file yet, set --gps-comp = None and continuez------------------------------zplotting GPS r  r  z in {} directionz with respect to {} ...z ...z$number of available GPS stations: {}zstart date: {}zend   date: {}zcomponents projection: {})	metaobs_type
site_names
start_dateend_dategps_comphorz_az_angler   redoc                    s   g | ]}| j kqS r-   ex_gps_sitesrP   rH  r,   r-   r.   rT     s     zplot_gps.<locals>.<listcomp>r   z-ignore the following specified stations:
  {}zLignore the following {} stations due to limited overlap/observations in timez  {}r   r4   r  )r^  r  
edgecolorsrR  zorderzshowing GPS locationsr:   )r  r^  r  rR  r   )r]  r   ).mintpy.objectsr  r   r   rt   r9  ru   r   r@   scale_data2disp_unitr  gps_start_dater   gps_end_date
search_gpsr2   warningswarnr   mask_gpsmskndimr   prodr   r'   r+   ref_gps_sitegps_componentrz   get_gps_los_obsr  gps_redor   r@  r   r  r%   bool_sumrm  scattergps_marker_sizedisp_gps_labelrp  r  )#rG   SNWEr,   r   r   r  vprintrD  rE  rF  r   unit_facr  r  r  	site_lats	site_lonsr	  coordZsite_ysZsite_xsflagr   r   r  site_obsref_indref_valex_flagZnan_flaglatlonobsr^  	site_namer-   r  r.   plot_gpsA  s    


"




$r$  zgps_enu2los.csvr   ZInSARc
           /   	      sn  d}
d}dddddg}t |}dgd	g|d
   }td| tj||ddd}|d }|d }|d }||d  | } rtj fdd|D tjd}t|dkr||  }||  }||  }||  }td|  t	| }t
|d t
|d  }}t|||dd \}}|r4t|d ntj||ftjd}|j}tj|tjdtj }tj|d}t|D ]}|| ||  }} d|  kr|k rn nZd|   kr|k rn n>|| |f r|| |d
 | d
 f}!tj| d|!dd | ||< |j|d
 d|d
 ||| d qx|  t|| }"td|"dd  |rtd!|  | |}#|||# 8 }|||# 8 }td"| tt| t| }$|dk	rtd#||
 |$||d k9 }$|$||d
 k9 }$|$||d k9 }$|$||d
 k9 }$||$ }||$ }||$ }td$t|t| td%t|t| tt|| d |jd
  }%t !||d }&td&|%|
 td'|& t"j#t$|| dd(}'td)|'dd*|  td+ t%|||D ]F\}(})}*t$|)|* |'| krt|(d,d-|)d.d/|*d.d0|
  q|	rdt&j'd1d2i |dkrt(|t)|g}|d
 |d  d3 }+|d |+ |d
 |+ g}t&j*|d4\},}-|-+|d |d
 f|d |d
 fd5 |-j+||d6d7d8 |-,| |--| |-.| d9|
 d: |-/d;|
 d: |-0d<d= |,1  d>|2 }.t&j3|.d?dd@dA tdB|. t&4  |||fS )Ca  Scatter plot to compare the velocities between SAR/InSAR and GPS.

    Parameters: vel_file     - str, path of InSAR LOS velocity HDF5 file.
                csv_file     - str, path of GNSS CSV file, generated after running view.py --gps-comp
                msk_file     - str, path of InSAR mask file.
                ref_gps_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 GPS observations
                ex_gps_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
                gps_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/gps_enu2los.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_gps_scatter(vel_file, ref_gps_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 GPS velocity from file: {},T)r   	delimiternamesr   c                    s   g | ]}| kqS r-   r-   r  r  r-   r.   rT     s     z-plot_insar_vs_gps_scatter.<locals>.<listcomp>r   r   z!read InSAR velocity from file: {}ra   r`   Nr   )maxValuer  )r   r   z{}/{} {})r   zAmedian offset between InSAR and GPS [before common referencing]: z.2fz cm/yearz-referencing both InSAR and GPS data to site: z+removing sites with NaN values in GPS or {}z%pruning sites with value range: {} {}zGPS   min/max: {:.2f} / {:.2f}zInSAR min/max: {:.2f} / {:.2f}zRMSE = {:.2f} {}zR^2 = {:.2f})r  zAPreliminary outliers detection: abs(InSAR - GNSS) > med abs dev (z) * zSite:  InSAR  GNSSr  z: z5.1fz, z  z	font.sizer   r   r  zk--.r  )rO  z []zGNSS [equalr   z{}_vs_gps_scatter.pdfr  r  r  zsave figure to file)5rz   r   r   r   
genfromtxtr%   r  r  r   rx   ry   r   r'   r  r  r2   r   r  r  r   progressBarr   updater  	nanmedianr   r@  multiplyr   r   r   r   r   Z
linregressr#  median_abs_deviationr   rm  rA   rB   rV   rY   r  rn  r   r  ro  r)  
set_aspectr  r|   r  r  )/Zvel_filecsv_fileZmsk_filer  r  r]   xnamer   r  r  r  r  	col_namesnum_col	col_typesr  ZsiteslatslonsZgps_obsr  r   lengthwidthysxsr	  num_siteZ	insar_obsprog_barrQ   rH  r  r   Zoff_medr  r  rmser2Zdiff_madr#  Z	insar_valZgps_valZvbufferr  rG   r  r-   r  r.   plot_insar_vs_gps_scatter  s    




(F(
"(
&


rJ  c           	      C   s  | j s| jd | jd  d }| jd | }| jd | }|| jd kr^|| jd kr^d| _ nN|| jd kr|| jd krd| _ n*|| jd kr|| jd k rd| _ nd| _ | jdkrd	}nd
}t| dd }| jr&| jd | jd  dtj kr&t	j
|||tj dtjgd}|jdddg nD|d k	rVt| jdkrVt	j
|||| jd}nt	j
|||| j d}| jr| jdkr|| j ntj| jd|_|  |jjdd| j| jd | jr|j| j| j| jd n"| jdkr|j| j| j| jd | |fS )Nr   r   MbP?neitherrV   rY   rT  )r[  rB  vertical
horizontalr   r   )ry  orientationticksz-$\pi$0z$\pi$r   )ry  rO  extendr   )nbinsout)rW  rX  r   re  )r   r^  rm   )cbar_extr   dlimcbar_locgetattrrp   rr   r   r   rA   rj  rG   set_yticklabelsrz   r   
cbar_nbinsr  r   MaxNLocatorlocatorupdate_ticksr   r  
font_colorr6  rl  r  )	r,   r  ry  epsilonrD  rE  rO  r   rz  r-   r-   r.   plot_colorbarI  s@       
(r`  rB  r  c           
   	   C   s   |dkr|   }|  }|  }|dkr0| }tt|| }|dkrr|d }||jkr|jd }|d }n|d }|dkrd}|d }| jj	d|| || f|| || ft
d|d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
    NrB  r   r   rk   z->rQ  )
arrowstyler^  	linestyle)xytextr]  
arrowpropsr2   )	get_color	get_xdata	get_ydatameanr   r  absoluter2   axesrp  r@   )
linepositionrX  r2   r^  xdataydataZ	start_indZend_indannr-   r-   r.   	add_arrow}  s.    


rp  rs   c                 C   s   |sd| d  dd}| dd}| d  }|dkrX|dd	 d
rX|dsXd}n|dkrdd}|r|dd	 dkrd}td| n<|dd	 dkr|d |d	  dtj	 krd}|rtd ||fS )zGet auto disp_unit for input dataset
    Example:
        if not inps.disp_unit:
            inps.disp_unit = pp.auto_disp_unit(atr)
    r_   r1  rk   r   r  r  )rg   giantTimeseriesr  HDFEOS/r   r  r   cm)mlislcampdB)radianr  rt  mmrm   pixelFz/WARNING: re-wrap is disabled for disp_unit = {}ry  r   r   z+change disp_unit = radian due to rewrapping)
replacer   r|   r{   endswithr}   r   r   r   r   )r   r  rp   rr   r   ftyper   r-   r-   r.   check_disp_unit_and_wrap  s*    ,r  c                 C   s  |sd|d< d}|d   d}|  d}||krF| |d |fS |d dr|d dkrl|d9 }n|d dkr|d	9 }n|d d
kr|d9 }n|d dkr|d9 }n|d dkr|d9 }n|d dkr|d9 }n|d dkr|d9 }nl|d dkr|d9 }nT|d dkr |d9 }n<|d dkrNdtj t|d  }||9 }ntd|d  |d dkrt|d9 }nF|d dkr|d9 }n.|d d
kr|d9 }n|d dkr|d9 }n|d dkrt|d  dtj  }|d dkr||d 9 }q|d dkr||d	 9 }n|d d
kr:||d 9 }n|d dkrV||d 9 }n|d dkrv||d d 9 }n|d dkr||d 9 }nr|d dkr||d 9 }nV|d dkr||d 9 }n:|d dkr||d 9 }n|d dkrntd|d  n|d d kr|d d!krz| d"k	rzd#|d< |d$ d%kr^d&ttj| dd"d' } nd(ttj| dd"d' } n0z|t|d  }W n   td)|d  Y nX ntd*| |d g}t	|d+krfzj|d d,krd-|d< nN|d d.krd/|d< |d09 }n.|d d1kr(d2|d< |d39 }ntd4|d  W n   |
d- Y nX |d d |d  }n|d }| d"k	r|dkr| tj|| jd59 } | ||fS )6aQ  Scale data based on data unit and display unit
    Inputs:
        data    : 2D np.array
        metadata  : dictionary, meta data
        disp_unit : str, display unit
    Outputs:
        data    : 2D np.array, data after scaling
        disp_unit : str, display unit
    Default data file units in MintPy are:  m, m/yr, radian, 1
    r  r  rL   rs  r   rz  r  rt  r%  dmr   kmrK  )rU  inchgo_C@)ftfootgD
)?
@)ydyardgA	3m?)mimilegp\D?)radiansry  radrg      
WAVELENGTHz'Unrecognized display phase/length unit:g{Gz?r   ry  r   r   zUnrecognized phase/length unit:rm   dbNrx  r_   )r   z.intz.unwr  )a_mina_maxr   zUn-scalable display unit:zUn-scalable data unit:r   )r  yrr   r   )r  monmonthr  r   )ddayr  r   z#Unrecognized time unit for display:r   )r|   r{   r}  r   r   r#   r   log10cliprz   r   r%   r   )r   r   r  rS   	data_unitZrange2phasephase2ranger-   r-   r.   r    s     
 
 
 
 
 
 
 
 

 
 
 
          

 
  
  
r  c                 C   s   |st |d|||d\}}d}||d ks>t| ||d\} }}|r||d t| |d  |d |d   } |r|td| | |||fS )	ar  Scale 2D matrix value according to display unit and re-wrapping flag
    Inputs:
        data - 2D np.array
        metadata  - dict, including the following attributes:
               UNIT
               FILE_TYPE
               WAVELENGTH
        disp_unit  - string, optional
        wrap - bool, optional
    Outputs:
        data
        disp_unit
        wrap
    N)r  rp   rr   r   rL   r  r  r   r   zre-wrapping data to {})r  r  r   modr   r   )r   r   r  rp   rr   r   
disp_scaler-   r-   r.   scale_data4disp_unit_and_rewrap9  s$    
(r  c	              	      s$  |rt ndd }	t|   d }
|s|
dkrd| krdD ]\}d| krJd}tj| d	rfd
|}tjtj	| t
|}tj|r qq:d}q:d}tjt
|rzt|t fdddD r2d}tdd  fD r|dd }d|}tj||||dd }|	dtj| nRd}d|}|d|  d  d 7 }|d|d d 7 }|d7 }|	| W n   d}|	d| Y nX n|
dkr|dd tkr<| }tj| d|dd }|	d|
 nR| d r<| }t| d!}|d" dd d#k}W 5 Q R X |	d$tj|  |dk	r|| dkrt|jd | }t|jd | }|t|d% d|t|d% d|f }|d|d|f }|dk	rd|t|< |dk	rd|||k < |	d&|  |dk	rd|||k< |	d'|  |dk}||fS )(a  Find and read mask for input data file fname
    Parameters: fname       : string, data file name/path
                mask_file   : string, optional, mask file name
                datasetName : string, 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   : string, file name of mask data
    c                  _   s   d S r   r-   r  r-   r-   r.   r  i  r  zread_mask.<locals>.<lambda>r_   )r  rg   r	  )zmaskTempCoh.h5zmaskResInv.h5ZPhaseVelocityNZgeo_zgeo_{}c                 3   s&   | ]}t | t  | kV  qd S r   )ry   r  r   Zatr_mskr-   r.   r     s     zread_mask.<locals>.<genexpr>)ra   r`   c                 s   s   | ]}|d  dkV  qdS )r_   rb   Nr-   )rP   r  r-   r-   r.   r     s     rc   r   zconnectComponent-{})r   r   r   r   zread mask from file:z9WARNING: input file has different size from mask file: {}z,
    data file {} row/column number: {} / {}ra   r`   z,
    mask file {} row/column number: {} / {}z
    Continue without mask.zCan not open mask file:)rr  mask)r   r   zread {} contained mask dataset.z	PARAMS.h5r  cmaskrL   zread {} contained cmask datasetr   zhide pixels with mask value < zhide pixels with mask value > )r   r   rx   r   r   rw   r}   r   joindirnameru   r   r  r{   r  r
   r}  h5pyFilery   r   r   r   )r   	mask_filer   r   xstepysteprD  rE  r   r  r   r  dsNamer  r   fxsizeysizer-   r  r.   	read_mask_  s    










r  c                 C   sH  |rt dtj|  t| }|d dkr6d}nd }t|}|d krfddt|d t|d f}|rv|	|}n|}|j
|dd	}tj| |||d
\}	}|d k	r>||kr>|rt d tj|d |d  |d |d  f|	jdtj }
|	|
|d |d  |d |d  |d |d  |d |d  f< t|
}	|	||fS )Nzreading DEM: {} ...r_   rh   heightr   r`   ra   Fr   )r   r   r   z align DEM to the input data filer;   r   r   r   )r   r   r   r   rw   r   rx   r   ry   box_geo2pixelcheck_box_within_data_coverager  r   r   r   r  r%   )dem_filern   geo_boxr   dem_metadatar  r  dem_pix_boxZbox2readdemZdem_tmpr-   r-   r.   read_dem  sF    

  
r  c              	   C   st  d}d}d}|dkrt  }|jdkr4t| d |_|jrddlm} ||j|jd}t	
 4 t	jdtd |j| |jtd	j|j|jd
}W 5 Q R X tj|t|dddddf < |rd|jdd|jdd}|d|j d|j d|j d7 }t| |jrt| t|  |jd k rzdt| ddt| dd}|d|jd dd7 }|d7 }t| n^ddlm}	 |	j| |jdd}tj|jd|jd}|rd|j d}|d|j 7 }t| |rj|jrj|dk	s|dk	rjd d! ||fD d }
|jj|
krb|r,td" |dk	rFtj||jdk< |dk	rjtj||jdk< ntd# |||fS )$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.array in size of (length, width, 4)
                dem_contour : 2D np.array in size of (length, width)
                dem_contour_sequence : 1D np.array
    Examples:   dem = readfile.read('inputs/geometryRadar.h5')[0]
                dem_shade, dem_contour, dem_contour_seq = pp.prepare_dem_background(dem=dem)
    Ng     8@i  r   )LightSource)azdegaltdegignore)categoryr   )	vert_exagrF  rD  rE  z show shaded relief DEM (min/max=z.0frs  z m; zexag=z	; az/alt=z deg)r   zWARNING: elevation range (z.1frc   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 c                 S   s"   g | ]}|d k	r|j d d qS )Nr   )r   r  r-   r-   r.   rT   /  s      z*prepare_dem_background.<locals>.<listcomp>z2mask DEM to be consistent with valid data coveragezJWARNING: DEM has different size than mask, ignore --mask-dem and continue.) cmd_line_parse	shade_maxr   r   disp_dem_shadematplotlib.colorsr  shade_azdegshade_altdegr  catch_warningssimplefilterRuntimeWarningshade
shade_exagr   r9  	shade_minr  r   r   disp_dem_contourr   dem_contour_stepscipyr  gaussian_filterdem_contour_smootharangemask_demr	  r   )r  r,   r   	dem_shadedem_contourZdem_contour_sequencer  ra  r   r  Z	dem_shaper-   r-   r.   prepare_dem_background  s\    


"" "
"

r  c                 C   s  |dkrt  }tdd |||fD rB|dk	rBt|||d\}}}|dk	rh|d |d |d |d f}nrt|d	r~t|j}	n0d
d |||fD d }
dd|
jd |
jd f}	|	d d |	d d |	d d |	d d f}|dk	r8tdddd}|dk	r| j|fd|i| n$t	| t
jr8| j|fd|i| |dk	r|dk	rtdd|jddd}|dkrrd|d< |dk	rtj|d |d |jd d |d |d |jd d f \}}| j||||fd|i| n&t	| t
jr| j||fd|i| | S )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.array in size of (length, width, 4)
                dem_contour : 2D np.array in size of (length, width)
                dem_contour_sequence : 1D np.array
                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:   m = pp.plot_dem_background(m, geo_box=inps.geo_box, dem=dem, inps=inps)
                ax = pp.plot_dem_background(ax=ax, geo_box=None, dem_shade=dem_shade,
                                            dem_contour=dem_contour, dem_contour_seq=dem_contour_seq)
    Nc                 s   s   | ]}|d kV  qd S r   r-   rO   r-   r-   r.   r   U  s     z&plot_dem_background.<locals>.<genexpr>)r,   r   r   r   r;   r   rn   c                 S   s   g | ]}|d k	r|qS r   r-   rO   r-   r-   r.   rT   b  s      z'plot_dem_background.<locals>.<listcomp>r4   spline16upper)r  r   originextentblack)r  re  
linewidthsrN  r   r   y              ?)r  r  r  hasattrtuplern   r   r@   r  rt   rA   Axesdem_contour_linewidthr   mgridcontour)rG   r  r  r  dem_contour_seqr  r,   r   Z
geo_extentrn   r   Z
rdr_extentrI   yyxxr-   r-   r.   plot_dem_background=  sX      

 


 

  r  )N)rL   FFrM   rN   T)NT)r   T)r   )r   F)NNT)r   r   T)r   Nr   N)r   NN)NrB  r  N)NNNr   r   NNT)NNT)NT)NNNNNNT)Ir   argparser  r   r   r  numpyr   
matplotlibrd  r   rA   r   r   r   mpl_toolkits.axes_grid1r   r  r   mintpy.objects.coordr   Zmintpy.objects.colorsr   r  r	   r
   Zmintpy.utils.mapr   r   mintpy.utilsr   r   r   r%  r   r#  rW   rX   default_figsize_multirZ   	mplColorsr/   rK   r^   r   r   r   r   r   r   r   r  r	  r3  r  r  r  r  r  r  r@   r$  rJ  r`  rp  r   r  r  r  r  r  r  r  r-   r-   r-   r.   <module>   s   $
      
d

0
 


&  
8
) .F   
1Z<     
a    
 
4
1!j
&      
l
(
J      