import numpy as np import matplotlib as mpl from matplotlib import _pylab_helpers from matplotlib.rcsetup import interactive_bk as _interactive_bk import matplotlib.pyplot as plt import os import time def save(path, remove_axis=False, dpi=300, fig=None): if fig is None: fig = plt.gcf() dirname = os.path.dirname(path) if dirname != '' and not os.path.exists(dirname): os.makedirs(dirname) if remove_axis: for ax in fig.axes: ax.axis('off') ax.margins(0, 0) fig.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) for ax in fig.axes: ax.xaxis.set_major_locator(plt.NullLocator()) ax.yaxis.set_major_locator(plt.NullLocator()) fig.savefig(path, dpi=dpi, bbox_inches='tight', pad_inches=0) def color_map(im_, cmap='viridis', vmin=None, vmax=None): cm = plt.get_cmap(cmap) im = im_.copy() if vmin is None: vmin = np.nanmin(im) if vmax is None: vmax = np.nanmax(im) mask = np.logical_not(np.isfinite(im)) im[mask] = vmin im = (im.clip(vmin, vmax) - vmin) / (vmax - vmin) im = cm(im) im = im[..., :3] for c in range(3): im[mask, c] = 1 return im def interactive_legend(leg=None, fig=None, all_axes=True): if leg is None: leg = plt.legend() if fig is None: fig = plt.gcf() if all_axes: axs = fig.get_axes() else: axs = [fig.gca()] # lined = dict() # lines = ax.lines # for legline, origline in zip(leg.get_lines(), ax.lines): # legline.set_picker(5) # lined[legline] = origline lined = dict() for lidx, legline in enumerate(leg.get_lines()): legline.set_picker(5) lined[legline] = [ax.lines[lidx] for ax in axs] def onpick(event): if event.mouseevent.dblclick: tmp = [(k, v) for k, v in lined.items()] else: tmp = [(event.artist, lined[event.artist])] for legline, origline in tmp: for ol in origline: vis = not ol.get_visible() ol.set_visible(vis) if vis: legline.set_alpha(1.0) else: legline.set_alpha(0.2) fig.canvas.draw() fig.canvas.mpl_connect('pick_event', onpick) def non_annoying_pause(interval, focus_figure=False): # https://github.com/matplotlib/matplotlib/issues/11131 backend = mpl.rcParams['backend'] if backend in _interactive_bk: figManager = _pylab_helpers.Gcf.get_active() if figManager is not None: canvas = figManager.canvas if canvas.figure.stale: canvas.draw() if focus_figure: plt.show(block=False) canvas.start_event_loop(interval) return time.sleep(interval) def remove_all_ticks(fig=None): if fig is None: fig = plt.gcf() for ax in fig.axes: ax.axes.get_xaxis().set_visible(False) ax.axes.get_yaxis().set_visible(False)