From 94680be134c7eaf82200c5f46028a71b11ae3fe8 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Sun, 16 Sep 2018 16:57:06 -0700 Subject: [PATCH 1/5] MAINT: line-wrap bar3d points for clarity Brought-on to try and determine if faces are clockwise-ordered or counter-clockwise-ordered --- lib/mpl_toolkits/mplot3d/axes3d.py | 50 +++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 47751c7da657..a97f342b065f 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2435,20 +2435,42 @@ def bar3d(self, x, y, z, dx, dy, dz, color=None, 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)), + ( + (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) + ), ]) facecolors = [] From 7943100762f31108595301c22ea460e14102cd17 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Sun, 16 Sep 2018 17:05:05 -0700 Subject: [PATCH 2/5] MAINT: Vectorize the addition of the position in bar3d --- lib/mpl_toolkits/mplot3d/axes3d.py | 57 +++++++++++++++++------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index a97f342b065f..b5b6160af5e2 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2434,42 +2434,49 @@ def bar3d(self, x, y, z, dx, dy, dz, color=None, polys = [] for xi, yi, zi, dxi, dyi, dzi in zip(x, y, z, dx, dy, dz): - polys.extend([ + corner = np.array([xi, yi, zi]) + polys.extend(corner + [ + # -z ( - (xi, yi, zi), - (xi + dxi, yi, zi), - (xi + dxi, yi + dyi, zi), - (xi, yi + dyi, zi) + ( 0, 0, 0), + (dxi, 0, 0), + (dxi, dyi, 0), + ( 0, dyi, 0) ), + # +z ( - (xi, yi, zi + dzi), - (xi + dxi, yi, zi + dzi), - (xi + dxi, yi + dyi, zi + dzi), - (xi, yi + dyi, zi + dzi) + ( 0, 0, dzi), + (dxi, 0, dzi), + (dxi, dyi, dzi), + ( 0, dyi, dzi) ), + # -y ( - (xi, yi, zi), - (xi + dxi, yi, zi), - (xi + dxi, yi, zi + dzi), - (xi, yi, zi + dzi) + ( 0, 0, 0), + (dxi, 0, 0), + (dxi, 0, dzi), + ( 0, 0, dzi) ), + # +y ( - (xi, yi + dyi, zi), - (xi + dxi, yi + dyi, zi), - (xi + dxi, yi + dyi, zi + dzi), - (xi, yi + dyi, zi + dzi) + ( 0, dyi, 0), + (dxi, dyi, 0), + (dxi, dyi, dzi), + ( 0, dyi, dzi) ), + # -x ( - (xi, yi, zi), - (xi, yi + dyi, zi), - (xi, yi + dyi, zi + dzi), - (xi, yi, zi + dzi) + ( 0, 0, 0), + ( 0, dyi, 0), + ( 0, dyi, dzi), + ( 0, 0, dzi) ), + # +x ( - (xi + dxi, yi, zi), - (xi + dxi, yi + dyi, zi), - (xi + dxi, yi + dyi, zi + dzi), - (xi + dxi, yi, zi + dzi) + (dxi, 0, 0), + (dxi, dyi, 0), + (dxi, dyi, dzi), + (dxi, 0, dzi) ), ]) From 351f46052053843a756db944bed99f98e09febb7 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Sun, 16 Sep 2018 17:08:10 -0700 Subject: [PATCH 3/5] MAINT: Vectorize the scaling of bar3d --- lib/mpl_toolkits/mplot3d/axes3d.py | 51 +++++++++++++++--------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index b5b6160af5e2..494c53d135e0 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2435,48 +2435,49 @@ def bar3d(self, x, y, z, dx, dy, dz, color=None, polys = [] for xi, yi, zi, dxi, dyi, dzi in zip(x, y, z, dx, dy, dz): corner = np.array([xi, yi, zi]) - polys.extend(corner + [ + scale = np.array([dxi, dyi, dzi]) + polys.extend(corner + scale * [ # -z ( - ( 0, 0, 0), - (dxi, 0, 0), - (dxi, dyi, 0), - ( 0, dyi, 0) + (0, 0, 0), + (1, 0, 0), + (1, 1, 0), + (0, 1, 0) ), # +z ( - ( 0, 0, dzi), - (dxi, 0, dzi), - (dxi, dyi, dzi), - ( 0, dyi, dzi) + (0, 0, 1), + (1, 0, 1), + (1, 1, 1), + (0, 1, 1) ), # -y ( - ( 0, 0, 0), - (dxi, 0, 0), - (dxi, 0, dzi), - ( 0, 0, dzi) + (0, 0, 0), + (1, 0, 0), + (1, 0, 1), + (0, 0, 1) ), # +y ( - ( 0, dyi, 0), - (dxi, dyi, 0), - (dxi, dyi, dzi), - ( 0, dyi, dzi) + (0, 1, 0), + (1, 1, 0), + (1, 1, 1), + (0, 1, 1) ), # -x ( - ( 0, 0, 0), - ( 0, dyi, 0), - ( 0, dyi, dzi), - ( 0, 0, dzi) + (0, 0, 0), + (0, 1, 0), + (0, 1, 1), + (0, 0, 1) ), # +x ( - (dxi, 0, 0), - (dxi, dyi, 0), - (dxi, dyi, dzi), - (dxi, 0, dzi) + (1, 0, 0), + (1, 1, 0), + (1, 1, 1), + (1, 0, 1) ), ]) From 7d09535d29812e46eafcdcfb2efe75159a83ffc0 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Sun, 16 Sep 2018 17:09:40 -0700 Subject: [PATCH 4/5] MAINT: Pre-compute the cuboid array --- lib/mpl_toolkits/mplot3d/axes3d.py | 91 +++++++++++++++--------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 494c53d135e0..105e769b45ae 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2432,54 +2432,57 @@ def bar3d(self, x, y, z, dx, dy, dz, color=None, minz = np.min(z) maxz = np.max(z + dz) + # 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) + ), + ]) + polys = [] for xi, yi, zi, dxi, dyi, dzi in zip(x, y, z, dx, dy, dz): corner = np.array([xi, yi, zi]) scale = np.array([dxi, dyi, dzi]) - polys.extend(corner + scale * [ - # -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) - ), - ]) + polys.extend(corner + scale * cuboid) facecolors = [] if color is None: From f44b4374756ea24782dca9045f2ce80dd5a54836 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Sun, 16 Sep 2018 17:17:01 -0700 Subject: [PATCH 5/5] MAINT: Vectorize the entire computation of the bar3d polygons --- lib/mpl_toolkits/mplot3d/axes3d.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 105e769b45ae..678643a3de79 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2478,11 +2478,17 @@ def bar3d(self, x, y, z, dx, dy, dz, color=None, ), ]) - polys = [] - for xi, yi, zi, dxi, dyi, dzi in zip(x, y, z, dx, dy, dz): - corner = np.array([xi, yi, zi]) - scale = np.array([dxi, dyi, dzi]) - polys.extend(corner + scale * cuboid) + # 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: