Bug summary
The documentation says that linewidths can be float or array-like and it defaults to 1.5, but passing an array-like leads to an error
Code for reproduction
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x = range(1, 10)
ax.scatter(x, x, x, marker='o', s=x, linewidth=x)
plt.show()
Actual outcome
Exception:
mpl_toolkits/mplot3d/axes3d.py in do_3d_projection(artist)
469 # avoid passing it to them; call this directly once the
470 # deprecation has expired.
--> 471 return artist.do_3d_projection()
472
473 _api.warn_deprecated(
matplotlib/_api/deprecation.py in wrapper(*inner_args, **inner_kwargs)
429 else deprecation_addendum,
430 **kwargs)
--> 431 return func(*inner_args, **inner_kwargs)
432
433 return wrapper
mpl_toolkits/mplot3d/art3d.py in do_3d_projection(self, renderer)
615
616 if len(self._linewidths3d) > 1:
--> 617 self._linewidths = self._linewidths3d[z_markers_idx]
618
619 # Re-order items
TypeError: only integer scalar arrays can be converted to a scalar index
gets raised, from:
|
if len(self._sizes3d) > 1: |
|
self._sizes = self._sizes3d[z_markers_idx] |
|
|
|
if len(self._linewidths3d) > 1: |
|
self._linewidths = self._linewidths3d[z_markers_idx] |
This is because the type of self._sizes3d is numpy.ndarray, but type of self._linewidths3d is list.
Expected outcome
Array-like linewidth works for 3d plots as it does for 2d plots.
Additional information
ax.scatter(x, x, x, marker='o', s=x) works fine.
linewidths is a list regardless of user input type.
- I don't know where linewidths gets converted to a list, but a quick fix is as simple as wrapping it in
np.array call: self._linewidths = np.array(self._linewidths3d)[z_markers_idx] (tested that this fixes the issue).
Operating system
No response
Matplotlib Version
3.5.2 but also happens with older versions (3.3.x)
Matplotlib Backend
No response
Python version
No response
Jupyter version
No response
Installation
pip
Bug summary
The documentation says that
linewidthscan befloat or array-likeand it defaults to 1.5, but passing an array-like leads to an errorCode for reproduction
Actual outcome
Exception:
gets raised, from:
matplotlib/lib/mpl_toolkits/mplot3d/art3d.py
Lines 599 to 603 in 0d433b4
This is because the type of
self._sizes3disnumpy.ndarray, but type ofself._linewidths3dislist.Expected outcome
Array-like linewidth works for 3d plots as it does for 2d plots.
Additional information
ax.scatter(x, x, x, marker='o', s=x)works fine.linewidthsis a list regardless of user input type.np.arraycall:self._linewidths = np.array(self._linewidths3d)[z_markers_idx](tested that this fixes the issue).Operating system
No response
Matplotlib Version
3.5.2 but also happens with older versions (3.3.x)
Matplotlib Backend
No response
Python version
No response
Jupyter version
No response
Installation
pip