B
    Qaw             
   @   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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 d d	lm Z 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+dkddZ,dd Z-dlddZ.dmd$d%Z/g dfd&d'Z0dnd(d)Z1dod+d,Z2dpd.d/Z3dqd1d2Z4drd3d4Z5dsd6d7Z6dtd:d;Z7dud<d=Z8i fd>d?Z9i g d#fd@dAZ:i g fdBdCZ;g dDdEd d9fdFdGZ<g i fdHdIZ=dvdJdKZ>dwdLdMZ?dxdNdOZ@eA d#fdPdQZBdRdS ZCdd dTejD ejDgd#fdUdVZEdeA dfdWdXZFdd dTejD ejDgd#fdYdZZGdyd[d\ZHdd]d-d^d_d]d`gfdadbZIddd-d d d-gd]d8ddeJ d#f	dcddZKded9d9dfgdgd8dhfdidjZLdS )z    N)pyplottickerdates)make_axes_locatable)crs)geoaxesr   )
coordinate)ColormapExt)timeseriesKeyNamestimeseriesDatasetNames)	arg_groupptimereadfilenetworkutils0g      @g      $@g      .@g       @z#1f77b4z#ff7f0ez#2ca02cz#d62728z#9467bdz#8c564bz#e377c2z#7f7f7fz#bcbd22z#17becf c             C   s   t jdd}t|}t|}t|}t|}t|}t|}t	|}t
|}t|}t|}|j| d}|S )NzPloting Parser)description)args)argparseArgumentParserr   add_data_disp_argumentadd_dem_argumentadd_figure_argumentadd_gps_argumentadd_mask_argumentadd_map_argumentadd_point_argumentadd_reference_argumentadd_save_argumentadd_subset_argument
parse_args)iargsparserinps r$   G/home/centos/operations/rsmas_insar/sources/MintPy/mintpy/utils/plot.pycmd_line_parse;   s    









r&   c             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| _yR|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)r#   Z	coord_objr$   r$   r%   read_pts2inpsL   s&    
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)sizeg        g      ?F)locproppad	borderpadframeonw   )
foreground	linewidth)matplotlib.offsetboxrA   matplotlib.patheffectsrB   dictpltrcParams
add_artisttxt_textset_path_effects)axtitlerD   rE   kwargsrA   rB   atr$   r$   r%   add_inner_titlep   s    

