Skip to content

[Bug]: plt.barbs is a command that cannot be passed in a c parameter by parameter name, but can be passed in the form of a positional parameter #28047

Closed

Description

@chentryto1

Bug summary

plt.barbs is a command that cannot be passed in a c parameter by parameter name, but can be passed in the form of a positional parameter

Code for reproduction

plt.barbs(X,Y,uwind,vwind,c =  wind_speed.T,
             length = 5,
             linewidth = 0.5,
            #  pivot = 'middle',
            #  zorder=1,
             barb_increments=dict(half=2, full=4, flag=20),
             sizes = dict(spacing = 0.15,height = 0.5,width = 0.12),cmap = Dbs_map,norm = norm_Dbs,
             )

Actual outcome


AttributeError Traceback (most recent call last)
Cell In[182], line 22
20 fontticks = fm.FontProperties(size = 22 ,weight = 'bold', family = 'Times New Roman')
21 fontlabel = fm.FontProperties(weight = 'bold', family = 'Times New Roman',size = 22)
---> 22 plt.barbs(X,Y,uwind,vwind,c = wind_speed.T,
23 length = 5,
24 linewidth = 0.5,
25 # pivot = 'middle',
26 # zorder=1,
27 barb_increments=dict(half=2, full=4, flag=20),
28 sizes = dict(spacing = 0.15,height = 0.5,width = 0.12),cmap = Dbs_map,norm = norm_Dbs,
29 )#
31 # 设置x轴标签和刻度
32 x_ticks = [times[0]] + [times[int((len(times) - 1) * i / 5)] for i in range(1, 6)]

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib\pyplot.py:2447, in barbs(data, *args, **kwargs)
2445 @_copy_docstring_and_deprecators(Axes.barbs)
2446 def barbs(*args, data=None, **kwargs):
-> 2447 return gca().barbs(
2448 *args, **({"data": data} if data is not None else {}),
2449 **kwargs)

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib_init_.py:1475, in _preprocess_data..inner(ax, data, *args, **kwargs)
1472 @functools.wraps(func)
1473 def inner(ax, *args, data=None, **kwargs):
1474 if data is None:
-> 1475 return func(ax, *map(sanitize_sequence, args), **kwargs)
1477 bound = new_sig.bind(ax, *args, **kwargs)
1478 auto_label = (bound.arguments.get(label_namer)
1479 or bound.kwargs.get(label_namer))

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib\axes_axes.py:5173, in Axes.barbs(self, *args, **kwargs)
5171 # Make sure units are handled for x and y values
5172 args = self._quiver_units(args, kwargs)
-> 5173 b = mquiver.Barbs(self, *args, **kwargs)
5174 self.add_collection(b, autolim=True)
5175 self._request_autoscale_view()

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib\quiver.py:937, in Barbs.init(self, ax, pivot, length, barbcolor, flagcolor, sizes, fill_empty, barb_increments, rounding, flip_barb, *args, **kwargs)
935 # Make a collection
936 barb_size = self._length ** 2 / 4 # Empirically determined
--> 937 super().init(
938 [], (barb_size,), offsets=xy, offset_transform=transform, **kwargs)
939 self.set_transform(transforms.IdentityTransform())
941 self.set_UVC(u, v, c)

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib_api\deprecation.py:454, in make_keyword_only..wrapper(*args, **kwargs)
448 if len(args) > name_idx:
449 warn_deprecated(
450 since, message="Passing the %(name)s %(obj_type)s "
451 "positionally is deprecated since Matplotlib %(since)s; the "
452 "parameter will become keyword-only %(removal)s.",
453 name=name, obj_type=f"parameter of {func.name}()")
--> 454 return func(*args, **kwargs)

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib\collections.py:1170, in PolyCollection.init(self, verts, sizes, closed, **kwargs)
1149 @_api.make_keyword_only("3.6", name="closed")
1150 def init(self, verts, sizes=None, closed=True, **kwargs):
1151 """
1152 Parameters
1153 ----------
(...)
1168 Forwarded to .Collection.
1169 """
-> 1170 super().init(**kwargs)
1171 self.set_sizes(sizes)
1172 self.set_verts(verts, closed)

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib_api\deprecation.py:454, in make_keyword_only..wrapper(*args, **kwargs)
448 if len(args) > name_idx:
449 warn_deprecated(
450 since, message="Passing the %(name)s %(obj_type)s "
451 "positionally is deprecated since Matplotlib %(since)s; the "
452 "parameter will become keyword-only %(removal)s.",
453 name=name, obj_type=f"parameter of {func.name}()")
--> 454 return func(*args, **kwargs)

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib\collections.py:201, in Collection.init(self, edgecolors, facecolors, linewidths, linestyles, capstyle, joinstyle, antialiaseds, offsets, offset_transform, norm, cmap, pickradius, hatch, urls, zorder, **kwargs)
198 self._offset_transform = offset_transform
200 self._path_effects = None
--> 201 self._internal_update(kwargs)
202 self._paths = None

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib\artist.py:1223, in Artist._internal_update(self, kwargs)
1216 def _internal_update(self, kwargs):
1217 """
1218 Update artist properties without prenormalizing them, but generating
1219 errors as if calling set.
1220
1221 The lack of prenormalization is to maintain backcompatibility.
1222 """
-> 1223 return self._update_props(
1224 kwargs, "{cls.name}.set() got an unexpected keyword argument "
1225 "{prop_name!r}")

File d:\codetools\anaconda\home\envs\py38\lib\site-packages\matplotlib\artist.py:1197, in Artist.update_props(self, props, errfmt)
1195 func = getattr(self, f"set
{k}", None)
1196 if not callable(func):
-> 1197 raise AttributeError(
1198 errfmt.format(cls=type(self), prop_name=k))
1199 ret.append(func(v))
1200 if ret:

AttributeError: Barbs.set() got an unexpected keyword argument 'c'

Expected outcome

It should be possible to pass in data by parameter name

Additional information

No response

Operating system

Windows

Matplotlib Version

3.7.2

Matplotlib Backend

No response

Python version

3.8.16

Jupyter version

No response

Installation

None

Activity

  1. timhoffm commented on Apr 9, 2024

    @timhoffm
    Member

    Strictly, speaking the documentation does not support the assumption that c can be used as a keyword argument. On a side-note it would be t.b.d. whether it's c or C - neither of which are currently supported.

    On the technical side, we could extend

    def _parse_args(*args, caller_name='function'):

    to parse a kwarg C as well, but not sure whether that's worth it. It adds quite a bit of complexity to ensure consistency between positional and kwags.

    Maybe it's worth to add an explicit sentence to the docs

    All parameters X, Y, U, V, C are positional-only.

  2. anntzer commented on Apr 9, 2024

    @anntzer
    Contributor

    See also #11526.

  3. added a commit that references this issue on Apr 10, 2024
    9fe39a7
  4. added this to the v3.10.0 milestone on Apr 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions