-
-
Notifications
You must be signed in to change notification settings - Fork 8.3k
Closed as not planned
Closed as not planned
Copy link
Labels
API: consistencystatus: inactiveMarked by the “Stale” Github ActionMarked by the “Stale” Github Action
Description
Bug summary
The 3-dimensional quiver accepts the argument 'normalize' and 'length'.
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = plt.axes(projection='3d')
X, Y = np.meshgrid(np.linspace(-5, 5, 10), np.linspace(-5, 5, 10))
Z = X**2 + Y**2
# Gradient Vector Components U and V
U, V = (2*X, 2*Y)
ax.plot_surface(X, Y, Z, cmap='YlGnBu')
ax.quiver(X, Y, 0, U, V, 0, length=1, normalize=True)This gives the desired output:

However, when using a 2D quiver plot, I get an error. It seems inconsistent to me.
Code for reproduction
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = plt.axes()
X, Y = np.meshgrid(np.linspace(-5, 5, 10), np.linspace(-5, 5, 10))
Z = X**2 + Y**2
U, V = (2*X, 2*Y)
ax.contourf(X, Y, Z, cmap='plasma')
ax.quiver(X, Y, U, V, normalize=True, length=1)Actual outcome
AttributeError Traceback (most recent call last)
Cell In[70], line 14
12 U, V = (2*X, 2*Y)
13 ax.contourf(X, Y, Z, cmap='plasma')
---> 14 ax.quiver(X, Y, U, V, normalize=True, length=1)
File C:\Python\310\lib\site-packages\matplotlib\__init__.py:1423, in _preprocess_data.<locals>.inner(ax, data, *args, **kwargs)
1420 @functools.wraps(func)
1421 def inner(ax, *args, data=None, **kwargs):
1422 if data is None:
-> 1423 return func(ax, *map(sanitize_sequence, args), **kwargs)
1425 bound = new_sig.bind(ax, *args, **kwargs)
1426 auto_label = (bound.arguments.get(label_namer)
1427 or bound.kwargs.get(label_namer))
File C:\Python\310\lib\site-packages\matplotlib\axes\_axes.py:5103, in Axes.quiver(self, *args, **kwargs)
5101 # Make sure units are handled for x and y values
5102 args = self._quiver_units(args, kwargs)
-> 5103 q = mquiver.Quiver(self, *args, **kwargs)
5104 self.add_collection(q, autolim=True)
5105 self._request_autoscale_view()
File C:\Python\310\lib\site-packages\matplotlib\quiver.py:514, in Quiver.__init__(self, ax, scale, headwidth, headlength, headaxislength, minshaft, minlength, units, scale_units, angles, width, color, pivot, *args, **kwargs)
512 kwargs.setdefault('facecolors', color)
513 kwargs.setdefault('linewidths', (0,))
--> 514 super().__init__([], offsets=self.XY, offset_transform=self.transform,
515 closed=False, **kwargs)
516 self.polykw = kwargs
517 self.set_UVC(U, V, C)
File C:\Python\310\lib\site-packages\matplotlib\_api\deprecation.py:454, in make_keyword_only.<locals>.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 C:\Python\310\lib\site-packages\matplotlib\collections.py:1174, in PolyCollection.__init__(self, verts, sizes, closed, **kwargs)
1153 @_api.make_keyword_only("3.6", name="closed")
1154 def __init__(self, verts, sizes=None, closed=True, **kwargs):
1155 """
1156 Parameters
1157 ----------
(...)
1172 Forwarded to `.Collection`.
1173 """
-> 1174 super().__init__(**kwargs)
1175 self.set_sizes(sizes)
1176 self.set_verts(verts, closed)
File C:\Python\310\lib\site-packages\matplotlib\_api\deprecation.py:454, in make_keyword_only.<locals>.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 C:\Python\310\lib\site-packages\matplotlib\collections.py:202, in Collection.__init__(self, edgecolors, facecolors, linewidths, linestyles, capstyle, joinstyle, antialiaseds, offsets, offset_transform, norm, cmap, pickradius, hatch, urls, zorder, **kwargs)
199 self._offset_transform = offset_transform
201 self._path_effects = None
--> 202 self._internal_update(kwargs)
203 self._paths = None
File C:\Python\310\lib\site-packages\matplotlib\artist.py:1186, in Artist._internal_update(self, kwargs)
1179 def _internal_update(self, kwargs):
1180 """
1181 Update artist properties without prenormalizing them, but generating
1182 errors as if calling `set`.
1183
1184 The lack of prenormalization is to maintain backcompatibility.
1185 """
-> 1186 return self._update_props(
1187 kwargs, "{cls.__name__}.set() got an unexpected keyword argument "
1188 "{prop_name!r}")
File C:\Python\310\lib\site-packages\matplotlib\artist.py:1160, in Artist._update_props(self, props, errfmt)
1158 func = getattr(self, f"set_{k}", None)
1159 if not callable(func):
-> 1160 raise AttributeError(
1161 errfmt.format(cls=type(self), prop_name=k))
1162 ret.append(func(v))
1163 if ret:
AttributeError: Quiver.set() got an unexpected keyword argument 'normalize'Expected outcome
Without the arguments, I get the plot as expected, however I want the vectors to be normalized to a certain length.
Additional information
No response
Operating system
Windows
Matplotlib Version
3.6.2
Matplotlib Backend
nbagg
Python version
3.10.8
Jupyter version
6.5.2
Installation
pip
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
API: consistencystatus: inactiveMarked by the “Stale” Github ActionMarked by the “Stale” Github Action