rZ         ?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)	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_heightr1   r2   )	ds_shapera   	disp_cbarZdisp_sliderZ
cbar_ratioZslider_ratior,   Z	fig_shapefig_sizer$   )r`   ra   r%   auto_figure_size}   s    
rl   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 }n|tkr@t	|dkr@d
| kr|d
 }	nd| kr|d }	nd}	|	s|d }nd|	|d }y,tj| 
dd 
|d }
||
7 }W n   Y nX n|dkr~t	|dkrb|d }n|d drxd}n|}n|dkrt	t| }|dkrt	|dkrtj| dd}t	|dkr|d d nd}||d  }n|}nFtj| }t|dd}|dkr:t	|dkr:|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-ref_dateREF_DATENz{}_{}
timeseriesgeometrybperp)z.h5z.he5_r   BANDS1z - {}pix_boxr+   rJ   _subwrapF_wrap
wrap_rangeg      )
isinstancestrr.   r/   splitextbasenamer   read_attributeintlensplitr
   keysr2   
startswithget_dataset_listrsplitgetr3   pi)fnamedatasetNames	inps_dictfbasefextatrk	num_pixel	fig_titlerr   processMarkZnum_dsetZfpartssuffixnum_bandboxr~   r$   r$   r%   auto_figure_title   st    





 


&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   r2   lowerr   r1   invert_xaxisinvert_yaxis)metadatarV   r,   flip_lrflip_udmsgr$   r$   r%   auto_flip_direction   s$    
r         @c             C   s  | 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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   rJ   r'   g    B    g    eA   g    A   g    *uA   g    A   g    *uA   g    A   g    *uAg    Ag       @g      @ztotal number of pixels: {:.1E}zL* multilook {0} by {0} with nearest interpolation for display to save memory)r3   sqrtr   ceilr1   r2   )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|}x>t|t| |k r|d |d kr|d7 }q|d7 }qW t 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'   g      ?g      ?)r   r3   r   r7   rg   r   rint)	Zsubplot_num
data_shaperk   fig_numZsubplot_num_per_figZdata_shape_ratioZ	num_ratiorow_numcol_numr$   r$   r%   auto_row_col_numD  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 }x4t|D ](}x"t|D ]}||| |  qW qW |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+   rJ   )shaper3   zerosr   rc   tolistrangeappend)	axsrD   flattennrowsncolslocsZloc_listr_   jr$   r$   r%   auto_shared_lalo_locationd  s    
r   c          	      sb   ddddddddd	g	 |sPt  fd
d| d t|dd gD rLd}nd}|r^td| |S )N	coherencetemporalCoherence	waterMask
shadowMaskz.corz.mliz.slcz.ampz.rampc             3   s   | ]}| kV  qd S )Nr$   )r^   r_   )gray_dataset_key_wordsr$   r%   	<genexpr>  s    z%auto_colormap_name.<locals>.<genexpr>rm   rq   r   grayjetz	colormap:)anyr   r   r1   )r   Z	cmap_namedatasetNamer,   r$   )r   r%   auto_colormap_name{  s    
r   r   c             C   s  t | t |  t |   }t |t}t |t}||krVd}||g}nt t t 	|t}	t
|| |	 d }
|
|kr|
}||	d  ||	d  g}|rd|j|}|d7 }t| n0ddlm} || ||}d}t |t |g}||fS )N   r'   r+   z.data has uniform and limited number ({} <= {})z) of unique values --> discretize colormapr   )multilook_data)r3   uniqueisnanisfiniterd   r6   r7   rg   absdiffr   r2   rC   r1   Zmintpy.multilookr   nanminnanmax)dataZ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   sV  t |d tjrdd |D }|dk	r|d | }t|}t|| d }|d | d }t|}	t||	 d }
|dkr|d	 }d	}|
dkr|	d	 }	d	}
|d	k r|d	 }d}|
d	k r|	d	 }	d}
t||d	dd}t|	|
d	dd}n|  \}}| || td
| _| j	
t| | j	td | j	t  | j|d | ||fS )a4  Adjust X axis
    Input:
        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.
    Output:
        ax  - matplotlib figure axes object
        dss - datetime.datetime object, xmin
        dee - datetime.datetime object, xmax
    r   c             S   s$   g | ]}|j | jd  d  qS )r'   g     v@)year	timetupletm_yday)r^   r_   r$   r$   r%   rb     s    z*auto_adjust_xaxis_date.<locals>.<listcomp>Ng      (@r*   g?r   r'   z%Y-%m-%d %H:%M:%Sz%Y)	labelsize)r   dtdatetimer   get_xlimset_xlimmdatesDateFormatter	fmt_xdataxaxisset_major_locatorYearLocatorset_major_formatterset_minor_locatorMonthLocatortick_params)rV   
datevectorfontsize
every_yearZbuffer_yeartsysmsteyemedssZdeer$   r$   r%   auto_adjust_xaxis_date  s>                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
    Ng?)rg   rd   set_ylim)rV   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   rL   r+   markercolororange
markersize
disp_titleTr   r'   r   g?g      ?c             S   s   g | ]}| d d qS )rw   r   )r   )r^   date12r$   r$   r%   rb     s    z*plot_coherence_history.<locals>.<listcomp>c             S   s   g | ]}| d d qS )rw   r'   )r   )r^   r	  r$   r$   r%   rb     s    rJ   r   c                s   g | ]}| d   qS )r+   r$   )r^   r_   )	bar_widthr$   r%   rb     s    r   )axiszMax {})labelzMin {}z{} History of All Related Pairs)r   r   )r   zlower right)rD   )r   r   yyyymmdd_date12sortedyyyymmddrc   setdate_list2vectorut0most_commonr3   r   r   pnetcoherence_matrixbarr   daysr2   r   	set_titler   r   
set_ylabellegend)rV   
date12ListcohListp_dictm_datess_datesdateListr   r   x_listcoh_matr$   )r
  r%   plot_coherence_history  sD            
((
r#  c       /   	      sb  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|}x`t|D ]T}| d!\}}|}|}| |  ||< |
| |
|  ||< qW |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	r<t }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 rx|D ]}$|$d!\}%}&|%}'|&}(t&|' |( g})t&|' |( g}* d	k	rr |$ }+|+| ||  },| j%|)|*d<|d |||,d= n| j%|)|*d<|d |d>d= qW x|D ]}$|$d!\}%}&|%}'|&}(t&|' |( g})t&|' |( g}* d	k	r2 |$ }+|+| ||  },| j%|)|*d?|d |||,d= n| j%|)|*d?|d |d>d= qW |d rn| 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 r^|d r^t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   rL   r+   r  r  r  r  NxlabelylabelzPerp Baseline [m]
cbar_labelzAverage Spatial Coherence	cbar_sizez3%rj   TcolormapRdBur   g?g      ?r  Z	disp_dropdisp_legendr   r'   numberzunrecognized colormap input: {}gffffff?r   rw   z$max perpendicular baseline: {:.2f} mz#max temporal      baseline: {} daysFc             S   s   g | ]}| d d qS )rw   r   )r   )r^   r_   r$   r$   r%   rb   o  s    z plot_network.<locals>.<listcomp>c             S   s   g | ]}| d d qS )rw   r'   )r   )r^   r_   r$   r$   r%   rb   p  s    c                s   g | ]}  |qS r$   )index)r^   r_   )r   r$   r%   rb   s  s    c                s   g | ]}  |qS r$   )r,  )r^   r_   )r   r$   r%   rb   t  s    zshowing coherencezdata range: {}zdisplay range: {}right)rF   )vminvmax)cmapnorm)r   )r   c                s   g | ]}  | qS r$   )r,  )r^   r_   )r  r  r$   r%   rb     s    c             S   s   g | ]\}}|qS r$   r$   )r^   rw   xr$   r$   r%   rb     s    c                s   g | ]} | qS r$   r$   )r^   r_   )r   r$   r%   rb     s    c                s   g | ]} | qS r$   r$   )r^   r_   )	pbaseListr$   r%   rb     s    ko)alphar   mfcc                s   g | ]} | qS r$   r$   )r^   r_   )r   r$   r%   rb     s    c                s   g | ]} | qS r$   r$   )r^   r_   )r3  r$   r%   rb     s    r   z--)lwr5  cr   rq   zInterferogram Network)r   r   bothin)which	directionr   bottomtopleftr-  )gQ?gq=
ףp?zaxes fraction)xycolorxycoordsr   solidzIfgram used)rA  lsr  dashedzIfgram dropped)handles)0r   r   r   r	   r(  mplcolorsLinearSegmentedColormapr?   r2   r   r  r  r  date_list2tbaser  r   r3   r   r   r   r,  r1   rg   r   rc   r  rd   r   append_axes	NormalizecolorbarColorbarBaserV   r   	set_labelzipplotr9   r  r   r  
set_xlabelr  annotatelinesLine2Dr  )/rV   r  r   r3  r  date12List_dropr,   r0  transparencyr   Z	tbaseList
ifgram_numZpbase12Ztbase12r_   m_dates_datem_idxs_idxZdate12List_keepr  r  ZdateList_keepdateList_dropZidx_date_keepZidx_date_dropdata_mindata_maxdisp_minZdisp_maxcaxr1  cbarZcohList_keepr!  y_listr	  date1date2idx1idx2r2  ycohZcoh_normZ
solid_lineZ	dash_liner$   )r  r  r   r   r3  r%   plot_network   s                    












  



  
rj  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 }x*|D ]"}	||	}
||
 |	|
 qW |r" fdd|D }fdd|D }| j
||d||d |d |d d |rf 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   rL   r+   r  r  r  r  Tr   r'   gffffff?c                s   g | ]} | qS r$   r$   )r^   r_   )r   r$   r%   rb     s    z+plot_perp_baseline_hist.<locals>.<listcomp>c                s   g | ]} | qS r$   r$   )r^   r_   )r3  r$   r%   rb     s    z-ko)r5  r7  r   r6  c                s   g | ]} | qS r$   r$   )r^   r_   )r   r$   r%   rb     s    c                s   g | ]} | qS r$   r$   )r^   r_   )r3  r$   r%   rb     s    r4  r   )r5  r   r6  zPerpendicular Baseline History)r   )r   r   r   zPerpendicular Baseline [m])r   r   r  r  rc   r   r   r,  remover   rQ  r  r   r  r  )rV   r   r3  r  r]  rW  r   Zidx_keepZidx_dropr_   idxr!  rc  r$   )r   r3  r%   plot_perp_baseline_hist  sL          




rm  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|	|
  x6|D ].} fdd|dD \}}tj|||f< qzW |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 networkzunrecognized colormap input: {}c             S   s   g | ]}| d d qS )rw   r   )r   )r^   r_   r$   r$   r%   rb   !  s    z5plot_rotate_diag_coherence_matrix.<locals>.<listcomp>c             S   s   g | ]}| d d qS )rw   r'   )r   )r^   r_   r$   r$   r%   rb   "  s    c                s   g | ]}  |qS r$   )r,  )r^   r_   )	date_listr$   r%   rb   %  s    rw   r   g        gray_rg      ?)r0  r.  r/  r'   )r.  r/  r0  r+   g       @g?r*   gffffff?g      off)%r   r   r	   r(  rG  rH  rI  r?   r2   r  r  r  rc   r  r   r3   nanr   wherer   rg   r   diagonesimshowset_transform
transformsAffine2D
rotate_deg	transDatar   r   r   	get_xaxis	set_ticks	get_yaxisr  )rV   coh_listdate12_listZdate12_list_dropry  r0  Z	disp_halfr`  r"  r  r  r	  rf  rg  Znum_imgnum_conndiag_matimr  r$   )rn  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||  x8|D ]0}	 fdd|	dD \}
}tj||
|f< qW t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 rpd'}n|d(k rd)}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 rNt | }|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   rL   r+   r  r  r  r  Tr   z	{} Matrixr(  r   r&  r   )g?g      ?rj   
legend_locbestr*  zunrecognized colormap input: {}c             S   s   g | ]}| d d qS )rw   r   )r   )r^   r_   r$   r$   r%   rb   l  s    z)plot_coherence_matrix.<locals>.<listcomp>c             S   s   g | ]}| d d qS )rw   r'   )r   )r^   r_   r$   r$   r%   rb   m  s    c                s   g | ]}  |qS r$   )r,  )r^   r_   )r   r$   r%   rb   q  s    rw   r   g        ro  g      ?nearest)r0  r.  r/  interpolationr'         2   
   d   r   zImage Number)r   r9  r:  )r;  r<  r   r=  r>  r?  r-  r-  z3%)rF   )ra  zUpper: Ifgrams used)r  zLower: Ifgrams all)rD   handlelength)'r   r2   r   r   r	   r(  rG  rH  rI  r?   r   r  r  r  r  rc   r  r   r3   rq  rs  rt  r   ru  r   r{  r|  r}  rR  r  r   r  r   rK  rP   rM  rO  rQ  r  )rV   r  r  rV  r  r0  r"  r  r  r	  rf  rg  r  r  date_numZ	tick_stepZ	tick_listZdividerra  rb  r$   )r   r%   plot_coherence_matrixC  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: {} ...rm   ru   heightr   rn   ro   F)r,   )r   r   r,   z align DEM to the input data filerJ   r'   r+   )r)   )r1   r2   r.   r/   r   r   r   r   r   box_geo2pixelcheck_box_within_data_coveragereadr3   r   r)   rq  r9   )dem_filerz   geo_boxr,   Zdem_metadatadsNamecoordZdem_pix_boxZbox2readdemZdem_tmpr$   r$   r%   read_dem  s2    
 D
r  c       
   	   C   s  d}d}d}|dkrt  }|jdkr4t| d |_|jrddlm} ||j|jd}t	
 4 t	jdtd |j| |jtd	j|j|jd
}W dQ R X tj|t|dddddf < |rtd |jrddlm} |j| |jdd}tj|jd|jd}|rtd|j|j |r|jr|dk	s<|dk	rdd ||gD d }	|jj|	kr|rntd |dk	rtj||jdk< |dk	rt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_exagr0  r.  r/  zshow shaded relief DEM)ndimage)sigmaorderi(#  )stepz8show contour in step of {} m with smoothing factor of {}c             S   s"   g | ]}|d k	r|j d d qS )Nr+   )r   )r^   r2  r$   r$   r%   rb     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.) r&   	shade_maxr3   r   disp_dem_shadematplotlib.colorsr  shade_azdegshade_altdegwarningscatch_warningssimplefilterRuntimeWarningshade
shade_exagr	   r(  	shade_minrq  r   r1   disp_dem_contourscipyr  gaussian_filterdem_contour_smootharangedem_contour_stepr2   mask_demmskr   )
r  r#   r,   	dem_shadedem_contourZdem_contour_sequencer  rD  r  Z	dem_shaper$   r$   r%   prepare_dem_background  sL    


"
"

r  c             C   s  |dkrt  }tdd |||gD rB|dk	rBt|||d\}}}|dk	rh|d |d |d |d f}nrt|d	r~t|j}	n0d
d |||g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 )Nr$   )r^   r_   r$   r$   r%   r     s    z&plot_dem_background.<locals>.<genexpr>)r#   r,   r   r+   rJ   r'   rz   c             S   s   g | ]}|d k	r|qS )Nr$   )r^   r_   r$   r$   r%   rb   +  s    z'plot_dem_background.<locals>.<listcomp>g      ?spline16upper)r  zorderoriginextentblack)r  rH  
linewidthsr5  r  r  y              ?)r&   allr  hasattrtuplerz   r   rO   ru  r   rP   Axesdem_contour_linewidthr3   mgridcontour)rV   r  r  r  Zdem_contour_seqr  r#   r,   Z
geo_extentrz   r   Z
rdr_extentrX   yyxxr$   r$   r%   plot_dem_background  s@     





$r  c       !   
   C   s  ddl m} |rtndd }d}|j\}}	t|jtrBt|jjn|j}
t|}d|d< t	||j
dd	 }|jrv|jn
|d
d }|jr|jn
|dd }||||\}}}|jdkrtd||||jr\|jd k	r\|jjd	kr|jntj|jdd}t|}|||dd	 \}}|||f dk}|| }|| }|| }|jdkr\t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rd|jnd7 }|| |dt| |d| |d| |d|j |j|j||||j|j||jd}|jr|  !|j}| j"|| || || f|j#d  || }t$|s||8 }||9 }x~t%|||D ]J\}}}t$|s|
|| |	|  nd!}| j&||||d	 d"d#d$ qW n"|d% | j&|||d	 d&d"d#d' |j'rx2t%|||D ]"\} }}| j"| ||f|j#d  q`W | S )(Nr   )gpsc              _   s   d S )Nr$   )r   rX   r$   r$   r%   <lambda>W      zplot_gps.<locals>.<lambda>   mUNIT)r   	disp_unitr+   
START_DATEEND_DATEz'No GNSS found within {} during {} - {}!r*   )r  zNo GNSS left after --mask-gps!z,input reference GPS site "{}" not available!rm   )velocityrt   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: {})Z
insar_file
site_names
start_dateend_dateZgps_comphorz_az_angler,   Zredo)r@  r   noner   r  )rA  s
edgecolorsr  zshowing GPS locationsrI   )r  rA  r  r  )(mintpy.objectsr  r1   r   r   r(  r   r	   rO   scale_data2disp_unitr  gps_start_dater   gps_end_dateZ
search_gpsrC   r?   r2   mask_gpsr  ndimr3   prodr   r;   ref_gps_sitegps_componentr   Zget_gps_los_obsfiler  gps_redor   r,  rS  	font_sizer   rP  scatterdisp_gps_label)!rV   SNWEr#   r   r,   r  vprintZmarker_sizer.  r/  r0  r   unit_facr  r  r  Z	site_latsZ	site_lonsr  r  Zsite_ysZsite_xsflagr   r   Zsite_obsref_indref_vallatlonobsrA  Z	site_namer$   r$   r%   plot_gpsU  s    

"
"$"r  c             C   s  | j s| jd | jd kr6| jd | jd kr6d| _ nf| jd | jd krf| jd | jd krfd| _ n6| jd | jd kr| jd | jd k rd| _ nd| _ | jdkrd}n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 ntj	|||| j d}| jdkr2| j| _| jrl| jdkrT|| 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'   neitherrd   rg   r9  )r?  r-  vertical
horizontalg       @)ra  orientationticksz-$\pi$0z$\pi$)ra  r  extendr  r+   )nbinsout)r;  r<  r   rH  )r   rA  ry   )cbar_extr   Zdlimcbar_locr|   r~   r3   r   rP   rM  rV   set_yticklabelsr   
cbar_nbinsr|  r   MaxNLocatorlocatorupdate_ticksr   r  
font_colorr&  rO  r  )r#   r  ra  r  rb  r$   r$   r%   plot_colorbar  s8    ( ( ( 
(r  g      c             C   s   |sR| d }| dd}| d  }|dkrF|dd drFd	}n|d
krRd}|r|dd dkr|d}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)
    rm   .r   r  )rt   giantTimeseriesr  HDFEOS/r   r  cm)ZmlislcampdB)radianr  r  mmry   Fz/WARNING: re-wrap is disabled for disp_unit = {}r  r'   g       @z+change disp_unit = radian due to rewrapping)replacer   r   endswithr1   r2   r3   r   )r   r  r|   r~   r,   r   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' } n0y|t|d  }W n   td)|d  Y nX ntd*| |d g}t	|d+krfyj|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  g      ?r  r   r  g     @@r  g      Y@dmg      $@kmgMbP?)r:  inchgo_C@)ftfootgD
)?
@)ydyardgA	3m?)mimilegp\D?)radiansr  radrg      
WAVELENGTHz'Unrecognized display phase/length unit:g{Gz?g?r  r   r'   zUnrecognized phase/length unit:ry   dbNr  rm   )z.corz.intz.unwr  )a_mina_maxr   zUn-scalable display unit:zUn-scalable data unit:r+   )rh  yrr   r   )r  monmonthr&  g      (@)ddayr)  g     v@z#Unrecognized time unit for display:)r)   )r   r   r  r3   r   r7   r1   log10clipr   r   r9   r)   )r   r   r  ra   Z	data_unit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  r|   r~   r,   g      ?r  )r   r  r   r'   zre-wrapping data to {})r  r  r3   modr1   r2   )r   r   r  r|   r~   r,   Z
disp_scaler$   r$   r%   scale_data4disp_unit_and_rewrapo  s     (r/  c	          	      s&  |rt ndd }	t|   d }
|s|
dkrd| krxbdD ]Z}d| krLd}tj| d	rhd
|}tjtj	| t
|}tj|rP q<d}q<W d}tjt
|ryt|t fdddD r4d}tdd  g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 d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 )Nr$   )r   rX   r$   r$   r%   r    r  zread_mask.<locals>.<lambda>rm   )r  rt   r  )zmaskTempCoh.h5zmaskResInv.h5ZPhaseVelocityNgeo_zgeo_{}c             3   s&   | ]}t | t  | kV  qd S )N)r   )r^   key)r   atr_mskr$   r%   r     s    zread_mask.<locals>.<genexpr>)ro   rn   c             s   s   | ]}|d  dkV  qdS )rm   rp   Nr$   )r^   metar$   r$   r%   r     s    rq   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: {} / {}ro   rn   z,
    mask file {} row/column number: {} / {}z
    Continue without mask.zCan not open mask file:)r
  mask)r   r,   zread {} contained mask dataset.z	PARAMS.h5r   cmaskg      ?zread {} contained cmask datasetr+   zhide pixels with mask value < zhide pixels with mask value > )r1   r   r   r.   r/   r   r   r2   joindirnamer   r0   r  r   r  r   r  h5pyFiler   r   r3   r   )r   	mask_filer   r   xstepystepr.  r/  r,   r  r   r4  r  r	  r   fxsizeysizer$   )r   r2  r%   	read_mask  s    










