Title: [Bug]: RuntimeError when bar_label of stacked bar chart comes to rest outside of plot's Y limit · Issue #25625 · matplotlib/matplotlib · GitHub
Open Graph Title: [Bug]: RuntimeError when bar_label of stacked bar chart comes to rest outside of plot's Y limit · Issue #25625 · matplotlib/matplotlib
X Title: [Bug]: RuntimeError when bar_label of stacked bar chart comes to rest outside of plot's Y limit · Issue #25625 · matplotlib/matplotlib
Description: Bug summary When creating a stacked bar chart and annotating its components by use of the bar_label method, a RuntimeError("Unknown return type") exception is raised the moment one of the bar labels comes to rest outside the specified Y ...
Open Graph Description: Bug summary When creating a stacked bar chart and annotating its components by use of the bar_label method, a RuntimeError("Unknown return type") exception is raised the moment one of the bar label...
X Description: Bug summary When creating a stacked bar chart and annotating its components by use of the bar_label method, a RuntimeError("Unknown return type") exception is raised the moment one of the...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/25625
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: RuntimeError when bar_label of stacked bar chart comes to rest outside of plot's Y limit","articleBody":"### Bug summary\r\n\r\nWhen creating a stacked bar chart and annotating its components by use of the `bar_label` method, a `RuntimeError(\"Unknown return type\")` exception is raised the moment one of the bar labels comes to rest outside the specified Y limits.\r\n\r\n### Code for reproduction\r\n\r\n```python\r\n#!/usr/bin/env python3\r\n\r\nfrom matplotlib import pyplot\r\nimport numpy as np\r\n\r\ndef main():\r\n categories = [\"Foo\", \"Bar\", \"Baz\", \"Barbaz\"]\r\n data = {\r\n \"Apples\": [0, 1, 2, 3],\r\n \"Oranges\": [2, 5, 27, 1],\r\n \"Pears\": [17, 22, 15, 10],\r\n }\r\n\r\n grid = (1, 1)\r\n fig = pyplot.figure(figsize=(9, 9), dpi=300, layout=\"constrained\")\r\n ax = pyplot.subplot2grid(grid, (0, 0), fig=fig)\r\n\r\n bottom = np.zeros(len(categories))\r\n width = 0.5\r\n\r\n for fruit, values in data.items():\r\n p = ax.bar(\r\n categories,\r\n values,\r\n width,\r\n label=fruit,\r\n bottom=bottom,\r\n )\r\n\r\n ax.bar_label(p, label_type='center')\r\n\r\n bottom += values\r\n\r\n\r\n # The exception happens if the Y-limit of the plot is chosen too low.\r\n\r\n # This limit is fine, the whole graph fits\r\n # ax.set(ylim=(0, 50))\r\n\r\n # This limit is fine as well, even though it cuts off the top of the\r\n # topmost bar.\r\n # ax.set(ylim=(0, 35))\r\n\r\n # This limit is fine still, with the topmost label ('15' of the 'Baz'\r\n # category) being on the top border of the plot.\r\n # ax.set(ylim=(0, 29))\r\n\r\n # This limit produces an exception, likely as the topmost label ('15' of\r\n # the 'Baz' category) cannot be placed anymore, since its bar's lower\r\n # end starts at 2+27 = 29.\r\n ax.set(ylim=(0, 28))\r\n\r\n fig.savefig(\"/tmp/matplotlib_example.png\", format=\"png\")\r\n\r\nif __name__ == '__main__':\r\n main()\r\n```\r\n\r\n\r\n### Actual outcome\r\n\r\n```\r\n(matplotlib-bar-label-mre)matplotlib-bar-label-mre › python demo.py \r\nTraceback (most recent call last):\r\n File \"/home/michael/dev/python/matplotlib-bar-label-mre/demo.py\", line 56, in \u003cmodule\u003e\r\n main()\r\n File \"/home/michael/dev/python/matplotlib-bar-label-mre/demo.py\", line 53, in main\r\n fig.savefig(\"/tmp/matplotlib_example.png\", format=\"png\")\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/figure.py\", line 3343, in savefig\r\n self.canvas.print_figure(fname, **kwargs)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/backend_bases.py\", line 2342, in print_figure\r\n self.figure.draw(renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/artist.py\", line 95, in draw_wrapper\r\n result = draw(artist, renderer, *args, **kwargs)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/artist.py\", line 72, in draw_wrapper\r\n return draw(artist, renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/figure.py\", line 3134, in draw\r\n self.get_layout_engine().execute(self)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/layout_engine.py\", line 253, in execute\r\n return do_constrained_layout(fig, w_pad=w_pad, h_pad=h_pad,\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/_constrained_layout.py\", line 119, in do_constrained_layout\r\n make_layout_margins(layoutgrids, fig, renderer, h_pad=h_pad,\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/_constrained_layout.py\", line 369, in make_layout_margins\r\n pos, bbox = get_pos_and_bbox(ax, renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/_constrained_layout.py\", line 617, in get_pos_and_bbox\r\n tightbbox = martist._get_tightbbox_for_layout_only(ax, renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/artist.py\", line 1415, in _get_tightbbox_for_layout_only\r\n return obj.get_tightbbox(*args, **{**kwargs, \"for_layout_only\": True})\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/axes/_base.py\", line 4408, in get_tightbbox\r\n bbox = a.get_tightbbox(renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/text.py\", line 2064, in get_tightbbox\r\n return super().get_tightbbox(renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/artist.py\", line 367, in get_tightbbox\r\n bbox = self.get_window_extent(renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/text.py\", line 2050, in get_window_extent\r\n self.update_positions(self._renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/text.py\", line 1954, in update_positions\r\n self.set_transform(self._get_xy_transform(renderer, self.anncoords))\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/text.py\", line 1538, in _get_xy_transform\r\n xy0 = self._get_ref_xy(renderer)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/text.py\", line 1569, in _get_ref_xy\r\n return self._get_xy(renderer, *self.xy, self.xycoords)\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/text.py\", line 1478, in _get_xy\r\n return self._get_xy_transform(renderer, s).transform((x, y))\r\n File \"/home/michael/.local/share/virtualenvs/matplotlib-bar-label-mre/lib/python3.10/site-packages/matplotlib/text.py\", line 1496, in _get_xy_transform\r\n raise RuntimeError(\"Unknown return type\")\r\nRuntimeError: Unknown return type\r\n```\r\n\r\n### Expected outcome\r\n\r\nI'd expect the corresponding section of the bar, along with its label, to simply be outside the visible plot area. Or at least a more descriptive error message.\r\n\r\n\r\n### Additional information\r\n\r\nThe exception seems to happen the moment one of the bar labels cannot fit in the visible plot area anymore. This can be seen by starting with a large Y limit, and slowly lowering it.\r\n\r\nAs the Y limit approaches the position of the topmost label, it will be shifted down on its own. However the moment the Y limit is set low enough that the topmost bar's component is fully outside the visible area, the exception arises.\r\n\r\nThe (mostly) minimal reproducible example above contains several Y limits to indicate this happening.\r\n\r\n### Operating system\r\n\r\nArch Linux, Linux 6.2.5\r\n\r\n### Matplotlib Version\r\n\r\n3.7.1\r\n\r\n### Matplotlib Backend\r\n\r\nTkAgg\r\n\r\n### Python version\r\n\r\n3.10.9\r\n\r\n### Jupyter version\r\n\r\nNot applicable\r\n\r\n### Installation\r\n\r\npip","author":{"url":"https://github.com/Lavode","@type":"Person","name":"Lavode"},"datePublished":"2023-04-05T14:24:48.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/25625/matplotlib/issues/25625"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:fce70147-9593-6f50-97b2-e9b21ee7618f |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | BEB4:238007:DF44D5:12A0623:6A51B53B |
| html-safe-nonce | 2669a3dffc783eac8e001e8fb211c3da773c3690ccc49f7f73bb6022a93fa666 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCRUI0OjIzODAwNzpERjQ0RDU6MTJBMDYyMzo2QTUxQjUzQiIsInZpc2l0b3JfaWQiOiIxNTk1MzI4NTU0MzY4ODMyNTkiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | e709f022b2e7d761f365a03725ec2b4e48c4a10397a4a65b4993758d118e8893 |
| hovercard-subject-tag | issue:1655730254 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/25625/issue_layout |
| twitter:image | https://opengraph.githubassets.com/fa946a3f4872ca191fb43970d86879e342d91171923169a977eebd059d3e3abe/matplotlib/matplotlib/issues/25625 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/fa946a3f4872ca191fb43970d86879e342d91171923169a977eebd059d3e3abe/matplotlib/matplotlib/issues/25625 |
| og:image:alt | Bug summary When creating a stacked bar chart and annotating its components by use of the bar_label method, a RuntimeError("Unknown return type") exception is raised the moment one of the bar label... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | Lavode |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7aed05249554b889eb33d002851a973eebcc7e91 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width