maidr 1.8.0__tar.gz → 1.8.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {maidr-1.8.0 → maidr-1.8.1}/CHANGELOG.md +9 -0
- {maidr-1.8.0 → maidr-1.8.1}/PKG-INFO +1 -1
- {maidr-1.8.0 → maidr-1.8.1}/maidr/__init__.py +1 -1
- maidr-1.8.1/maidr/core/plot/grouped_barplot.py +124 -0
- {maidr-1.8.0 → maidr-1.8.1}/pyproject.toml +1 -1
- {maidr-1.8.0 → maidr-1.8.1}/uv.lock +1 -1
- maidr-1.8.0/maidr/core/plot/grouped_barplot.py +0 -69
- {maidr-1.8.0 → maidr-1.8.1}/.commitlintrc.cjs +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.editorconfig +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.github/copilot-instructions.md +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.github/workflows/ci.yml +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.github/workflows/docs.yml +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.github/workflows/release.yml +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.gitignore +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.pre-commit-config.yaml +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.vscode/extensions.json +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/.vscode/settings.json +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/CONDUCT.md +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/CONTRIBUTING.md +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/LICENSE +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/README.md +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/.gitignore +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/CNAME +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_environment +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_extensions/machow/interlinks/.gitignore +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_extensions/machow/interlinks/_extension.yml +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_extensions/machow/interlinks/interlinks.lua +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_extensions/shafayetShafee/line-highlight/_extension.yml +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_extensions/shafayetShafee/line-highlight/line-highlight.lua +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_extensions/shafayetShafee/line-highlight/resources/css/line-highlight.css +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_extensions/shafayetShafee/line-highlight/resources/js/line-highlight.js +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/_quarto.yml +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/examples.qmd +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/index.qmd +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/docs/styles.css +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/bar/example_bar_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/bar/matplotlib/example_mpl_bar_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/bar/seaborn/example_sns_bar_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/box/example_box_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/box/matplotlib/example_mpl_box.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/box/seaborn/example_sns_box.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/candle_stick/legacy_candlestick_example.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/candle_stick/mplfinance_candlestick_example.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/candle_stick/test_data_daily_current_year.csv +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/candle_stick/test_data_daily_mixed_years.csv +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/candle_stick/test_data_hourly.csv +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/candle_stick/test_data_minute.csv +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/candle_stick/test_data_weekly.csv +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/candle_stick/volcandat.csv +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/count/example_count_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/count/seaborn/example_sns_count_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/dodged/matplotlib/example_mpl_dodged.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/dodged/seaborn/example_sns_dodged.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/facet-subplots/matplotlib/example_mpl_facet_bar_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/facet-subplots/matplotlib/example_mpl_facet_combined_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/facet-subplots/seaborn/example_sns_facet_bar_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/facet-subplots/seaborn/example_sns_facet_combined_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/flask/test_flask_app.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/heatmap/example_heatmap_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/heatmap/matplotlib/example_mpl_heatmap.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/heatmap/seaborn/example_sns_heatmap.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/histogram/example_histogram_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/histogram/matplotlib/example_mpl_hist.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/histogram/matplotlib/histogram_with_kde_matplotlib.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/histogram/seaborn/example_sns_hist.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/histogram/seaborn/histogram_with_kde_seaborn.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/kde/example_kde_plots.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/kde/matplotlib/multiple_kde_matplotlib.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/kde/matplotlib/single_kde_matplotlib.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/kde/seaborn/multiple_kde_seaborn.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/kde/seaborn/single_kde_seaborn.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/line/example_line_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/line/matplotlib/example_mpl_line.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/line/seaborn/example_sns_line.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/multilayer/example_mpl_multilayer.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/multilayer/example_multilayer_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/multiline/example_multiline_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/multiline/matplotlib/example_mpl_multiline.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/multiline/seaborn/example_sns_multiline.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/multipanel/example_multipanel_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/multipanel/matplotlib/example_mpl_multipanel.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/multipanel/seaborn/example_sns_multipanel.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/quarto/demo.qmd +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/reg/example_reg_plots.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/reg/matplotlib/example_matplotlib_smooth_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/reg/seaborn/example_sns_reg.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/scatter/example_scatter_plot.ipynb +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/scatter/matplotlib/example_mpl_scatter.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/scatter/seaborn/example_sns_scatter.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/shiny/example_shiny_scatter.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/stacked/matplotlib/example_mpl_stacked.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/stacked/seaborn/example_sns_stacked.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/example/streamlit/example_streamlit_app.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/api.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/context_manager.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/enum/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/enum/library.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/enum/maidr_key.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/enum/plot_type.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/enum/smooth_keywords.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/figure_manager.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/maidr.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/barplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/boxplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/candlestick.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/heatmap.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/histogram.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/lineplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/maidr_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/maidr_plot_factory.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/mplfinance_barplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/mplfinance_lineplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/regplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/core/plot/scatterplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/exception/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/exception/extraction_error.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/barplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/boxplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/candlestick.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/clear.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/common.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/heatmap.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/highlight.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/histogram.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/kdeplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/lineplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/mplfinance.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/regplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/patch/scatterplot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/datetime_conversion.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/dedup_utils.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/environment.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/mixin/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/mixin/extractor_mixin.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/mixin/merger_mixin.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/mplfinance_utils.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/plot_detection.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/regression_line_utils.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/util/svg_utils.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/widget/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/maidr/widget/shiny.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/conftest.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/core/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/core/enum/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/core/plot/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/core/test_figure_manager.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/core/test_maidr_plot.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/core/test_maidr_plot_factory.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/fixture/__init__.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/fixture/library_factory.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/fixture/matplotlib_factory.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tests/fixture/seaborn_factory.py +0 -0
- {maidr-1.8.0 → maidr-1.8.1}/tox.ini +0 -0
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## v1.8.1 (2025-10-16)
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
- Address container label issue in seaborn dodged plots
|
|
9
|
+
([#256](https://github.com/xability/py-maidr/pull/256),
|
|
10
|
+
[`3b09039`](https://github.com/xability/py-maidr/commit/3b09039ba33a10903797559a27d53869ba6b9d2f))
|
|
11
|
+
|
|
12
|
+
|
|
4
13
|
## v1.8.0 (2025-09-17)
|
|
5
14
|
|
|
6
15
|
### Features
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from matplotlib.axes import Axes
|
|
4
|
+
from matplotlib.container import BarContainer
|
|
5
|
+
|
|
6
|
+
from maidr.core.enum import MaidrKey, PlotType
|
|
7
|
+
from maidr.core.plot import MaidrPlot
|
|
8
|
+
from maidr.exception import ExtractionError
|
|
9
|
+
from maidr.util.mixin import (
|
|
10
|
+
ContainerExtractorMixin,
|
|
11
|
+
DictMergerMixin,
|
|
12
|
+
LevelExtractorMixin,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class GroupedBarPlot(
|
|
17
|
+
MaidrPlot, ContainerExtractorMixin, LevelExtractorMixin, DictMergerMixin
|
|
18
|
+
):
|
|
19
|
+
def __init__(self, ax: Axes, plot_type: PlotType, **kwargs) -> None:
|
|
20
|
+
super().__init__(ax, plot_type)
|
|
21
|
+
|
|
22
|
+
def _extract_axes_data(self) -> dict:
|
|
23
|
+
base_ax_schema = super()._extract_axes_data()
|
|
24
|
+
grouped_ax_schema = {
|
|
25
|
+
MaidrKey.X.value: self.ax.get_xlabel(),
|
|
26
|
+
MaidrKey.Y.value: self.ax.get_ylabel(),
|
|
27
|
+
}
|
|
28
|
+
return self.merge_dict(base_ax_schema, grouped_ax_schema)
|
|
29
|
+
|
|
30
|
+
def _extract_plot_data(self):
|
|
31
|
+
plot = self.extract_container(self.ax, BarContainer, include_all=True)
|
|
32
|
+
data = self._extract_grouped_bar_data(plot)
|
|
33
|
+
|
|
34
|
+
if data is None:
|
|
35
|
+
raise ExtractionError(self.type, plot)
|
|
36
|
+
|
|
37
|
+
return data
|
|
38
|
+
|
|
39
|
+
def _extract_grouped_bar_data(
|
|
40
|
+
self, plot: list[BarContainer] | None
|
|
41
|
+
) -> list[dict] | None:
|
|
42
|
+
if plot is None:
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
x_level = self.extract_level(self.ax)
|
|
46
|
+
if x_level is None:
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
data = []
|
|
50
|
+
|
|
51
|
+
self._elements.extend(
|
|
52
|
+
[patch for container in plot for patch in container.patches]
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
# Get hue categories from legend
|
|
56
|
+
hue_categories = self._extract_hue_categories_from_legend()
|
|
57
|
+
|
|
58
|
+
for i, container in enumerate(plot):
|
|
59
|
+
if len(x_level) != len(container.patches):
|
|
60
|
+
return None
|
|
61
|
+
container_data = []
|
|
62
|
+
|
|
63
|
+
# Use hue category if available, otherwise fall back to container label
|
|
64
|
+
fill_value = hue_categories[i] if i < len(hue_categories) else container.get_label()
|
|
65
|
+
|
|
66
|
+
for x, y in zip(x_level, container.patches):
|
|
67
|
+
container_data.append(
|
|
68
|
+
{
|
|
69
|
+
MaidrKey.X.value: x,
|
|
70
|
+
MaidrKey.FILL.value: fill_value,
|
|
71
|
+
MaidrKey.Y.value: float(y.get_height()),
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
data.append(container_data)
|
|
75
|
+
|
|
76
|
+
return data
|
|
77
|
+
|
|
78
|
+
def _extract_hue_categories_from_legend(self) -> list[str]:
|
|
79
|
+
"""
|
|
80
|
+
Extract hue categories from the axes legend.
|
|
81
|
+
|
|
82
|
+
This method reads the legend text elements from the axes legend,
|
|
83
|
+
trims whitespace from each text, and returns a list of cleaned
|
|
84
|
+
category names. This is used to get the actual category names
|
|
85
|
+
instead of using the generic container labels like '_container0', '_container1'.
|
|
86
|
+
|
|
87
|
+
Parameters
|
|
88
|
+
----------
|
|
89
|
+
None
|
|
90
|
+
This method uses the instance's axes object.
|
|
91
|
+
|
|
92
|
+
Returns
|
|
93
|
+
-------
|
|
94
|
+
list[str]
|
|
95
|
+
List of trimmed hue category names from the legend.
|
|
96
|
+
Returns empty list if no legend is found or if legend has no text elements.
|
|
97
|
+
|
|
98
|
+
Examples
|
|
99
|
+
--------
|
|
100
|
+
>>> # For a seaborn barplot with hue='category' and legend showing 'Below', 'Above'
|
|
101
|
+
>>> plot = GroupedBarPlot(ax, PlotType.DODGED)
|
|
102
|
+
>>> categories = plot._extract_hue_categories_from_legend()
|
|
103
|
+
>>> print(categories)
|
|
104
|
+
['Below', 'Above']
|
|
105
|
+
|
|
106
|
+
>>> # If no legend exists
|
|
107
|
+
>>> categories = plot._extract_hue_categories_from_legend()
|
|
108
|
+
>>> print(categories)
|
|
109
|
+
[]
|
|
110
|
+
"""
|
|
111
|
+
legend = self.ax.get_legend()
|
|
112
|
+
if legend is None:
|
|
113
|
+
return []
|
|
114
|
+
|
|
115
|
+
# Get legend text elements
|
|
116
|
+
legend_texts = legend.get_texts()
|
|
117
|
+
if not legend_texts:
|
|
118
|
+
return []
|
|
119
|
+
|
|
120
|
+
# Extract text content from legend elements and trim whitespace
|
|
121
|
+
hue_categories = [text.get_text().strip() for text in legend_texts]
|
|
122
|
+
|
|
123
|
+
# Filter out empty strings and return
|
|
124
|
+
return [category for category in hue_categories if category]
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from matplotlib.axes import Axes
|
|
4
|
-
from matplotlib.container import BarContainer
|
|
5
|
-
|
|
6
|
-
from maidr.core.enum import MaidrKey, PlotType
|
|
7
|
-
from maidr.core.plot import MaidrPlot
|
|
8
|
-
from maidr.exception import ExtractionError
|
|
9
|
-
from maidr.util.mixin import (
|
|
10
|
-
ContainerExtractorMixin,
|
|
11
|
-
DictMergerMixin,
|
|
12
|
-
LevelExtractorMixin,
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class GroupedBarPlot(
|
|
17
|
-
MaidrPlot, ContainerExtractorMixin, LevelExtractorMixin, DictMergerMixin
|
|
18
|
-
):
|
|
19
|
-
def __init__(self, ax: Axes, plot_type: PlotType, **kwargs) -> None:
|
|
20
|
-
super().__init__(ax, plot_type)
|
|
21
|
-
|
|
22
|
-
def _extract_axes_data(self) -> dict:
|
|
23
|
-
base_ax_schema = super()._extract_axes_data()
|
|
24
|
-
grouped_ax_schema = {
|
|
25
|
-
MaidrKey.X.value: self.ax.get_xlabel(),
|
|
26
|
-
MaidrKey.Y.value: self.ax.get_ylabel(),
|
|
27
|
-
}
|
|
28
|
-
return self.merge_dict(base_ax_schema, grouped_ax_schema)
|
|
29
|
-
|
|
30
|
-
def _extract_plot_data(self):
|
|
31
|
-
plot = self.extract_container(self.ax, BarContainer, include_all=True)
|
|
32
|
-
data = self._extract_grouped_bar_data(plot)
|
|
33
|
-
|
|
34
|
-
if data is None:
|
|
35
|
-
raise ExtractionError(self.type, plot)
|
|
36
|
-
|
|
37
|
-
return data
|
|
38
|
-
|
|
39
|
-
def _extract_grouped_bar_data(
|
|
40
|
-
self, plot: list[BarContainer] | None
|
|
41
|
-
) -> list[dict] | None:
|
|
42
|
-
if plot is None:
|
|
43
|
-
return None
|
|
44
|
-
|
|
45
|
-
x_level = self.extract_level(self.ax)
|
|
46
|
-
if x_level is None:
|
|
47
|
-
return None
|
|
48
|
-
|
|
49
|
-
data = []
|
|
50
|
-
|
|
51
|
-
self._elements.extend(
|
|
52
|
-
[patch for container in plot for patch in container.patches]
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
for container in plot:
|
|
56
|
-
if len(x_level) != len(container.patches):
|
|
57
|
-
return None
|
|
58
|
-
container_data = []
|
|
59
|
-
for x, y in zip(x_level, container.patches):
|
|
60
|
-
container_data.append(
|
|
61
|
-
{
|
|
62
|
-
MaidrKey.X.value: x,
|
|
63
|
-
MaidrKey.FILL.value: container.get_label(),
|
|
64
|
-
MaidrKey.Y.value: float(y.get_height()),
|
|
65
|
-
}
|
|
66
|
-
)
|
|
67
|
-
data.append(container_data)
|
|
68
|
-
|
|
69
|
-
return data
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maidr-1.8.0 → maidr-1.8.1}/docs/_extensions/shafayetShafee/line-highlight/line-highlight.lua
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maidr-1.8.0 → maidr-1.8.1}/example/facet-subplots/matplotlib/example_mpl_facet_combined_plot.py
RENAMED
|
File without changes
|
|
File without changes
|
{maidr-1.8.0 → maidr-1.8.1}/example/facet-subplots/seaborn/example_sns_facet_combined_plot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|