r@  r   r+   rJ   r  c       
         s  t | d | d  | d | d  g|st }ttt| t|d dkrn d7  t| } fdd|D }fd	d|D }||	t
| }ttt| t| d d
 d   d
 d   }ttt||d  | t||d  |f}t|tt|| d k|| d k }t| d d
 d   d
 d   }ttt||d  | t||d  |f}	t|	tt|	| d k|	| d k }	||	| fS )a  Auto calculate lat/lon label sequence based on input geo_box
    Parameters: geo_box        : 4-tuple of float, defining UL_lon, UL_lat, LR_lon, LR_lat coordinate
                lalo_step      : float
                lalo_max_num   : int, rough major tick number along the longer axis
                step_candidate : list of int, candidate list for the significant number of step
    Returns:    lats/lons : np.array of float, sequence of lat/lon auto calculated from input geo_box
                lalo_step : float, lat/lon label step
    Example:    geo_box = (128.0, 37.0, 138.0, 30.0)
                lats, lons, step = m.auto_lalo_sequence(geo_box)
    r'   rJ   r+   r   r*   )89c                s   g | ]}|d    qS )r  r$   )r^   r_   )digitr$   r%   rb     s    z&auto_lalo_sequence.<locals>.<listcomp>c                s   g | ]}|   d  qS )r+   r$   )r^   r_   )lalo_max_nummax_lalo_distr$   r%   rb     s    r  g      $@)rg   r  
round_to_1r3   r   floorr*  r   roundr,  rd   r   r   hstackr  sortrr  logical_and)
r  	lalo_steprD  Zstep_candidateZlalo_step_candidatedistanceZ	lat_majorlatsZ	lon_majorlonsr$   )rC  rD  rE  r%   auto_lalo_sequence   s(    $
&,&,rP  c
             C   s   |st  }t| ||d\}
}}}|	r6td|| |jdd|dddd|d |d |d |d	 d
 |dk	r~|jdd|d |dk	r|jdd|d tdd| }tjd|d}tj	d|d}|j
| |j| |j||d |j|
|d |S )a	  Auto draw lat/lon label/tick based on coverage from geo_box
    Parameters: geo_box   : 4-tuple of float, (W, N, E, S) in degree
                ax        : CartoPy axes.
                lalo_step : float
                lalo_loc  : list of 4 bool, positions where the labels are drawn as in [left, right, top, bottom]
                            default: [1,0,0,1]
                lalo_max_num : int
                ...
    Example:    geo_box = (128.0, 37.0, 138.0, 30.0)
                m.draw_lalo_label(geo_box)
    )rL  rD  z3plot lat/lon label in step of {} and location of {}r9  r:  Tr   r'   r+   rJ   )r;  r<  r   r?  r-  r>  r=  	labelleft
labelrightlabeltoplabelbottomNr2  major)r  r;  rF   rh  z.{}f)number_format)r   )rP   gcarP  r1   r2   r   rg   ctickerZLongitudeFormatterZLatitudeFormatterr   r   yaxis
set_xticks
set_yticks)r  rV   rL  lalo_locrD  r  xoffsetyoffset
projectionr,   rN  rO  rC  Zdecimal_digitZlon_formatterZlat_formatterr$   r$   r%   draw_lalo_label+  s*    
r`  degreesg?g?r   c          	   C   s  t jdd}| st } |d |d |d |d    }|d |d |d |d    }	|dr|d |d  dkr~d	}
| S ||d |d |d |d d }
n|d
r|d |d  }
t|
|d  }|dkrt	|d d }|dr|
||	d|d }t|| }n|d
r*|}||d  }||d  }| j||g|	|	g|d | j||g|	|	d|  g|d | j||g|	|	d|  g|d d}|dkrd}|d9 }d||}|d |d  | }| j||d  |	| |dd||d | S )a  draw a simple map scale from x1,y to x2,y in map projection coordinates, label it with actual distance
    ref_link: http://matplotlib.1069221.n5.nabble.com/basemap-scalebar-td14133.html
    Parameters: ax       : matplotlib.pyplot.axes object
                geo_box  : tuple of 4 float in (x0, y0, x1, y1) for (W, N, E, S) in degrees / meters
                unit     : str, coordinate unit - degrees or meters
                loc      : list of 3 float in (length, lat, lon) of scale bar center in ratio of width, relative coord
                labelpad : float
    Returns:    ax
    Example:    from mintpy.utils import plot as pp
                pp.draw_scale_bar(ax, geo_box)
    WGS84)ellpsr   r'   r+   rJ   degr  NZmeterg     @@Z   g       @)rA  g?r  r  gMbP?z	{:.0f} {}center)verticalalignmenthorizontalalignmentr   rA  )pyprojGeodrP   rW  r   invr  rF  r3   r   fwdr   rQ  r2   text)rV   r  unitrD   labelpadr  rA  geodlon_clat_cZscene_widthZlength_meterZlon_c2Zlength_displon0lon1r  Z
txt_offsetr$   r$   r%   draw_scalebarW  sL      

  

ru  )r   )N)r[   FFr\   r]   T)NT)r   T)r'   )r   F)NNT)r'   r   T)r   r'   r   )r   NN)NNT)NT)NNNNNNT)NNNr'   r'   NNT)Mr.   r   r  r   r   r8  numpyr3   
matplotlibrG  r   rP   r   r   r   Zmpl_toolkits.axes_grid1r   ri  cartopyr   ccrsZcartopy.mplr   rX  mintpy.objects.coordr   Zmintpy.objects.colorsr	   r  r
   r   mintpy.utilsr   r   r   r   r  r   r  re   rf   Zdefault_figsize_multirh   Z	mplColorsr&   r@   rZ   rl   r   r   r   r   r   r   r   r   r  r#  rj  rm  r  r  r  r  r  rO   r  r  r   r  r  r/  r@  rP  PlateCarreer`  ru  r$   r$   r$   r%   <module>
   s   	
$
 
a

+
 


$
,
) .E0Z
(
A 
Nc/j% 
j++