def getbb(sc, ax): """ Function to return a list of bounding boxes in data coordinates for a scatter plot """ transform = sc.get_transform() transOffset = sc.get_offset_transform() offsets = sc._offsets paths = sc.get_paths() transforms = sc.get_transforms() if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() if isinstance(offsets, np.ma.MaskedArray): offsets = offsets.filled(np.nan) bboxes = [] if len(paths) and len(offsets): if len(paths) < len(offsets): # for usual scatters you have one path, but several offsets paths = [paths[0]] * len(offsets) if len(transforms) < len(offsets): # often you may have a single scatter size, but several offsets transforms = [transforms[0]] * len(offsets) for p, o, t in zip(paths, offsets, transforms): result = get_path_collection_extents(transform.frozen(), [p], [t], [o], transOffset.frozen()) bboxes.append(result) return bboxes
def get_datalim(self, transData): transform = self.get_transform() transOffset = self._transOffset offsets = self._offsets paths = self.get_paths() if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() offsets = np.asanyarray(offsets, np.float_) if np.ma.isMaskedArray(offsets): offsets = offsets.filled(np.nan) # get_path_collection_extents handles nan but not masked arrays offsets.shape = (-1, 2) # Make it Nx2 result = mpath.get_path_collection_extents(transform.frozen(), paths, self.get_transforms(), offsets, transOffset.frozen()) result = result.inverse_transformed(transData) return result
def get_datalim(self, transData): transform = self.get_transform() transOffset = self.get_offset_transform() offsets = self._offsets paths = self.get_paths() if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() offsets = np.asanyarray(offsets, np.float_) if np.ma.isMaskedArray(offsets): offsets = offsets.filled(np.nan) # get_path_collection_extents handles nan but not masked arrays offsets.shape = (-1, 2) # Make it Nx2 result = mpath.get_path_collection_extents( transform.frozen(), paths, self.get_transforms(), offsets, transOffset.frozen()) result = result.inverse_transformed(transData) return result
def get_datalim(self, transData): transform = self.get_transform() transOffset = self._transOffset offsets = self._offsets paths = self.get_paths() if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() offsets = np.asarray(offsets, np.float_) result = mpath.get_path_collection_extents( transform.frozen(), paths, self.get_transforms(), offsets, transOffset.frozen()) result = result.inverse_transformed(transData) return result
def get_bboxes_pathcollection(sc, ax): """Function to return a list of bounding boxes in display coordinates for a scatter plot Thank you to ImportanceOfBeingErnest https://stackoverflow.com/a/55007838/1304161""" # ax.figure.canvas.draw() # need to draw before the transforms are set. transform = sc.get_transform() transOffset = sc.get_offset_transform() offsets = sc._offsets paths = sc.get_paths() transforms = sc.get_transforms() if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() if isinstance(offsets, np.ma.MaskedArray): offsets = offsets.filled(np.nan) bboxes = [] if len(paths) and len(offsets): if len(paths) < len(offsets): # for usual scatters you have one path, but several offsets paths = [paths[0]] * len(offsets) if len(transforms) < len(offsets): # often you may have a single scatter size, but several offsets transforms = [transforms[0]] * len(offsets) for p, o, t in zip(paths, offsets, transforms): result = get_path_collection_extents( transform.frozen(), [p], [t], [o], transOffset.frozen() ) bboxes.append(result) return bboxes
def get_bboxes_pathcollection(sc, ax): """Function to return a list of bounding boxes in data coordinates for a scatter plot Thank you to ImportanceOfBeingErnest https://stackoverflow.com/a/55007838/1304161""" # ax.figure.canvas.draw() # need to draw before the transforms are set. transform = sc.get_transform() transOffset = sc.get_offset_transform() offsets = sc._offsets paths = sc.get_paths() transforms = sc.get_transforms() if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() if isinstance(offsets, np.ma.MaskedArray): offsets = offsets.filled(np.nan) bboxes = [] if len(paths) and len(offsets): if len(paths) < len(offsets): # for usual scatters you have one path, but several offsets paths = [paths[0]]*len(offsets) if len(transforms) < len(offsets): # often you may have a single scatter size, but several offsets transforms = [transforms[0]]*len(offsets) for p, o, t in zip(paths, offsets, transforms): result = get_path_collection_extents( transform.frozen(), [p], [t], [o], transOffset.frozen()) bboxes.append(result.inverse_transformed(ax.transData)) return bboxes
def getbb(sc, ax): """ Function to return a list of bounding boxes in data coordinates for a scatter plot. Directly taken from https://stackoverflow.com/questions/55005272/ """ ax.figure.canvas.draw() # need to draw before the transforms are set. transform = sc.get_transform() transOffset = sc.get_offset_transform() offsets = sc._offsets paths = sc.get_paths() transforms = sc.get_transforms() if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() if isinstance(offsets, np.ma.MaskedArray): offsets = offsets.filled(np.nan) bboxes = [] if len(paths) and len(offsets): if len(paths) < len(offsets): # for usual scatters you have one path, but several offsets paths = [paths[0]] * len(offsets) if len(transforms) < len(offsets): # often you may have a single scatter size, but several offsets transforms = [transforms[0]] * len(offsets) for p, o, t in zip(paths, offsets, transforms): result = get_path_collection_extents(transform.frozen(), [p], [t], [o], transOffset.frozen()) bboxes.append(result.transformed(ax.transData.inverted())) return bboxes
def get_datalim(self, transData): """Get the smallest rectangle that encloses the collection.""" transform = self.get_transform() # reverse the translation in transOffset transOffset = self.get_offset_transform().frozen() transOffset_inv = transOffset.inverted() transOffset.get_matrix()[:2, 2:] = transOffset_inv.get_matrix()[:2, 2:] offsets = self._offsets paths = self.get_paths() if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() if isinstance(offsets, np.ma.MaskedArray): offsets = offsets.filled(np.nan) # get_path_collection_extents handles nan but not masked arrays if len(paths) and len(offsets): transforms = self.get_transforms() transforms = np.matmul(transData.get_matrix(), transforms) result = mpath.get_path_collection_extents( transform.frozen(), paths, transforms, offsets, transOffset.frozen(), ) result = result.inverse_transformed(transData) else: result = mtransforms.Bbox.null() return result