Thanks to visit codestin.com
Credit goes to github.com

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
chentryto1 opened this issue Apr 9, 2024 · 2 comments · Fixed by #28054
Milestone

Comments

@chentryto1
Copy link

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

@timhoffm
Copy link
Member

timhoffm commented Apr 9, 2024

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.

@anntzer
Copy link
Contributor

anntzer commented Apr 9, 2024

See also #11526.

timhoffm added a commit to timhoffm/matplotlib that referenced this issue Apr 10, 2024
…ositional-only

Closes matplotlib#28047 and the already closed matplotlib#11526.

This introduces the positional-only marker `/` into the call
signatures (`pcolorfast` already had it). While IIRC I originally
opted against adding it for simplicity, the above issues show that
this is not clear enough. It's helpful for experienced people and
I believe it does not distract people who don't know what it is too
much because it's here always at the end before **kwargs.

Additionally, it does not hurt to spell it out in text as well.
@QuLogic QuLogic added this to the v3.10.0 milestone Apr 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants