def draw(self, renderer, *args, **kwargs): bbox = self.get_window_extent(renderer) stretch_factor = bbox.height / bbox.width ny = int(stretch_factor*self._ribbonbox.nx) if self._cached_ny != ny: arr = self._ribbonbox.get_stretched_image(stretch_factor) self.set_array(arr) self._cached_ny = ny BboxImage.draw(self, renderer, *args, **kwargs)
def draw(self, renderer, *args, **kwargs): bbox = self.get_window_extent(renderer) stretch_factor = bbox.height / bbox.width ny = int(stretch_factor * self._ribbonbox.nx) if self._cached_ny != ny: arr = self._ribbonbox.get_stretched_image(stretch_factor) self.set_array(arr) self._cached_ny = ny BboxImage.draw(self, renderer, *args, **kwargs)
class PathClippedImagePatch(PathPatch): """ The given image is used to draw the face of the patch. Internally, it uses BboxImage whose clippath set to the path of the patch. FIXME : The result is currently dpi dependent. """ def __init__(self, path, bbox_image, **kwargs): super().__init__(path, **kwargs) self.bbox_image = BboxImage(self.get_window_extent, norm=None, origin=None) self.bbox_image.set_data(bbox_image) def set_facecolor(self, color): """Simply ignore facecolor.""" super().set_facecolor("none") def draw(self, renderer=None): # the clip path must be updated every draw. any solution? -JJ self.bbox_image.set_clip_path(self._path, self.get_transform()) self.bbox_image.draw(renderer) super().draw(renderer)
class OffsetImage(OffsetBox): def __init__(self, arr, zoom=1, cmap = None, norm = None, interpolation=None, origin=None, filternorm=1, filterrad=4.0, resample = False, dpi_cor=True, **kwargs ): self._dpi_cor = dpi_cor self.image = BboxImage(bbox=self.get_window_extent, cmap = cmap, norm = norm, interpolation=interpolation, origin=origin, filternorm=filternorm, filterrad=filterrad, resample = resample, **kwargs ) self._children = [self.image] self.set_zoom(zoom) self.set_data(arr) OffsetBox.__init__(self) def set_data(self, arr): self._data = np.asarray(arr) self.image.set_data(self._data) def get_data(self): return self._data def set_zoom(self, zoom): self._zoom = zoom def get_zoom(self): return self._zoom # def set_axes(self, axes): # self.image.set_axes(axes) # martist.Artist.set_axes(self, axes) # def set_offset(self, xy): # """ # set offset of the container. # Accept : tuple of x,y cooridnate in disokay units. # """ # self._offset = xy # self.offset_transform.clear() # self.offset_transform.translate(xy[0], xy[1]) def get_offset(self): """ return offset of the container. """ return self._offset def get_children(self): return [self.image] def get_window_extent(self, renderer): ''' get the bounding box in display space. ''' w, h, xd, yd = self.get_extent(renderer) ox, oy = self.get_offset() return mtransforms.Bbox.from_bounds(ox-xd, oy-yd, w, h) def get_extent(self, renderer): if self._dpi_cor: # True, do correction dpi_cor = renderer.points_to_pixels(1.) else: dpi_cor = 1. zoom = self.get_zoom() data = self.get_data() ny, nx = data.shape[:2] w, h = nx*zoom, ny*zoom return w, h, 0, 0 def draw(self, renderer): """ Draw the children """ self.image.draw(renderer)
class OffsetImage(OffsetBox): def __init__(self, arr, zoom=1, cmap=None, norm=None, interpolation=None, origin=None, filternorm=1, filterrad=4.0, resample=False, dpi_cor=True, **kwargs): self._dpi_cor = dpi_cor self.image = BboxImage(bbox=self.get_window_extent, cmap=cmap, norm=norm, interpolation=interpolation, origin=origin, filternorm=filternorm, filterrad=filterrad, resample=resample, **kwargs) self._children = [self.image] self.set_zoom(zoom) self.set_data(arr) OffsetBox.__init__(self) def set_data(self, arr): self._data = np.asarray(arr) self.image.set_data(self._data) def get_data(self): return self._data def set_zoom(self, zoom): self._zoom = zoom def get_zoom(self): return self._zoom # def set_axes(self, axes): # self.image.set_axes(axes) # martist.Artist.set_axes(self, axes) # def set_offset(self, xy): # """ # set offset of the container. # Accept : tuple of x,y cooridnate in disokay units. # """ # self._offset = xy # self.offset_transform.clear() # self.offset_transform.translate(xy[0], xy[1]) def get_offset(self): """ return offset of the container. """ return self._offset def get_children(self): return [self.image] def get_window_extent(self, renderer): ''' get the bounding box in display space. ''' w, h, xd, yd = self.get_extent(renderer) ox, oy = self.get_offset() return mtransforms.Bbox.from_bounds(ox - xd, oy - yd, w, h) def get_extent(self, renderer): if self._dpi_cor: # True, do correction dpi_cor = renderer.points_to_pixels(1.) else: dpi_cor = 1. zoom = self.get_zoom() data = self.get_data() ny, nx = data.shape[:2] w, h = nx * zoom, ny * zoom return w, h, 0, 0 def draw(self, renderer): """ Draw the children """ self.image.draw(renderer)
def draw(self, renderer, *args, **kwargs): bbox = self.get_window_extent(renderer) stretch_factor = bbox.height / bbox.width ny = int(stretch_factor*self._ribbonbox.nx) if self._cached_ny != ny: arr = self._ribbonbox.get_stretched_image(stretch_factor) self.set_array(arr) self._cached_ny = ny BboxImage.draw(self, renderer, *args, **kwargs) if 1: from matplotlib.transforms import Bbox, TransformedBbox from matplotlib.ticker import ScalarFormatter fig, ax = plt.subplots() years = np.arange(2004, 2009) box_colors = [(0.8, 0.2, 0.2), (0.2, 0.8, 0.2), (0.2, 0.2, 0.8), (0.7, 0.5, 0.8), (0.3, 0.8, 0.7), ] heights = np.random.random(years.shape) * 7000 + 3000 fmt = ScalarFormatter(useOffset=False) ax.xaxis.set_major_formatter(fmt) for year, h, bc in zip(years, heights, box_colors): bbox0 = Bbox.from_extents(year-0.4, 0., year+0.4, h) bbox = TransformedBbox(bbox0, ax.transData) rb_patch = RibbonBoxImage(bbox, bc, interpolation="bicubic") ax.add_artist(rb_patch) ax.annotate(r"%d" % (int(h/100.)*100), (year, h), va="bottom", ha="center") patch_gradient = BboxImage(ax.bbox, interpolation="bicubic", zorder=0.1, ) gradient = np.zeros((2, 2, 4), dtype=np.float) gradient[:,:,:3] = [1, 1, 0.] gradient[:,:,3] = [[0.1, 0.3],[0.3, 0.5]] # alpha channel patch_gradient.set_array(gradient) ax.add_artist(patch_gradient) ax.set_xlim(years[0]-0.5, years[-1]+0.5) ax.set_ylim(0, 10000) fig.savefig('ribbon_box.png') plt.show()