Skip to content

Commit df22b8a

Browse files
committed
ENH: Add properties position_centers and tops to BarContainer
1 parent e36bffb commit df22b8a

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
``BarContainer`` properties
2+
---------------------------
3+
`.BarContainer` gained two properties: `~.BarContainer.position_centers`
4+
and `~.BarContainer.tops`.

lib/matplotlib/container.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,34 @@ def __init__(self, patches, errorbar=None, *, datavalues=None,
7373
self.orientation = orientation
7474
super().__init__(patches, **kwargs)
7575

76+
@property
77+
def tops(self):
78+
"""
79+
Return the values at the upper end of the bars.
80+
81+
.. versionadded:: 3.11
82+
"""
83+
if self.orientation == 'vertical':
84+
return [p.get_y() + p.get_height() for p in self.patches]
85+
elif self.orientation == 'horizontal':
86+
return [p.get_x() + p.get_width() for p in self.patches]
87+
else:
88+
raise ValueError("Orientation must be 'vertical' or 'horizontal'.")
89+
90+
@property
91+
def position_centers(self):
92+
"""
93+
Return the centers of bar positions.
94+
95+
.. versionadded:: 3.11
96+
"""
97+
if self.orientation == 'vertical':
98+
return [p.get_x() + p.get_width() / 2 for p in self.patches]
99+
elif self.orientation == 'horizontal':
100+
return [p.get_y() + p.get_height() / 2 for p in self.patches]
101+
else:
102+
raise ValueError("Orientation must be 'vertical' or 'horizontal'.")
103+
76104

77105
class ErrorbarContainer(Container):
78106
"""

lib/matplotlib/container.pyi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ class BarContainer(Container):
3232
orientation: Literal["vertical", "horizontal"] | None = ...,
3333
**kwargs
3434
) -> None: ...
35+
@property
36+
def position_centers(self) -> list[float]: ...
37+
@property
38+
def tops(self) -> list[float]: ...
3539

3640
class ErrorbarContainer(Container):
3741
lines: tuple[Line2D, tuple[Line2D, ...], tuple[LineCollection, ...]]

lib/matplotlib/tests/test_container.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
from numpy.testing import assert_array_equal
23
import matplotlib.pyplot as plt
34

45

@@ -35,3 +36,18 @@ def test_nonstring_label():
3536
# Test for #26824
3637
plt.bar(np.arange(10), np.random.rand(10), label=1)
3738
plt.legend()
39+
40+
41+
def test_barcontainer_position_centers_and_tops():
42+
fig, ax = plt.subplots()
43+
pos = [1, 2, 4]
44+
bottoms = np.array([1, 5, 3])
45+
heights = np.array([2, 3, 4])
46+
47+
container = ax.bar(pos, heights, bottom=bottoms)
48+
assert_array_equal(container.position_centers, pos)
49+
assert_array_equal(container.tops, bottoms + heights)
50+
51+
container = ax.barh(pos, heights, left=bottoms)
52+
assert_array_equal(container.position_centers, pos)
53+
assert_array_equal(container.tops, bottoms + heights)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy