def annotate_matches3(ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=None, **kwargs): """ TODO: use this as the main function. """ # TODO Use this function when you clean show_matches in_image = kwargs.get('in_image', False) #show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) notitle = kwargs.get('notitle', False) # List of annotation scores for each annot in the name #printDBG('[viz] annotate_matches3()') #truth = ibs.get_match_truth(aid1, aid2) #name_equality = ( # np.array(ibs.get_annot_nids(aid_list[1:])) == ibs.get_annot_nids(aid_list[0]) #).tolist() #truth = 1 if all(name_equality) else (2 if any(name_equality) else 0) #truth_color = vh.get_truth_color(truth) ## Build title #score = kwargs.pop('score', None) #rawscore = kwargs.pop('rawscore', None) #aid2_raw_rank = kwargs.pop('aid2_raw_rank', None) #print(kwargs) #title = vh.get_query_text(ibs, None, aid2, truth, qaid=aid1, **kwargs) # Build xlbl ax = pt.gca() ph.set_plotdat(ax, 'viztype', 'multi_match') ph.set_plotdat(ax, 'qaid', aid_list[0]) ph.set_plotdat(ax, 'num_matches', len(aid_list) - 1) ph.set_plotdat(ax, 'aid_list', aid_list[1:]) for count, aid in enumerate(aid_list, start=1): ph.set_plotdat(ax, 'aid%d' % (count, ), aid) #name_equality = (ibs.get_annot_nids(aid_list[0]) == # np.array(ibs.get_annot_nids(aid_list[1:]))) #truth = 1 if np.all(name_equality) else (2 if np.any(name_equality) else 0) truth = get_multitruth(ibs, aid_list) if any(ibs.is_aid_unknown(aid_list[1:])) or ibs.is_aid_unknown( aid_list[0]): truth = ibs.const.TRUTH_UNKNOWN truth_color = vh.get_truth_color(truth) name_annot_scores = kwargs.get('name_annot_scores', None) if len(aid_list) == 2: # HACK; generalize to multple annots title = vh.get_query_text(ibs, None, aid_list[1], truth, qaid=aid_list[0], **kwargs) if not notitle: pt.set_title(title, ax) if draw_lbl: # Build labels nid_list = ibs.get_annot_nids(aid_list, distinguish_unknowns=False) name_list = ibs.get_annot_names(aid_list) lbls_list = [[] for _ in range(len(aid_list))] if kwargs.get('show_name', False): for count, (lbls, name) in enumerate(zip(lbls_list, name_list)): lbls.append(ut.repr2((name))) if kwargs.get('show_nid', True): for count, (lbls, nid) in enumerate(zip(lbls_list, nid_list)): # only label the first two images with nids LABEL_ALL_NIDS = False if count <= 1 or LABEL_ALL_NIDS: #lbls.append(vh.get_nidstrs(nid)) lbls.append(('q' if count == 0 else '') + vh.get_nidstrs(nid)) if kwargs.get('show_aid', True): for count, (lbls, aid) in enumerate(zip(lbls_list, aid_list)): lbls.append(('q' if count == 0 else '') + vh.get_aidstrs(aid)) if (kwargs.get('show_annot_score', True) and name_annot_scores is not None): max_digits = kwargs.get('score_precision', None) for (lbls, score) in zip(lbls_list[1:], name_annot_scores): lbls.append(ut.num_fmt(score, max_digits=max_digits)) lbl_list = [' : '.join(lbls) for lbls in lbls_list] else: lbl_list = [None] * len(aid_list) #pt.set_title(title, ax) # Plot annotations over images if in_image: in_image_bbox_list = vh.get_bboxes(ibs, aid_list, offset_list) in_image_theta_list = ibs.get_annot_thetas(aid_list) # HACK! #if show_query: # pt.draw_bbox(bbox1, bbox_color=pt.ORANGE, lbl=lbl1, theta=theta1) bbox_color = pt.ORANGE bbox_color = truth_color if draw_border else pt.ORANGE for bbox, theta, lbl in zip(in_image_bbox_list, in_image_theta_list, lbl_list): pt.draw_bbox(bbox, bbox_color=bbox_color, lbl=lbl, theta=theta) pass else: xy, w, h = pt.get_axis_xy_width_height(ax) #theta2 = 0 #if xywh2 is None: # #xywh2 = (xy[0], xy[1], w, h) # # weird when sidebyside is off y seems to be inverted # xywh2 = (0, 0, w, h) #if not show_query and xywh1 is None: # data_config2 = None if qreq_ is None else # qreq_.get_external_data_config2() # kpts2 = ibs.get_annot_kpts([aid2], config2_=data_config2)[0] # #pt.draw_kpts2(kpts2.take(fm.T[1], axis=0)) # # Draw any selected matches # #sm_kw = dict(rect=True, colors=pt.BLUE) # pt.plot_fmatch(None, xywh2, None, kpts2, fm, fs=fs, **kwargs) #if draw_border: # pt.draw_border(ax, truth_color, 4, offset=offset2) if draw_border: pt.draw_border(ax, color=truth_color, lw=4) if draw_lbl: # Custom user lbl for chips 1 and 2 #if show_query: # (x1, y1, w1, h1) = xywh1 # pt.absolute_lbl(x1 + w1, y1, lbl1) for bbox, lbl in zip(bbox_list, lbl_list): (x, y, w, h) = bbox pt.absolute_lbl(x + w, y, lbl) # No matches draw a red box if True: no_matches = name_fm_list is None or all( [True if fm is None else len(fm) == 0 for fm in name_fm_list]) if no_matches: xy, w, h = pt.get_axis_xy_width_height(ax) #axes_bbox = (xy[0], xy[1], w, h) if draw_border: pass
def annotate_matches2( ibs, aid1, aid2, fm, fs, offset1=(0, 0), offset2=(0, 0), xywh2=None, # (0, 0, 0, 0), xywh1=None, # (0, 0, 0, 0), qreq_=None, **kwargs): """ TODO: use this as the main function. """ if True: aid_list = [aid1, aid2] bbox_list = [xywh1, xywh2] offset_list = [offset1, offset2] name_fm_list = [fm] name_fs_list = [fs] return annotate_matches3(ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=qreq_, **kwargs) else: # TODO: make sure all of this functionality is incorporated into annotate_matches3 in_image = kwargs.get('in_image', False) show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) notitle = kwargs.get('notitle', False) truth = ibs.get_match_truth(aid1, aid2) truth_color = vh.get_truth_color(truth) # Build title title = vh.get_query_text(ibs, None, aid2, truth, qaid=aid1, **kwargs) # Build xlbl ax = pt.gca() ph.set_plotdat(ax, 'viztype', 'matches') ph.set_plotdat(ax, 'qaid', aid1) ph.set_plotdat(ax, 'aid1', aid1) ph.set_plotdat(ax, 'aid2', aid2) if draw_lbl: name1, name2 = ibs.get_annot_names([aid1, aid2]) nid1, nid2 = ibs.get_annot_name_rowids([aid1, aid2], distinguish_unknowns=False) #lbl1 = repr(name1) + ' : ' + 'q' + vh.get_aidstrs(aid1) #lbl2 = repr(name2) + ' : ' + vh.get_aidstrs(aid2) lbl1_list = [] lbl2_list = [] if kwargs.get('show_aid', True): lbl1_list.append('q' + vh.get_aidstrs(aid1)) lbl2_list.append(vh.get_aidstrs(aid2)) if kwargs.get('show_name', True): lbl1_list.append(repr((name1))) lbl2_list.append(repr((name2))) if kwargs.get('show_nid', True): lbl1_list.append(vh.get_nidstrs(nid1)) lbl2_list.append(vh.get_nidstrs(nid2)) lbl1 = ' : '.join(lbl1_list) lbl2 = ' : '.join(lbl2_list) else: lbl1, lbl2 = None, None if vh.NO_LBL_OVERRIDE: title = '' if not notitle: pt.set_title(title, ax) # Plot annotations over images if in_image: bbox1, bbox2 = vh.get_bboxes(ibs, [aid1, aid2], [offset1, offset2]) theta1, theta2 = ibs.get_annot_thetas([aid1, aid2]) # HACK! if show_query: pt.draw_bbox(bbox1, bbox_color=pt.ORANGE, lbl=lbl1, theta=theta1) bbox_color2 = truth_color if draw_border else pt.ORANGE pt.draw_bbox(bbox2, bbox_color=bbox_color2, lbl=lbl2, theta=theta2) else: xy, w, h = pt.get_axis_xy_width_height(ax) bbox2 = (xy[0], xy[1], w, h) theta2 = 0 if xywh2 is None: #xywh2 = (xy[0], xy[1], w, h) # weird when sidebyside is off y seems to be inverted xywh2 = (0, 0, w, h) if not show_query and xywh1 is None: data_config2 = (None if qreq_ is None else qreq_.get_external_data_config2()) # FIXME, pass data in kpts2 = ibs.get_annot_kpts([aid2], config2_=data_config2)[0] #pt.draw_kpts2(kpts2.take(fm.T[1], axis=0)) # Draw any selected matches #sm_kw = dict(rect=True, colors=pt.BLUE) pt.plot_fmatch(None, xywh2, None, kpts2, fm, fs=fs, **kwargs) if draw_border: pt.draw_border(ax, truth_color, 4, offset=offset2) if draw_lbl: # Custom user lbl for chips 1 and 2 if show_query: (x1, y1, w1, h1) = xywh1 pt.absolute_lbl(x1 + w1, y1, lbl1) (x2, y2, w2, h2) = xywh2 pt.absolute_lbl(x2 + w2, y2, lbl2) if True: # No matches draw a red box if fm is None or len(fm) == 0: if draw_border: pass
def show_error_case(infr, aids, edge=None, error_edges=None, colorby=None, fnum=1): """ Example """ import plottool as pt if error_edges is None: # compute a minimal set of edges to minimally fix the case pass sub_infr = infr.subgraph(aids) # err_graph.add_edges_from(missing_edges) subdf = sub_infr.get_edge_dataframe() mistake_edges = [] if len(subdf) > 0: mistakes = subdf[(subdf.truth != subdf.evidence_decision) & (subdf.evidence_decision != UNREV)] mistake_edges = mistakes.index.tolist() err_edges = mistake_edges + list(error_edges) missing = [e for e in err_edges if not sub_infr.has_edge(e)] # Hack, make sure you don't reuse sub_infr.graph.add_edges_from(missing) stroke = {'linewidth': 2.5, 'foreground': sub_infr._error_color} edge_overrides = { # 'alpha': {e: .05 for e in true_negatives}, 'alpha': {}, 'style': {e: '' for e in err_edges}, 'sketch': {e: None for e in err_edges}, 'linestyle': {e: 'dashed' for e in missing}, 'linewidth': {e: 2.0 for e in err_edges + missing}, 'stroke': {e: stroke for e in err_edges + missing}, } selected_kw = { 'stroke': { 'linewidth': 5, 'foreground': sub_infr._error_color }, 'alpha': 1.0, } for k, v in selected_kw.items(): if k not in edge_overrides: edge_overrides[k] = {} edge_overrides[k][edge] = selected_kw[k] sub_infr.show_edge(edge, fnum=1, pnum=(2, 1, 2)) ax = pt.gca() xy, w, h = pt.get_axis_xy_width_height(ax=ax) nx.set_node_attributes(sub_infr.graph, name='framewidth', values=1.0) nx.set_node_attributes(sub_infr.graph, name='framealign', values='outer') nx.set_node_attributes(sub_infr.graph, name='framealpha', values=0.7) sub_infr.show_graph( fnum=fnum, pnum=(2, 1, 1), show_recent_review=False, zoomable=False, pickable=False, show_cand=False, splines='spline', simple_labels=True, colorby=colorby, use_image=True, edge_overrides=edge_overrides, # ratio=1 / abs(w / h) )
def annotate_matches2(ibs, aid1, aid2, fm, fs, offset1=(0, 0), offset2=(0, 0), xywh2=None, # (0, 0, 0, 0), xywh1=None, # (0, 0, 0, 0), qreq_=None, **kwargs): """ TODO: use this as the main function. """ if True: aid_list = [aid1, aid2] bbox_list = [xywh1, xywh2] offset_list = [offset1, offset2] name_fm_list = [fm] name_fs_list = [fs] return annotate_matches3(ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=qreq_, **kwargs) else: # TODO: make sure all of this functionality is incorporated into annotate_matches3 in_image = kwargs.get('in_image', False) show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) notitle = kwargs.get('notitle', False) truth = ibs.get_match_truth(aid1, aid2) truth_color = vh.get_truth_color(truth) # Build title title = vh.get_query_text(ibs, None, aid2, truth, qaid=aid1, **kwargs) # Build xlbl ax = pt.gca() ph.set_plotdat(ax, 'viztype', 'matches') ph.set_plotdat(ax, 'qaid', aid1) ph.set_plotdat(ax, 'aid1', aid1) ph.set_plotdat(ax, 'aid2', aid2) if draw_lbl: name1, name2 = ibs.get_annot_names([aid1, aid2]) nid1, nid2 = ibs.get_annot_name_rowids([aid1, aid2], distinguish_unknowns=False) #lbl1 = repr(name1) + ' : ' + 'q' + vh.get_aidstrs(aid1) #lbl2 = repr(name2) + ' : ' + vh.get_aidstrs(aid2) lbl1_list = [] lbl2_list = [] if kwargs.get('show_aid', True): lbl1_list.append('q' + vh.get_aidstrs(aid1)) lbl2_list.append(vh.get_aidstrs(aid2)) if kwargs.get('show_name', True): lbl1_list.append(repr((name1))) lbl2_list.append(repr((name2))) if kwargs.get('show_nid', True): lbl1_list.append(vh.get_nidstrs(nid1)) lbl2_list.append(vh.get_nidstrs(nid2)) lbl1 = ' : '.join(lbl1_list) lbl2 = ' : '.join(lbl2_list) else: lbl1, lbl2 = None, None if vh.NO_LBL_OVERRIDE: title = '' if not notitle: pt.set_title(title, ax) # Plot annotations over images if in_image: bbox1, bbox2 = vh.get_bboxes(ibs, [aid1, aid2], [offset1, offset2]) theta1, theta2 = ibs.get_annot_thetas([aid1, aid2]) # HACK! if show_query: pt.draw_bbox(bbox1, bbox_color=pt.ORANGE, lbl=lbl1, theta=theta1) bbox_color2 = truth_color if draw_border else pt.ORANGE pt.draw_bbox(bbox2, bbox_color=bbox_color2, lbl=lbl2, theta=theta2) else: xy, w, h = pt.get_axis_xy_width_height(ax) bbox2 = (xy[0], xy[1], w, h) theta2 = 0 if xywh2 is None: #xywh2 = (xy[0], xy[1], w, h) # weird when sidebyside is off y seems to be inverted xywh2 = (0, 0, w, h) if not show_query and xywh1 is None: data_config2 = (None if qreq_ is None else qreq_.get_external_data_config2()) # FIXME, pass data in kpts2 = ibs.get_annot_kpts([aid2], config2_=data_config2)[0] #pt.draw_kpts2(kpts2.take(fm.T[1], axis=0)) # Draw any selected matches #sm_kw = dict(rect=True, colors=pt.BLUE) pt.plot_fmatch(None, xywh2, None, kpts2, fm, fs=fs, **kwargs) if draw_border: pt.draw_border(ax, truth_color, 4, offset=offset2) if draw_lbl: # Custom user lbl for chips 1 and 2 if show_query: (x1, y1, w1, h1) = xywh1 pt.absolute_lbl(x1 + w1, y1, lbl1) (x2, y2, w2, h2) = xywh2 pt.absolute_lbl(x2 + w2, y2, lbl2) if True: # No matches draw a red box if fm is None or len(fm) == 0: if draw_border: pass
def annotate_matches3(ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=None, **kwargs): """ TODO: use this as the main function. """ # TODO Use this function when you clean show_matches in_image = kwargs.get('in_image', False) #show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) notitle = kwargs.get('notitle', False) # List of annotation scores for each annot in the name #printDBG('[viz] annotate_matches3()') #truth = ibs.get_match_truth(aid1, aid2) #name_equality = ( # np.array(ibs.get_annot_nids(aid_list[1:])) == ibs.get_annot_nids(aid_list[0]) #).tolist() #truth = 1 if all(name_equality) else (2 if any(name_equality) else 0) #truth_color = vh.get_truth_color(truth) ## Build title #score = kwargs.pop('score', None) #rawscore = kwargs.pop('rawscore', None) #aid2_raw_rank = kwargs.pop('aid2_raw_rank', None) #print(kwargs) #title = vh.get_query_text(ibs, None, aid2, truth, qaid=aid1, **kwargs) # Build xlbl ax = pt.gca() ph.set_plotdat(ax, 'viztype', 'multi_match') ph.set_plotdat(ax, 'qaid', aid_list[0]) ph.set_plotdat(ax, 'num_matches', len(aid_list) - 1) ph.set_plotdat(ax, 'aid_list', aid_list[1:]) for count, aid in enumerate(aid_list, start=1): ph.set_plotdat(ax, 'aid%d' % (count,), aid) #name_equality = (ibs.get_annot_nids(aid_list[0]) == # np.array(ibs.get_annot_nids(aid_list[1:]))) #truth = 1 if np.all(name_equality) else (2 if np.any(name_equality) else 0) truth = get_multitruth(ibs, aid_list) if any(ibs.is_aid_unknown(aid_list[1:])) or ibs.is_aid_unknown(aid_list[0]): truth = ibs.const.TRUTH_UNKNOWN truth_color = vh.get_truth_color(truth) name_annot_scores = kwargs.get('name_annot_scores', None) if len(aid_list) == 2: # HACK; generalize to multple annots title = vh.get_query_text(ibs, None, aid_list[1], truth, qaid=aid_list[0], **kwargs) if not notitle: pt.set_title(title, ax) if draw_lbl: # Build labels nid_list = ibs.get_annot_nids(aid_list, distinguish_unknowns=False) name_list = ibs.get_annot_names(aid_list) lbls_list = [[] for _ in range(len(aid_list))] if kwargs.get('show_name', False): for count, (lbls, name) in enumerate(zip(lbls_list, name_list)): lbls.append(ut.repr2((name))) if kwargs.get('show_nid', True): for count, (lbls, nid) in enumerate(zip(lbls_list, nid_list)): # only label the first two images with nids LABEL_ALL_NIDS = False if count <= 1 or LABEL_ALL_NIDS: #lbls.append(vh.get_nidstrs(nid)) lbls.append(('q' if count == 0 else '') + vh.get_nidstrs(nid)) if kwargs.get('show_aid', True): for count, (lbls, aid) in enumerate(zip(lbls_list, aid_list)): lbls.append(('q' if count == 0 else '') + vh.get_aidstrs(aid)) if (kwargs.get('show_annot_score', True) and name_annot_scores is not None): max_digits = kwargs.get('score_precision', None) for (lbls, score) in zip(lbls_list[1:], name_annot_scores): lbls.append(ut.num_fmt(score, max_digits=max_digits)) lbl_list = [' : '.join(lbls) for lbls in lbls_list] else: lbl_list = [None] * len(aid_list) #pt.set_title(title, ax) # Plot annotations over images if in_image: in_image_bbox_list = vh.get_bboxes(ibs, aid_list, offset_list) in_image_theta_list = ibs.get_annot_thetas(aid_list) # HACK! #if show_query: # pt.draw_bbox(bbox1, bbox_color=pt.ORANGE, lbl=lbl1, theta=theta1) bbox_color = pt.ORANGE bbox_color = truth_color if draw_border else pt.ORANGE for bbox, theta, lbl in zip(in_image_bbox_list, in_image_theta_list, lbl_list): pt.draw_bbox(bbox, bbox_color=bbox_color, lbl=lbl, theta=theta) pass else: xy, w, h = pt.get_axis_xy_width_height(ax) #theta2 = 0 #if xywh2 is None: # #xywh2 = (xy[0], xy[1], w, h) # # weird when sidebyside is off y seems to be inverted # xywh2 = (0, 0, w, h) #if not show_query and xywh1 is None: # data_config2 = None if qreq_ is None else # qreq_.get_external_data_config2() # kpts2 = ibs.get_annot_kpts([aid2], config2_=data_config2)[0] # #pt.draw_kpts2(kpts2.take(fm.T[1], axis=0)) # # Draw any selected matches # #sm_kw = dict(rect=True, colors=pt.BLUE) # pt.plot_fmatch(None, xywh2, None, kpts2, fm, fs=fs, **kwargs) #if draw_border: # pt.draw_border(ax, truth_color, 4, offset=offset2) if draw_border: pt.draw_border(ax, color=truth_color, lw=4) if draw_lbl: # Custom user lbl for chips 1 and 2 #if show_query: # (x1, y1, w1, h1) = xywh1 # pt.absolute_lbl(x1 + w1, y1, lbl1) for bbox, lbl in zip(bbox_list, lbl_list): (x, y, w, h) = bbox pt.absolute_lbl(x + w, y, lbl) # No matches draw a red box if True: no_matches = name_fm_list is None or all([True if fm is None else len(fm) == 0 for fm in name_fm_list]) if no_matches: xy, w, h = pt.get_axis_xy_width_height(ax) #axes_bbox = (xy[0], xy[1], w, h) if draw_border: pass
def save_figure(fnum=None, fpath=None, fpath_strict=None, usetitle=False, overwrite=True, defaultext=None, verbose=1, dpi=None, figsize=None, saveax=None, fig=None, dpath=None): """ Helper to save the figure image to disk. Tries to be smart about filename lengths, extensions, overwrites, etc... DEPCIATE Args: fnum (int): figure number fpath (str): file path string fpath_strict (str): uses this exact path usetitle (bool): uses title as the fpath overwrite (bool): default=True defaultext (str): default extension verbose (int): verbosity flag dpi (int): dots per inch figsize (tuple(int, int)): figure size saveax (bool or Axes): specifies if the axes should be saved instead of the figure References: for saving only a specific Axes http://stackoverflow.com/questions/4325733/save-a-subplot-in-matplotlib http://robotics.usc.edu/~ampereir/wordpress/?p=626 http://stackoverflow.com/questions/1271023/resize-a-figure-automatically-in-matplotlib """ if dpi is None: dpi = custom_constants.DPI if defaultext is None: if mpl.get_backend().lower() == 'pdf': defaultext = '.pdf' else: defaultext = '.jpg' #print('figsize = %r' % (figsize,)) fig, fnum = prepare_figure_for_save(fnum, dpi, figsize, fig) if fpath_strict is None: fpath_clean = prepare_figure_fpath(fig, fpath, fnum, usetitle, defaultext, verbose, dpath) else: fpath_clean = fpath_strict savekw = {'dpi': dpi} if verbose > 1: #print('verbose = %r' % (verbose,)) print('[pt.save_figure] saveax = %r' % (saveax, )) if False: import plottool as pt extent = pt.extract_axes_extents(fig) savekw['bbox_inches'] = extent if saveax is not None and saveax is not False: if verbose > 0: print("\n[pt.save_figure] SAVING ONLY EXTENT saveax=%r\n" % (saveax, )) if saveax is True: saveax = plt.gca() #ut.embed() #saveax.set_aspect('auto') import plottool as pt import numpy as np xy, w, h = pt.get_axis_xy_width_height(saveax) ar = np.abs(w / h) if verbose == 2: print('[pt.save_figure] saveax xywh = %r' % ((xy, w, h), )) print('[pt.save_figure] saveax ar = %.2f' % (ar, )) saveax.set_aspect('equal') # extent is bbox in the form [[x0, y0], [x1, y1]] extent = saveax.get_window_extent().transformed( fig.dpi_scale_trans.inverted()) if verbose == 2: print('[pt.save_figure] bbox ar = %.2f' % np.abs( (extent.width / extent.height, ))) #extent = saveax.get_window_extent().transformed(fig.transFigure.inverted()) #print('[df2] bbox ar = %.2f' % np.abs((extent.width / extent.height,))) savekw['bbox_inches'] = extent.expanded(1.0, 1.0) if verbose == 2: print('[pt.save_figure] savekw = ' + ut.dict_str(savekw)) #ut.embed() #fname_clean = split(fpath_clean)[1] with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) if overwrite or not exists(fpath_clean): if verbose == 2: print('[pt.save_figure] save_figure() full=%r' % (fpath_clean, )) elif verbose == 1: fpathndir = ut.path_ndir_split(fpath_clean, 5) print('[pt.save_figure] save_figure() ndir=%r' % (fpathndir)) #fig.savefig(fpath_clean) if verbose > 1 or ut.VERBOSE: print(']pt.save_figure] fpath_clean = %s' % (fpath_clean, )) print('[pt.save_figure] savekw = ' + ut.dict_str(savekw)) # savekw['bbox_inches'] = 'tight' #print('savekw = %r' % (savekw,)) if fpath_clean.endswith('.png'): savekw['transparent'] = True savekw['edgecolor'] = 'none' #savekw['axes.edgecolor'] = 'none' fig.savefig(fpath_clean, **savekw) else: if verbose > 0: print('[pt.save_figure] not overwriteing') return fpath_clean
def save_figure(fnum=None, fpath=None, fpath_strict=None, usetitle=False, overwrite=True, defaultext=None, verbose=1, dpi=None, figsize=None, saveax=None, fig=None, dpath=None): """ Helper to save the figure image to disk. Tries to be smart about filename lengths, extensions, overwrites, etc... DEPCIATE Args: fnum (int): figure number fpath (str): file path string fpath_strict (str): uses this exact path usetitle (bool): uses title as the fpath overwrite (bool): default=True defaultext (str): default extension verbose (int): verbosity flag dpi (int): dots per inch figsize (tuple(int, int)): figure size saveax (bool or Axes): specifies if the axes should be saved instead of the figure References: for saving only a specific Axes http://stackoverflow.com/questions/4325733/save-a-subplot-in-matplotlib http://robotics.usc.edu/~ampereir/wordpress/?p=626 http://stackoverflow.com/questions/1271023/resize-a-figure-automatically-in-matplotlib """ if dpi is None: dpi = custom_constants.DPI if defaultext is None: if mpl.get_backend().lower() == 'pdf': defaultext = '.pdf' else: defaultext = '.jpg' #print('figsize = %r' % (figsize,)) fig, fnum = prepare_figure_for_save(fnum, dpi, figsize, fig) if fpath_strict is None: fpath_clean = prepare_figure_fpath(fig, fpath, fnum, usetitle, defaultext, verbose, dpath) else: fpath_clean = fpath_strict savekw = {'dpi': dpi} if verbose > 1: #print('verbose = %r' % (verbose,)) print('[pt.save_figure] saveax = %r' % (saveax,)) if False: import plottool as pt extent = pt.extract_axes_extents(fig) savekw['bbox_inches'] = extent if saveax is not None and saveax is not False: if verbose > 0: print("\n[pt.save_figure] SAVING ONLY EXTENT saveax=%r\n" % (saveax,)) if saveax is True: saveax = plt.gca() #ut.embed() #saveax.set_aspect('auto') import plottool as pt import numpy as np xy, w, h = pt.get_axis_xy_width_height(saveax) ar = np.abs(w / h) if verbose == 2: print('[pt.save_figure] saveax xywh = %r' % ((xy, w, h),)) print('[pt.save_figure] saveax ar = %.2f' % (ar,)) saveax.set_aspect('equal') # extent is bbox in the form [[x0, y0], [x1, y1]] extent = saveax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) if verbose == 2: print('[pt.save_figure] bbox ar = %.2f' % np.abs((extent.width / extent.height,))) #extent = saveax.get_window_extent().transformed(fig.transFigure.inverted()) #print('[df2] bbox ar = %.2f' % np.abs((extent.width / extent.height,))) savekw['bbox_inches'] = extent.expanded(1.0, 1.0) if verbose == 2: print('[pt.save_figure] savekw = ' + ut.dict_str(savekw)) #ut.embed() #fname_clean = split(fpath_clean)[1] with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) if overwrite or not exists(fpath_clean): if verbose == 2: print('[pt.save_figure] save_figure() full=%r' % (fpath_clean,)) elif verbose == 1: fpathndir = ut.path_ndir_split(fpath_clean, 5) print('[pt.save_figure] save_figure() ndir=%r' % (fpathndir)) #fig.savefig(fpath_clean) if verbose > 1 or ut.VERBOSE: print(']pt.save_figure] fpath_clean = %s' % (fpath_clean, )) print('[pt.save_figure] savekw = ' + ut.dict_str(savekw)) # savekw['bbox_inches'] = 'tight' #print('savekw = %r' % (savekw,)) if fpath_clean.endswith('.png'): savekw['transparent'] = True savekw['edgecolor'] = 'none' #savekw['axes.edgecolor'] = 'none' fig.savefig(fpath_clean, **savekw) else: if verbose > 0: print('[pt.save_figure] not overwriteing') return fpath_clean