Skip to content

Scatter3D: facecolor or color to "none" leads to an error #18020

Closed
@cvanwynsberghe

Description

@cvanwynsberghe

Assigning "none" to facecolor or color parameter does not work any longer for 3D scatter plots. My current version of matplotlib is 3.2.2

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

np.random.seed(2121)
x = np.random.randn(3, 10)

# %% 2D (still working)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(*x[0:2, :], marker='o', facecolor='blue', color='red', s=50)  # working
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(*x[0:2, :], marker='o', facecolor='none', color='red', s=50)   # working
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(*x[0:2, :], marker='o', facecolor='blue', color='none', s=50)   # working

# %% 3D (not working any longer)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(*x, marker='o', facecolor='blue', color='red', s=50)   # working
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(*x, marker='o', facecolor="none", color='red', s=50)   # NOT working
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(*x, marker='o', facecolor='blue', color="none", s=50)  # NOT working

The console returns the following error:

<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7f668ea53b90>Traceback (most recent call last):
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/backends/backend_qt5.py", line 496, in _draw_idle
    self.draw()
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/backends/backend_agg.py", line 393, in draw
    self.figure.draw(self.renderer)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/figure.py", line 1736, in draw
    renderer, self, artists, self.suppressComposite)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/image.py", line 137, in _draw_list_compositing_images
    a.draw(renderer)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 293, in draw
    reverse=True)):
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 292, in <lambda>
    key=lambda col: col.do_3d_projection(renderer),
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/mpl_toolkits/mplot3d/art3d.py", line 540, in do_3d_projection
    fcs = (_zalpha(self._facecolor3d, vzs) if self._depthshade else
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/mpl_toolkits/mplot3d/art3d.py", line 847, in _zalpha
    rgba = np.broadcast_to(mcolors.to_rgba_array(colors), (len(zs), 4))
  File "<__array_function__ internals>", line 6, in broadcast_to
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/numpy/lib/stride_tricks.py", line 182, in broadcast_to
    return _broadcast_to(array, shape, subok=subok, readonly=True)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/numpy/lib/stride_tricks.py", line 127, in _broadcast_to
    op_flags=['readonly'], itershape=shape, order='C')
ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (0,4) and requested shape (10,4)
Traceback (most recent call last):
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/backends/backend_qt5.py", line 496, in _draw_idle
    self.draw()
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/backends/backend_agg.py", line 393, in draw
    self.figure.draw(self.renderer)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/figure.py", line 1736, in draw
    renderer, self, artists, self.suppressComposite)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/image.py", line 137, in _draw_list_compositing_images
    a.draw(renderer)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 293, in draw
    reverse=True)):
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 292, in <lambda>
    key=lambda col: col.do_3d_projection(renderer),
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/mpl_toolkits/mplot3d/art3d.py", line 540, in do_3d_projection
    fcs = (_zalpha(self._facecolor3d, vzs) if self._depthshade else
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/mpl_toolkits/mplot3d/art3d.py", line 847, in _zalpha
    rgba = np.broadcast_to(mcolors.to_rgba_array(colors), (len(zs), 4))
  File "<__array_function__ internals>", line 6, in broadcast_to
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/numpy/lib/stride_tricks.py", line 182, in broadcast_to
    return _broadcast_to(array, shape, subok=subok, readonly=True)
  File "/home/vanwynch/anaconda3/lib/python3.7/site-packages/numpy/lib/stride_tricks.py", line 127, in _broadcast_to
    op_flags=['readonly'], itershape=shape, order='C')
ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (0,4) and requested shape (10,4)

The workaround is to use (0, 0, 0, 0) as color/facecolor rather than "none" :

# %% 3D workaround
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(*x, marker='o', facecolor='blue', color='red', s=50)   # working
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(*x, marker='o', facecolor=(0, 0, 0, 0), color='red', s=50)   # working
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(*x, marker='o', facecolor='blue', color=(0, 0, 0, 0), s=50)   # working

Metadata

Metadata

Assignees

No one assigned

    Labels

    Release criticalFor bugs that make the library unusable (segfaults, incorrect plots, etc) and major regressions.topic: mplot3d

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions