Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Option to add FancyBboxPatch around quiverkey() #29704

Open
@bbuzz31

Description

@bbuzz31

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions


      [8]ページ先頭

      ©2009-2025 Movatter.jp