diff --git a/README.md b/README.md index e2fce0f..f3db8d2 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ If you want to use developmental version, it can be installed using the followin `pip install git+https://github.com/ponnhide/patchworklib.git` ## News +- Developmental verion on GitHub practically supports plotnine version 0.12.1. +- Modified `align_xlabels` and `align_ylabels` functions so that they support to align labels on subplots. + #### 05162023: version 0.6.1 is released. - I could not fully support plotnine version 0.12.1 (It works, but patchworklib arrangement results are not as expected). I will do not support plotnine in the future. - Bricks object gained the new methods `align_xlabels` and `align_ylabels`, which help users align x/y labels of the given Brick object. diff --git a/patchworklib/patchworklib.py b/patchworklib/patchworklib.py index 0cb75ac..494e8c6 100644 --- a/patchworklib/patchworklib.py +++ b/patchworklib/patchworklib.py @@ -1893,49 +1893,71 @@ def change_plotsize(self, new_size): def align_xlabels(self, keys=None): global _basefigure + global _axes_dict renderer = _basefigure.canvas.get_renderer() + if keys is None: - keys = self.bricks_dict.keys() + keys = [key for key in self._labels if key[0:5] != "case:" and key[0:8] != "outline:"] else: - pass - + pass + targets = [key if type(key) in (Bricks, Brick, cBrick) else _axes_dict[key] for key in keys] + miny = None - for key in keys: - x, y = self[key].xaxis.get_label().get_position() - text = self[key].xaxis.get_label().get_text() + for target in targets: + if type(target) == Bricks: + x, y = target._case.xaxis.get_label().get_position() + text = target._case.xaxis.get_label().get_text() + else: + x, y = target.xaxis.get_label().get_position() + text = target.xaxis.get_label().get_text() if miny is None or y < miny: miny = y - for key in keys: - pad = self[key].xaxis.labelpad - x, y = self[key].xaxis.get_label().get_position() - text = self[key].xaxis.get_label().get_text() - self[key].set_xlabel(text, x=x, y=y, labelpad=pad + (y-miny)*(72 / _basefigure.dpi)) + for target in targets: + if type(target) != Bricks: + pad = target.xaxis.labelpad + x, y = target.xaxis.get_label().get_position() + text = target.xaxis.get_label().get_text() + target.set_xlabel(text, x=x, y=y, labelpad=pad + (y-miny)*(72 / _basefigure.dpi)) + else: + pad = target._case.xaxis.labelpad + x, y = target._case.xaxis.get_label().get_position() + text = target._case.xaxis.get_label().get_text() + target._case.set_xlabel(text, x=x, y=y, labelpad=pad + (y-miny)*(72 / _basefigure.dpi)) def align_ylabels(self, keys=None, ha="left"): global _basefigure + global _axes_dict renderer = _basefigure.canvas.get_renderer() + if keys is None: - keys = self.bricks_dict.keys() + keys = [key for key in self._labels if key[0:5] != "case:" and key[0:8] != "outline:"] else: - pass - + pass + targets = [key if type(key) in (Bricks, Brick, cBrick) else _axes_dict[key] for key in keys] + minx = None - for key in keys: - x, y = self[key].yaxis.get_label().get_position() - text = self[key].yaxis.get_label().get_text() - #coordinate = self[key].transAxes.inverted() - #bbox_text = self[key].yaxis.get_label().get_window_extent(renderer=renderer) - #bbox_text = Bbox(coordinate.transform(bbox_text)) - #x = x + bbox_text.width + for target in targets: + if type(target) == Bricks: + x, y = target._case.yaxis.get_label().get_position() + text = target._case.yaxis.get_label().get_text() + else: + x, y = target.yaxis.get_label().get_position() + text = target.yaxis.get_label().get_text() if minx is None or x < minx: minx = x - for key in keys: - pad = self[key].yaxis.labelpad - x, y = self[key].yaxis.get_label().get_position() - text = self[key].yaxis.get_label().get_text() - self[key].set_ylabel(text, x=x, y=y, labelpad=pad + (x-minx)*(72 / _basefigure.dpi)) + for target in targets: + if type(target) != Bricks: + pad = target.yaxis.labelpad + x, y = target.yaxis.get_label().get_position() + text = target.yaxis.get_label().get_text() + target.set_ylabel(text, x=x, y=y, labelpad=pad + (x-minx)*(72 / _basefigure.dpi)) + else: + pad = target._case.yaxis.labelpad + x, y = target._case.yaxis.get_label().get_position() + text = target._case.yaxis.get_label().get_text() + target._case.set_ylabel(text, x=x, y=y, labelpad=pad + (x-minx)*(72 / _basefigure.dpi)) def set_supxlabel(self, xlabel, labelpad=None, *, loc=None, **args): """