diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 47751c7da657..678643a3de79 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2432,24 +2432,63 @@ def bar3d(self, x, y, z, dx, dy, dz, color=None, minz = np.min(z) maxz = np.max(z + dz) - polys = [] - for xi, yi, zi, dxi, dyi, dzi in zip(x, y, z, dx, dy, dz): - polys.extend([ - ((xi, yi, zi), (xi + dxi, yi, zi), - (xi + dxi, yi + dyi, zi), (xi, yi + dyi, zi)), - ((xi, yi, zi + dzi), (xi + dxi, yi, zi + dzi), - (xi + dxi, yi + dyi, zi + dzi), (xi, yi + dyi, zi + dzi)), - - ((xi, yi, zi), (xi + dxi, yi, zi), - (xi + dxi, yi, zi + dzi), (xi, yi, zi + dzi)), - ((xi, yi + dyi, zi), (xi + dxi, yi + dyi, zi), - (xi + dxi, yi + dyi, zi + dzi), (xi, yi + dyi, zi + dzi)), - - ((xi, yi, zi), (xi, yi + dyi, zi), - (xi, yi + dyi, zi + dzi), (xi, yi, zi + dzi)), - ((xi + dxi, yi, zi), (xi + dxi, yi + dyi, zi), - (xi + dxi, yi + dyi, zi + dzi), (xi + dxi, yi, zi + dzi)), - ]) + # shape (6, 4, 3) + cuboid = np.array([ + # -z + ( + (0, 0, 0), + (1, 0, 0), + (1, 1, 0), + (0, 1, 0) + ), + # +z + ( + (0, 0, 1), + (1, 0, 1), + (1, 1, 1), + (0, 1, 1) + ), + # -y + ( + (0, 0, 0), + (1, 0, 0), + (1, 0, 1), + (0, 0, 1) + ), + # +y + ( + (0, 1, 0), + (1, 1, 0), + (1, 1, 1), + (0, 1, 1) + ), + # -x + ( + (0, 0, 0), + (0, 1, 0), + (0, 1, 1), + (0, 0, 1) + ), + # +x + ( + (1, 0, 0), + (1, 1, 0), + (1, 1, 1), + (1, 0, 1) + ), + ]) + + # indexed by [bar, face, vertex, coord] + polys = np.empty(x.shape + cuboid.shape) + + # handle each coordinate separately + for i, p, dp in [(0, x, dx), (1, y, dy), (2, z, dz)]: + p = p[..., np.newaxis, np.newaxis] + dp = dp[..., np.newaxis, np.newaxis] + polys[..., i] = p + dp * cuboid[..., i] + + # collapse the first two axes + polys = polys.reshape((-1,) + polys.shape[2:]) facecolors = [] if color is None: