def show(self, *args, **kwargs): """ Wrapper to imshow. Converts to gray to allow color maps. Notes ----- Differs from patchshow in that the collective image (bg, grid, particles) is a series of masks, so they have to be drawn onto a single ndarray and then plotted. Sicne patchshow is writing patchs, it can plot the background separate from the grid and particles, which is slightly easier""" # This will pull out "ax", leaving remaing args/kwargs axes, kwargs = _parse_ax(*args, **kwargs) title = kwargs.pop('title', None) save = kwargs.pop('save', None) bgonly = kwargs.pop('bgonly', False) annotate = kwargs.pop('annotate', False) grid = kwargs.pop('grid', False) gcolor = kwargs.pop('gcolor', None) gunder = kwargs.pop('gunder', False) gstyle = kwargs.pop('gstyle', None) #NOT USED nolabel = kwargs.pop('nolabel', False) zoom = kwargs.pop('zoom', None) if gstyle: raise CanvasPlotError('"gstyle" only valid for patchshow()') if 'pmap' in kwargs: raise CanvasPlotError('"pmap" is only valid for patchshow() method') PBINARY = False if 'cmap' in kwargs: if kwargs['cmap'] == 'pbinary' or kwargs['cmap'] == 'pbinary_r': PBINARY = kwargs['cmap'] del kwargs['cmap'] # Get the background if bgonly: if 'cmap' not in kwargs: raise CanvasPlotError('"bgonly" is only valid when a colormap is' ' passed.') bg = kwargs['cmap'](self.graybackground)[... , :3] del kwargs['cmap'] else: bg = self.background if PBINARY: if PBINARY == 'pbinary_r': bg = np.ones(bg.shape).astype(bool) else: bg = np.zeros(bg.shape).astype(bool) # grid overlay if gcolor or gunder and not grid: grid = True # If user enters gcolor, assume default grid if grid and not gcolor: gcolor = GCOLOR # Map attributes from grid (centers, corners, grid) gattr = np.zeros(bg.shape).astype(bool) #IE pass if grid: if not gcolor: gcolor = GCOLOR if grid == True: grid = 'grid' # Validate grid keyword try: gattr=getattr( self.grid, grid.lower() ) except Exception: raise CanvasPlotError('Invalid grid argument, "%s". Choose from: ' 'True, "grid", "centers", "corners", "hlines", "vlines"' % grid) gcolor = to_normrgb(gcolor) #Draw grid over or under? if gunder: bg[gattr] = gcolor image = self._draw_particles(bg, force_binary=PBINARY) else: image = self._draw_particles(bg, force_binary=PBINARY) image[gattr] = gcolor # GRAY CONVERT if 'cmap' in kwargs: image = rgb2uint(image) # Matplotlib if axes: axes.imshow(image, **kwargs) else: axes = plt.imshow(image, **kwargs).axes axes = self._annotate_plot(axes, annotate, title) # SHOW DOESNT ACTUALLY CROP ANYTHING WHEN ZOOMING if zoom: xi, yi, xf, yf = zoom axes.set_xlim(xi, xf) axes.set_ylim(yf, yi) if nolabel: axes.xaxis.set_visible(False) axes.yaxis.set_visible(False) if nolabel == 'x': axes.yaxis.set_visible(True) elif nolabel == 'y': axes.xaxis.set_visible(True) if save: path = _parse_path(save) skimage.io.imsave(path, image) return axes
def patchshow(self, *args, **kwargs): """ ... args/kwargs include alpha, edgecolors, linestyles Notes: Matplotlib API is setup that args or kwargs can be entered. Order is important for args, but the correspond to same kwargs. """ axes, kwargs = _parse_ax(*args, **kwargs) title = kwargs.pop('title', None) bgonly = kwargs.pop('bgonly', False) annotate = kwargs.pop('annotate', False) zoom = kwargs.pop('zoom', None) grid = kwargs.pop('grid', False) gcolor = kwargs.pop('gcolor', None) gstyle = kwargs.pop('gstyle', None) gunder = kwargs.pop('gunder',False) pmap = kwargs.pop('pmap', None) nolabel = kwargs.pop('nolabel', None) alpha = kwargs.get('alpha', None) edgecolor = kwargs.get('edgecolor', None) linewidth = kwargs.get('linewidth', None) linestyle = kwargs.get('linestyle', None) # Some keywords to savefig; not all supported save = kwargs.pop('save', None) dpi = kwargs.pop('dpi', None) bbox_inches = kwargs.pop('bbox_inches', None) # GET NOT POP cmap = kwargs.get('cmap', None) # Implement later if cmap in ['pbinary', 'pbinary_r']: raise CanvasPlotError('"pbinary(_r)" color map only valid for .show()') # grid defaults if gcolor or gunder or gstyle and not grid: grid = True # If user enters gcolor/gstyle, assume default grid if grid and not gcolor: gcolor = GCOLOR if grid and not gstyle: gstyle = 'solid' # Corner case, don't touch if pmap and cmap and bgonly: bgonly = False if bgonly and not cmap: raise CanvasPlotError('"bgonly" is only valid when a colormap is' ' passed.') if cmap: bg = self.graybackground else: bg = self.background if zoom: xi, yi, xf, yf = zoom bg = crop(bg, zoom) #Overwrite axes image if not axes: fig, axes = plt.subplots() else: axes.images=[] # DONT PASS ALL KWARGS axes.imshow(bg, cmap=cmap) # FOR PATICLES IN IMAGE ONLY. in_and_edges = self.pin + self.pedge # PARTICLE FACECOLOR, ALPHA and other PATCH ARGS # http://matplotlib.org/api/artist_api.html#matplotlib.patches.Patch patches = [p.particle.as_patch(facecolor=p.color, alpha=alpha, edgecolor=edgecolor, linestyle=linestyle, linewidth=linewidth) for p in in_and_edges] # If no particles or grid, just pass to avoid deep mpl exceptiosn if patches or grid: if patches: if pmap: kwargs['cmap'] = pmap if 'cmap' in kwargs and not bgonly: ppatch = PatchCollection(patches, **kwargs) #cmap and Patch Args ppatch.set_array(np.arange(len(patches))) # Use settings passed to "patches" else: ppatch = PatchCollection(patches, match_original=True, **kwargs) # # Grid under particles if gunder: axes.add_collection(self.grid.as_patch( edgecolors=gcolor, linestyles=gstyle)) if patches: axes.add_collection(ppatch) # Grid over particles else: if patches: axes.add_collection(ppatch) if grid: axes.add_collection(self.grid.as_patch( edgecolors=gcolor, linestyles=gstyle)) axes = self._annotate_plot(axes, annotate, title) if zoom: axes.set_xlim(xi, xf) axes.set_ylim(yf, yi) if nolabel: axes.xaxis.set_visible(False) axes.yaxis.set_visible(False) if nolabel == 'x': axes.yaxis.set_visible(True) elif nolabel == 'y': axes.xaxis.set_visible(True) if save: path = _parse_path(save) plt.savefig(path, dpi=dpi, bbox_inches=bbox_inches) return axes