diff --git a/src/metpy/plots/declarative.py b/src/metpy/plots/declarative.py index 02585eb53d9..240c56779ce 100644 --- a/src/metpy/plots/declarative.py +++ b/src/metpy/plots/declarative.py @@ -1660,9 +1660,19 @@ def _build(self): wind_slice = (slice(None, None, self.skip[0]), slice(None, None, self.skip[1])) + # If too many of the winds/vectors to plot have excessively high magnitudes, + # the call to ax.barbs will cause matplotlib to draw so many pennants that all + # memory will be consumed, possibly hanging the system. Thus, here we check + # what we are about to plot to avoid the hang. + u_vals = u.values[wind_slice] + v_vals = v.values[wind_slice] + speeds = np.hypot(u_vals, v_vals) + if np.median(speeds) > 50000: + msg = "Too many large wind barbs to plot. Perhaps 'scale' is too high?" + raise ValueError(msg) + self.handle = self.parent.ax.barbs( - x_like[wind_slice], y_like[wind_slice], - u.values[wind_slice], v.values[wind_slice], + x_like[wind_slice], y_like[wind_slice], u_vals, v_vals, color=self.color, pivot=self.pivot, length=self.barblength, zorder=2, **kwargs) diff --git a/tests/plots/test_declarative.py b/tests/plots/test_declarative.py index b5fdd8ee83c..bcafe381967 100644 --- a/tests/plots/test_declarative.py +++ b/tests/plots/test_declarative.py @@ -565,6 +565,31 @@ def test_no_field_error_barbs(): barbs.draw() +@needs_cartopy +def test_too_big_error_barbs(): + """Make sure we get an error when we are about to draw too many pennants.""" + data = xr.open_dataset(get_test_data('narr_example.nc', as_file_obj=False)).squeeze() + + bp = BarbPlot() + bp.data = data + bp.field = ['u_wind', 'v_wind'] + bp.level = 500 + bp.scale = 1e4 + bp.skip = [8, 8] + + mp = MapPanel() + mp.layout = (1, 1, 1) + mp.area = (-100, -70, 30, 45) + mp.plots = [bp] + + pc = PanelContainer() + pc.size = (10, 8) + pc.panels = [mp] + + with pytest.raises(ValueError): + pc.draw() + + @pytest.mark.mpl_image_compare(remove_text=True, tolerance=0.377) def test_projection_object(ccrs, cfeature): """Test that we can pass a custom map projection."""