Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork7.9k
Description
Bug summary
Pretty self explanatory.
Grok has this to say:
Grok's advice
Thank you for sharing the full traceback and your Matplotlib version (3.10). The error AttributeError: PolyCollection.set() got an unexpected keyword argument 'bbox' occurring within QuiverKey._init() suggests that the bbox parameter, while intended for the label of the quiverkey, is being incorrectly passed down to the underlying PolyCollection object (which draws the arrow), where it’s not a valid keyword. This seems like a bug or misunderstanding in how Matplotlib 3.10 handles quiverkey with bbox, especially in combination with Cartopy.
The bbox parameter is supposed to apply to the label text, not the arrow itself, but the traceback shows it’s being propagated incorrectly. Since the first snippet didn’t work, and you’re on a recent version (Matplotlib 3.10), let’s pivot to the alternative approach using axes.text with a bbox, which avoids this issue entirely by separating the label and its box from the quiverkey arrow.
Code for reproduction
importcartopy.crsasccrsimportmatplotlib.pyplotaspltfig=plt.figure(figsize=(12,6))axes=plt.axes(projection=ccrs.PlateCarree())axes.coastlines()# Simple quiver plotq=axes.quiver([0], [0], [1], [1],transform=ccrs.PlateCarree())axes.quiverkey(q,X=0.85,Y=0.95,U=1,label='1 unit',labelpos='E',bbox=dict(facecolor='white',edgecolor='black',boxstyle='round,pad=0.5'))plt.show()
Actual outcome
AttributeError Traceback (most recent call last)
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/IPython/core/formatters.py:402, in BaseFormatter.call(self, obj)
400 pass
401 else:
--> 402 return printer(obj)
403 # Finally look for special method names
404 method = get_real_method(obj, self.print_method)
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/IPython/core/pylabtools.py:170, in print_figure(fig, fmt, bbox_inches, base64, **kwargs)
167 from matplotlib.backend_bases import FigureCanvasBase
168 FigureCanvasBase(fig)
--> 170 fig.canvas.print_figure(bytes_io, **kw)
171 data = bytes_io.getvalue()
172 if fmt == 'svg':
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/backend_bases.py:2155, in FigureCanvasBase.print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)
2152 # we do this instead ofself.figure.draw_without_rendering
2153 # so that we can inject the orientation
2154 with getattr(renderer, "_draw_disabled", nullcontext)():
-> 2155 self.figure.draw(renderer)
2156 if bbox_inches:
2157 if bbox_inches == "tight":
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/artist.py:94, in _finalize_rasterization..draw_wrapper(artist, renderer, *args, **kwargs)
92@wraps(draw)
93 def draw_wrapper(artist, renderer, *args, **kwargs):
---> 94 result = draw(artist, renderer, *args, **kwargs)
95 if renderer._rasterizing:
96 renderer.stop_rasterizing()
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/artist.py:71, in allow_rasterization..draw_wrapper(artist, renderer)
68 if artist.get_agg_filter() is not None:
69 renderer.start_filter()
---> 71 return draw(artist, renderer)
72 finally:
73 if artist.get_agg_filter() is not None:
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/figure.py:3257, in Figure.draw(self, renderer)
3254 # ValueError can occur when resizing a window.
3256 self.patch.draw(renderer)
-> 3257 mimage._draw_list_compositing_images(
3258 renderer, self, artists, self.suppressComposite)
3260 renderer.close_group('figure')
3261 finally:
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/image.py:134, in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
132 if not_composite or not has_images:
133 for a in artists:
--> 134 a.draw(renderer)
135 else:
136 # Composite any adjacent images together
137 image_group = []
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/artist.py:71, in allow_rasterization..draw_wrapper(artist, renderer)
68 if artist.get_agg_filter() is not None:
69 renderer.start_filter()
---> 71 return draw(artist, renderer)
72 finally:
73 if artist.get_agg_filter() is not None:
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/cartopy/mpl/geoaxes.py:524, in GeoAxes.draw(self, renderer, **kwargs)
519 self.imshow(img, extent=extent, origin=origin,
520 transform=factory.crs, *factory_args[1:],
521 **factory_kwargs)
522 self._done_img_factory = True
--> 524 return super().draw(renderer=renderer, **kwargs)
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/artist.py:71, in allow_rasterization..draw_wrapper(artist, renderer)
68 if artist.get_agg_filter() is not None:
69 renderer.start_filter()
---> 71 return draw(artist, renderer)
72 finally:
73 if artist.get_agg_filter() is not None:
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/axes/_base.py:3181, in _AxesBase.draw(self, renderer)
3178 if artists_rasterized:
3179 _draw_rasterized(self.get_figure(root=True), artists_rasterized, renderer)
-> 3181 mimage._draw_list_compositing_images(
3182 renderer, self, artists, self.get_figure(root=True).suppressComposite)
3184 renderer.close_group('axes')
3185 self.stale = False
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/image.py:134, in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
132 if not_composite or not has_images:
133 for a in artists:
--> 134 a.draw(renderer)
135 else:
136 # Composite any adjacent images together
137 image_group = []
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/artist.py:71, in allow_rasterization..draw_wrapper(artist, renderer)
68 if artist.get_agg_filter() is not None:
69 renderer.start_filter()
---> 71 return draw(artist, renderer)
72 finally:
73 if artist.get_agg_filter() is not None:
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/quiver.py:400, in QuiverKey.draw(self, renderer)
398 @martist.allow_rasterization
399 def draw(self, renderer):
--> 400 self._init()
401 self.vector.draw(renderer)
402 pos = self.get_transform().transform((self.X, self.Y))
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/quiver.py:379, in QuiverKey._init(self)
377 kwargs = self.Q.polykw
378 kwargs.update(self.kw)
--> 379 self.vector = mcollections.PolyCollection(
380 self.verts,
381 offsets=[(self.X, self.Y)],
382 offset_transform=self.get_transform(),
383 **kwargs)
384 if self.color is not None:
385 self.vector.set_color(self.color)
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/collections.py:1210, in PolyCollection.init(self, verts, sizes, closed, **kwargs)
1190 definit(self, verts, sizes=None, *, closed=True, **kwargs):
1191 """
1192 Parameters
1193 ----------
(...)
1208 Forwarded to.Collection
.
1209 """
-> 1210 super().init(**kwargs)
1211 self.set_sizes(sizes)
1212 self.set_verts(verts, closed)
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/collections.py:209, in Collection.init(self, edgecolors, facecolors, linewidths, linestyles, capstyle, joinstyle, antialiaseds, offsets, offset_transform, norm, cmap, colorizer, pickradius, hatch, urls, zorder, **kwargs)
206 self._offset_transform = offset_transform
208 self._path_effects = None
--> 209 self._internal_update(kwargs)
210 self._paths = None
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/artist.py:1233, in Artist._internal_update(self, kwargs)
1226 def _internal_update(self, kwargs):
1227 """
1228 Update artist properties without prenormalizing them, but generating
1229 errors as if callingset
.
1230
1231 The lack of prenormalization is to maintain backcompatibility.
1232 """
-> 1233 return self._update_props(
1234 kwargs, "{cls.name}.set() got an unexpected keyword argument "
1235 "{prop_name!r}")
File ~/Miniforge3/envs/RSL/lib/python3.13/site-packages/matplotlib/artist.py:1206, in Artist.update_props(self, props, errfmt)
1204 func = getattr(self, f"set{k}", None)
1205 if not callable(func):
-> 1206 raise AttributeError(
1207 errfmt.format(cls=type(self), prop_name=k),
1208 name=k)
1209 ret.append(func(v))
1210 if ret:
AttributeError: PolyCollection.set() got an unexpected keyword argument 'bbox'
Expected outcome
A box around the text with the specified properties.
Additional information
No response
Operating system
No response
Matplotlib Version
3.10.0
Matplotlib Backend
No response
Python version
No response
Jupyter version
No response
Installation
None