Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/mintpy/cli/plot_coherence_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,12 @@ def create_parser(subparsers=None):
'Default: view.py img_file --wrap --noverbose')

# aux files
parser.add_argument('--tcoh', dest='tcoh_file', default='temporalCoherence.h5',
parser.add_argument('--tcoh', dest='tcoh_file',
help='temporal coherence file.')
parser.add_argument('-t','--template', dest='template_file',
help='temporal file.')
parser.add_argument('--time-axis', dest='time_axis', action='store_true',
help='Use continuous time axis instead of date indices for coherence matrix')

parser.add_argument('--save', dest='save_fig',
action='store_true', help='save the figure')
Expand All @@ -84,6 +86,8 @@ def cmd_line_parse(iargs=None):
mintpy_dir = os.path.dirname(os.path.dirname(inps.ifgram_file))
if not inps.img_file:
inps.img_file = os.path.join(mintpy_dir, 'velocity.h5')
if not inps.tcoh_file:
inps.tcoh_file = os.path.join(mintpy_dir, 'temporalCoherence.h5')
if not inps.template_file:
inps.template_file = os.path.join(mintpy_dir, 'smallbaselineApp.cfg')

Expand Down Expand Up @@ -114,7 +118,7 @@ def main(iargs=None):
obj = coherenceMatrixViewer(inps)
obj.open()
obj.plot()
obj.fig.canvas.mpl_disconnect(obj.cid)
#obj.fig_img.canvas.mpl_disconnect(obj.cid_img)


############################################################
Expand Down
172 changes: 134 additions & 38 deletions src/mintpy/plot_coherence_matrix.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Zhang Yunjun, Nov 2018 #
# Author: Zhang Yunjun, Changyang Hu, Nov 2018 #
############################################################


Expand Down Expand Up @@ -62,16 +62,24 @@ class coherenceMatrixViewer():

def __init__(self, inps):
# figure variables
self.figname = 'Coherence matrix'
self.fig_size = None
self.fig = None
self.figname_img = 'Image'
self.figsize_img = None
self.fig_img = None
self.ax_img = None

self.figname_mat = 'Coherence Matrix'
self.figsize_mat = None
self.fig_mat = None
self.ax_mat = None

self.time_axis = getattr(inps, 'time_axis', False)

# copy inps to self object
for key, value in inps.__dict__.items():
setattr(self, key, value)

self._marker_artist = None


def open(self):
global vprint
Expand All @@ -89,11 +97,14 @@ def open(self):
self = read_network_info(self)

# auto figure size
if not self.fig_size:
if not self.figsize_img:
ds_shape = readfile.read(self.img_file)[0].shape
fig_size = pp.auto_figure_size(ds_shape, disp_cbar=True, scale=0.7)
self.fig_size = [fig_size[0]+fig_size[1], fig_size[1]]
vprint(f'create figure in size of {self.fig_size} inches')
self.figsize_img = pp.auto_figure_size(ds_shape, disp_cbar=True, scale=0.7)
vprint(f'create image figure in size of {self.figsize_img} inches')

if not self.figsize_mat:
self.figsize_mat = [8, 6]
vprint(f'create matrix figure in size of {self.figsize_mat} inches')

# read aux data
# 1. temporal coherence value
Expand All @@ -111,48 +122,109 @@ def open(self):


def plot(self):
# Figure 1
self.fig = plt.figure(self.figname, figsize=self.fig_size)
# Figure 1 - Image
self.fig_img, self.ax_img = plt.subplots(num=self.figname_img, figsize=self.figsize_img)
self.plot_init_image()

# Figure 2 - Coherence Matrix
self.fig_mat, self.ax_mat = plt.subplots(num=self.figname_mat, figsize=self.figsize_mat)
self.colormap = pp.ColormapExt(self.cmap_name, vlist=self.cmap_vlist).colormap
if all(i is not None for i in self.yx):
self.plot_coherence_matrix4pixel(self.yx)

# Axes 1 - Image
self.ax_img = self.fig.add_axes([0.05, 0.1, 0.4, 0.8])
# Link the canvas to the plots.
self.cid_img = self.fig_img.canvas.mpl_connect('button_press_event', self.update_coherence_matrix)

if self.disp_fig:
plt.show()
return

def plot_init_image(self):
"""Plot the initial image."""
view_cmd = self.view_cmd.format(self.img_file)
d_img, atr, view_inps = view.prep_slice(view_cmd)
self.coord = ut.coordinate(atr)

if all(i is not None for i in self.yx):
view_inps.pts_marker = 'r^'
view_inps.pts_yx = np.array(self.yx).reshape(-1, 2)

# point yx --> lalo for geocoded product
if 'Y_FIRST' in atr.keys():
view_inps.pts_lalo = np.array(
self.coord.radar2geo(
self.yx[0],
self.yx[1],
)[0:2],
).reshape(-1,2)

view_inps.print_msg = self.print_msg
self.ax_img = view.plot_slice(self.ax_img, d_img, atr, view_inps)[0]
self.fig_coord = view_inps.fig_coord

# Axes 2 - coherence matrix
self.ax_mat = self.fig.add_axes([0.55, 0.125, 0.40, 0.75])
self.colormap = pp.ColormapExt(self.cmap_name, vlist=self.cmap_vlist).colormap
if all(i is not None for i in self.yx):
self.plot_coherence_matrix4pixel(self.yx)
self.fig_img.canvas.manager.set_window_title(self.figname_img)
self.fig_img.tight_layout()
return

# Link the canvas to the plots.
self.cid = self.fig.canvas.mpl_connect('button_press_event', self.update_coherence_matrix)
if self.disp_fig:
plt.show()
def plot_coherence_matrix4pixel_time_axis(self, yx):
"""Plot coherence matrix with continuous time axis for one pixel."""
self.ax_mat.cla()

box = (yx[1], yx[0], yx[1]+1, yx[0]+1)
coh = readfile.read(self.ifgram_file, datasetName='coherence', box=box)[0]

ex_date12_list = self.ex_date12_list[:]
if self.min_coh_used > 0.:
ex_date12_list += np.array(self.date12_list)[coh < self.min_coh_used].tolist()
ex_date12_list = sorted(list(set(ex_date12_list)))

plotDict = {}
plotDict['fig_title'] = f'Y = {yx[0]}, X = {yx[1]}'
if self.tcoh is not None:
tcoh = self.tcoh[yx[0], yx[1]]
plotDict['fig_title'] += f', tcoh = {tcoh:.2f}'
plotDict['colormap'] = self.colormap
if len(self.cmap_vlist) >= 2:
plotDict['vlim'] = [self.cmap_vlist[0], self.cmap_vlist[-1]]
else:
plotDict['vlim'] = [0.0, 1.0]
plotDict['cbar_label'] = 'Coherence'
plotDict['disp_legend'] = False

pp.plot_coherence_matrix_time_axis(
self.ax_mat,
date12List=self.date12_list,
cohList=coh.tolist(),
date12List_drop=ex_date12_list,
p_dict=plotDict,
)

self.ax_mat.annotate('ifgrams\navailable', xy=(0.05, 0.05), xycoords='axes fraction', fontsize=12)
self.ax_mat.annotate('ifgrams\nused', ha='right', xy=(0.95, 0.85), xycoords='axes fraction', fontsize=12)

msg = f'pixel in yx = {tuple(yx)}, '
msg += f'min/max spatial coherence: {np.nanmin(coh):.2f} / {np.nanmax(coh):.2f}, '
if self.tcoh is not None:
msg += f'temporal coherence: {tcoh:.2f}'
vprint(msg)

self.fig_mat.canvas.manager.set_window_title(self.figname_mat)
if not hasattr(self, "_mat_tight_layout_done"):
self.fig_mat.tight_layout()
self._mat_tight_layout_done = True

self.fig_mat.canvas.draw_idle()
self.fig_mat.canvas.flush_events()

# plot/update marker on the image window
if self.fig_coord == 'geo':
lat, lon = self.coord.yx2lalo(yx[0], yx[1])
mx = lon if self.fig_coord == 'geo' else yx[1]
my = lat if self.fig_coord == 'geo' else yx[0]
if self._marker_artist is None:
self._marker_artist = self.ax_img.plot(
mx, my, 'r^', markersize=6, markeredgecolor='black'
)[0]
else:
self._marker_artist.set_data([mx], [my])

self.fig_img.canvas.draw_idle()
return

def plot_coherence_matrix4pixel(self, yx):
"""Plot coherence matrix for one pixel
Parameters: yx : list of 2 int
"""
if self.time_axis:
return self.plot_coherence_matrix4pixel_time_axis(yx)

self.ax_mat.cla()

# read coherence
Expand All @@ -169,7 +241,7 @@ def plot_coherence_matrix4pixel(self, yx):
plotDict = {}
plotDict['fig_title'] = f'Y = {yx[0]}, X = {yx[1]}'
# display temporal coherence value of the pixel
if self.tcoh_file:
if self.tcoh is not None:
tcoh = self.tcoh[yx[0], yx[1]]
plotDict['fig_title'] += f', tcoh = {tcoh:.2f}'
plotDict['colormap'] = self.colormap
Expand Down Expand Up @@ -198,17 +270,41 @@ def format_coord(x, y):

# info
msg = f'pixel in yx = {tuple(yx)}, '
if self.fig_coord == 'geo':
lat, lon = self.coord.yx2lalo(yx[0], yx[1])
msg += f'lat/lon = ({lat:.8f}, {lon:.8f}), '
msg += f'min/max spatial coherence: {np.min(coh):.2f} / {np.max(coh):.2f}, '
if self.tcoh_file:
if self.tcoh is not None:
msg += f'temporal coherence: {tcoh:.2f}'
vprint(msg)

self.fig_mat.canvas.manager.set_window_title(self.figname_mat)

# call tight_layout only once to avoid jitter and repeated work
if not hasattr(self, "_mat_tight_layout_done"):
self.fig_mat.tight_layout()
self._mat_tight_layout_done = True

# update figure
self.fig.canvas.draw_idle()
self.fig.canvas.flush_events()
self.fig_mat.canvas.draw_idle()
self.fig_mat.canvas.flush_events()

# plot/update marker on the image window
mx = lon if self.fig_coord == 'geo' else yx[1]
my = lat if self.fig_coord == 'geo' else yx[0]
if self._marker_artist is None:
self._marker_artist = self.ax_img.plot(
mx, my, 'r^', markersize=6, markeredgecolor='black'
)[0]
else:
self._marker_artist.set_data([mx], [my])

self.fig_img.canvas.draw_idle()

return

def update_coherence_matrix(self, event):
"""Update coherence matrix when clicking on either window."""
if event.inaxes == self.ax_img:
if self.fig_coord == 'geo':
yx = self.coord.lalo2yx(event.ydata, event.xdata)
Expand Down
28 changes: 22 additions & 6 deletions src/mintpy/plot_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ def plot_network(inps):
# figure names
ext = 'Ion.pdf' if os.path.basename(inps.file).startswith('ion') else '.pdf'
fig_names = {
'coherence' : [i+ext for i in ['pbaseHistory', 'coherenceHistory', 'coherenceMatrix', 'network']],
'coherence' : [i+ext for i in ['pbaseHistory', 'coherenceHistory', 'coherenceMatrix', 'coherenceMatrixTimeAxis', 'network']],
'offsetSNR' : [i+ext for i in ['pbaseHistory', 'SNRHistory', 'SNRMatrix', 'network']],
'tbase' : [i+ext for i in ['pbaseHistory', 'tbaseHistory', 'tbaseMatrix', 'network']],
'pbase' : [i+ext for i in ['pbaseHistory', 'pbaseRangeHistory', 'pbaseMatrix', 'network']],
Expand Down Expand Up @@ -204,7 +204,7 @@ def plot_network(inps):
)
if inps.save_fig:
fig.savefig(fig_names[1], **kwargs)
print(f'save figure to {fig_names[2]}')
print(f'save figure to {fig_names[1]}')

# Fig 3 - Coherence Matrix
fig_size3 = np.mean(inps.fig_size)
Expand All @@ -218,9 +218,25 @@ def plot_network(inps):
)[0]
if inps.save_fig:
fig.savefig(fig_names[2], **kwargs)
print(f'save figure to {fig_names[1]}')
print(f'save figure to {fig_names[2]}')

# Fig 4 - Coherence Matrix with Time Axis
fig_size4 = np.mean(inps.fig_size)
fig, ax = plt.subplots(figsize=[fig_size4, fig_size4])
ax = pp.plot_coherence_matrix_time_axis(
ax,
inps.date12List,
inps.cohList,
inps.date12List_drop,
p_dict=vars(inps),
)[0]
fig.tight_layout()
if inps.save_fig:
fig.savefig(fig_names[3], **kwargs)
print(f'save figure to {fig_names[3]}')

# Fig 4 - Interferogram Network
# Fig 5 - Interferogram Network (or Fig 4 if cohList is None)
fig_idx = 4 if inps.cohList is not None else 3
fig, ax = plt.subplots(figsize=inps.fig_size)
ax = pp.plot_network(
ax,
Expand All @@ -231,8 +247,8 @@ def plot_network(inps):
inps.date12List_drop,
)
if inps.save_fig:
fig.savefig(fig_names[3], **kwargs)
print(f'save figure to {fig_names[3]}')
fig.savefig(fig_names[fig_idx], **kwargs)
print(f'save figure to {fig_names[fig_idx]}')

if inps.disp_fig:
print('showing ...')
Expand Down
Loading