diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index 594ca8744ef..da4622f48bf 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -392,6 +392,12 @@ def _parse_args(*args): return X, Y, U, V, C +def _check_consistent_shapes(*arrays): + all_shapes = set(a.shape for a in arrays) + if len(all_shapes) != 1: + raise ValueError('The shapes of the passed in arrays do not match.') + + class Quiver(mcollections.PolyCollection): """ Specialized PolyCollection for arrows. @@ -1124,9 +1130,11 @@ def set_UVC(self, U, V, C=None): x, y, u, v, c = delete_masked_points(self.x.ravel(), self.y.ravel(), self.u, self.v, c) + _check_consistent_shapes(x, y, u, v, c) else: x, y, u, v = delete_masked_points(self.x.ravel(), self.y.ravel(), self.u, self.v) + _check_consistent_shapes(x, y, u, v) magnitude = np.hypot(u, v) flags, barbs, halves, empty = self._find_tails(magnitude, @@ -1151,9 +1159,9 @@ def set_UVC(self, U, V, C=None): def set_offsets(self, xy): """ - Set the offsets for the barb polygons. This saves the offets passed in - and actually sets version masked as appropriate for the existing U/V - data. *offsets* should be a sequence. + Set the offsets for the barb polygons. This saves the offsets passed + in and actually sets version masked as appropriate for the existing + U/V data. *offsets* should be a sequence. ACCEPTS: sequence of pairs of floats """ @@ -1161,6 +1169,7 @@ def set_offsets(self, xy): self.y = xy[:, 1] x, y, u, v = delete_masked_points(self.x.ravel(), self.y.ravel(), self.u, self.v) + _check_consistent_shapes(x, y, u, v) xy = np.hstack((x[:, np.newaxis], y[:, np.newaxis])) mcollections.PolyCollection.set_offsets(self, xy) self.stale = True diff --git a/lib/matplotlib/tests/baseline_images/test_axes/auto_numticks_log.png b/lib/matplotlib/tests/baseline_images/test_axes/auto_numticks_log.png index 248fb669c56..7a31434f501 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/auto_numticks_log.png and b/lib/matplotlib/tests/baseline_images/test_axes/auto_numticks_log.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/boxplot_no_inverted_whisker.png b/lib/matplotlib/tests/baseline_images/test_axes/boxplot_no_inverted_whisker.png index 86fcdd25983..ec7107aea08 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/boxplot_no_inverted_whisker.png and b/lib/matplotlib/tests/baseline_images/test_axes/boxplot_no_inverted_whisker.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_baseline.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_baseline.png index b7ceb650952..fdaf2e15796 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_baseline.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_baseline.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custombox.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custombox.png index 14d24af9b91..270f2696c43 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custombox.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custombox.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customcap.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customcap.png index 1822473f089..495fd667304 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customcap.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customcap.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custommedian.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custommedian.png index 2f9fa480b9a..ed012ca2bfb 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custommedian.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custommedian.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customoutlier.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customoutlier.png index 5c83cdb029e..698bc40f15c 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customoutlier.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customoutlier.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompatchartist.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompatchartist.png index 0368ca3066e..857af4252f6 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompatchartist.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompatchartist.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompositions.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompositions.png index 9eb9b63ea26..4333291d745 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompositions.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompositions.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customwhisker.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customwhisker.png index fc72d64386a..d7c58664580 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customwhisker.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customwhisker.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customwidths.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customwidths.png index fa55deeabf8..63f37ded24c 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customwidths.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customwidths.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_horizontal.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_horizontal.png index 91a68572f5a..0c2c9935f29 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_horizontal.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_horizontal.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_no_flier_stats.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_no_flier_stats.png index 4df5cd0905d..87bb56b464b 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_no_flier_stats.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_no_flier_stats.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_nobox.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_nobox.png index 2185c2d0b42..89a7112dc85 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_nobox.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_nobox.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_nocaps.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_nocaps.png index a8daa85349d..4d8b9c38e08 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_nocaps.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_nocaps.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_patchartist.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_patchartist.png index 4450aa0c24a..8b6a49c84dc 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_patchartist.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_patchartist.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_precentilewhis.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_precentilewhis.png index daf12e9becd..93921f74e49 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_precentilewhis.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_precentilewhis.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_rangewhis.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_rangewhis.png index 476fed2cc64..bb199731725 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_rangewhis.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_rangewhis.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_scalarwidth.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_scalarwidth.png index 46e27ffd767..aaa88463219 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_scalarwidth.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_scalarwidth.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_with_xlabels.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_with_xlabels.png index 5f6958a98b1..a47dc0a47d2 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_with_xlabels.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_with_xlabels.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_with_ylabels.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_with_ylabels.png index 4804980dd06..b65a77e8668 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_with_ylabels.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_with_ylabels.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_custompoint.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_custompoint.png index a951bb32798..45a0fac0fe8 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_custompoint.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_custompoint.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_line.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_line.png index 923d1f767aa..7333ec55df1 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_line.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_line.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_point.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_point.png index 27fcbab4d84..9d47676beee 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_point.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_point.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withnotch.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withnotch.png index 9e86d22083d..1eae658a2ac 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withnotch.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withnotch.png differ diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 22b1289b7f0..9b4acd23f2a 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -4713,3 +4713,18 @@ def test_fillbetween_cycle(): face_target = mcolors.to_rgba('C{}'.format(j)) assert tuple(cc.get_facecolors().squeeze()) == tuple(face_target) assert tuple(cc.get_edgecolors().squeeze()) == tuple(edge_target) + + +@cleanup +def test_log_margins(): + plt.rcParams['axes.autolimit_mode'] = 'data' + fig, ax = plt.subplots() + margin = 0.05 + ax.set_xmargin(margin) + ax.semilogx([1, 10], [1, 10]) + xlim0, xlim1 = ax.get_xlim() + transform = ax.xaxis.get_transform() + xlim0t, xlim1t = transform.transform([xlim0, xlim1]) + x0t, x1t = transform.transform([1, 10]) + delta = (x1t - x0t) * margin + assert_allclose([xlim0t + delta, xlim1t - delta], [x0t, x1t]) diff --git a/lib/matplotlib/tests/test_quiver.py b/lib/matplotlib/tests/test_quiver.py index dc0b8e3b56e..0c13a6a437b 100644 --- a/lib/matplotlib/tests/test_quiver.py +++ b/lib/matplotlib/tests/test_quiver.py @@ -1,6 +1,7 @@ from __future__ import print_function import warnings import numpy as np +from nose.tools import raises import sys from matplotlib import pyplot as plt from matplotlib.testing.decorators import cleanup @@ -132,6 +133,21 @@ def test_barbs(): sizes=dict(emptybarb=0.25, spacing=0.2, height=0.3), cmap='viridis') + +@cleanup +@raises(ValueError) +def test_bad_masked_sizes(): + 'Test error handling when given differing sized masked arrays' + x = np.arange(3) + y = np.arange(3) + u = np.ma.array(15. * np.ones((4,))) + v = np.ma.array(15. * np.ones_like(u)) + u[1] = np.ma.masked + v[1] = np.ma.masked + fig, ax = plt.subplots() + ax.barbs(x, y, u, v) + + if __name__ == '__main__': import nose nose.runmodule() diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index c11f1b214bb..1252cad81c7 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -2023,7 +2023,7 @@ def view_limits(self, vmin, vmax): "Data has no positive values, and therefore can not be " "log-scaled.") - if vmin <= minpos: + if vmin <= 0: vmin = minpos if rcParams['axes.autolimit_mode'] == 'round_numbers':