class Barplot: def __init__( self, series: Series, *, style: str = "whitegrid", palette: str = "pastel", ) -> None: self.__axes = Figure(tight_layout=True).add_subplot() seaborn.set_theme(style=style, palette=palette) seaborn.barplot(x=series.index, y=series, ax=self.__axes) seaborn.despine(ax=self.__axes) def get_xticklabels(self) -> List[str]: return [ xticklabel.get_text() for xticklabel in self.__axes.get_xticklabels() ] def get_xlabel(self) -> str: return self.__axes.get_xlabel() def get_ylabel(self) -> str: return self.__axes.get_ylabel() def get_annotations(self) -> List[str]: return [ child.get_text() for child in self.__axes.get_children() if isinstance(child, Annotation) ] def set_xticklabels(self, labels: List[str]) -> Barplot: xticklabels = self.__axes.get_xticklabels() for xticklabel in xticklabels: old_text = xticklabel.get_text() idx = int(old_text) new_text = labels[idx] xticklabel.set_text(new_text) self.__axes.set_xticklabels(xticklabels) return self def set_xlabel(self, label: str) -> Barplot: self.__axes.set_xlabel(label) return self def set_ylabel(self, label: str) -> Barplot: self.__axes.set_ylabel(label) return self def set_annotations( self, *, ha: str = "center", va: str = "bottom", ) -> Barplot: for patch in self.__axes.patches: x = patch.get_x() y = patch.get_y() height = patch.get_height() width = patch.get_width() if round(height, 2) != 0: self.__axes.annotate( text=f"{height:.0f}" if height.is_integer() else f"{height:.2f}", xy=(x + width / 2, y + height * 1.025), ha=ha, va=va, ) return self def save(self, file_name: str) -> None: figure = self.__axes.get_figure() figure.savefig(file_name + ".png")