python - edgecolors ='None' 导致动画 3d 散点图出现错误

标签 python matplotlib

我正在尝试制作一个随着时间推移逐渐消失的 3d 散点图,类似于 this question 。但是,当我将颜色图应用于数据时,标记的表面会改变颜色,但边缘保持不变。

我尝试过使用 edgecolors='None' , edgecolor='none' kwargs,marker='o' kwarg 按照this example ,以及edgecolor='face'夸格。我还尝试过使用后期创建方法,例如 scat3D.set_edgecolor("None")等等。第一次尝试会抛出错误,而后者则无效。

设置 kwargs 时出错:

Traceback (most recent call last):
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/animation.py", line 230, in saving
    yield self
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/animation.py", line 1156, in save
    writer.grab_frame(**savefig_kwargs)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/animation.py", line 384, in grab_frame
    dpi=self.dpi, **savefig_kwargs)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/figure.py", line 2180, in savefig
    self.canvas.print_figure(fname, **kwargs)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/backends/backend_qt5agg.py", line 88, in print_figure
    super().print_figure(*args, **kwargs)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/backend_bases.py", line 2082, in print_figure
    **kwargs)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py", line 442, in print_raw
    FigureCanvasAgg.draw(self)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py", line 388, in draw
    self.figure.draw(self.renderer)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/figure.py", line 1709, in draw
    renderer, self, artists, self.suppressComposite)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/image.py", line 135, in _draw_list_compositing_images
    a.draw(renderer)
  File "/home/max/.local/lib/python3.6/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/home/max/.local/lib/python3.6/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 292, in draw
    reverse=True)):
  File "/home/max/.local/lib/python3.6/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 291, in <lambda>
    key=lambda col: col.do_3d_projection(renderer),
  File "/home/max/.local/lib/python3.6/site-packages/mpl_toolkits/mplot3d/art3d.py", line 545, in do_3d_projection
    ecs = (_zalpha(self._edgecolor3d, vzs) if self._depthshade else
  File "/home/max/.local/lib/python3.6/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/max/.local/lib/python3.6/site-packages/numpy/lib/stride_tricks.py", line 182, in broadcast_to
    return _broadcast_to(array, shape, subok=subok, readonly=True)
  File "/home/max/.local/lib/python3.6/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 (100,4)

(之后出现 during the handling the above exception another occured 错误,但我的帖子被标记为垃圾邮件,所以我没有包含它)

这是没有错误的代码(添加上面列出的 kwarg 会导致错误):

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

total = 10

num_whatever = 100

to_plot = [np.random.rand(num_whatever, 3) for i in range(total)]
colors = np.linspace(0, 1, num_whatever)


fig = plt.figure()
ax3d = Axes3D(fig)
scat3D = ax3d.scatter([],[],[], s=10, cmap="Blues", vmin=0, vmax=1)
scat3D.set_cmap("Blues") # cmap argument above is ignored, so set it manually
ttl = ax3d.text2D(0.05, 0.95, "", transform=ax3d.transAxes)

def update_plot(i):
    print( i, to_plot[i].shape)
    ttl.set_text('PCA on 3 components at step = {}'.format(i*20))
    scat3D._offsets3d = np.transpose(to_plot[i])
    scat3D.set_array(colors)
    return scat3D,

def init():
    scat3D.set_offsets([[],[],[]])
    plt.style.use('ggplot')

ani = animation.FuncAnimation(fig, update_plot, init_func=init, 
                              blit=False, interval=300, frames=range(total))

ani.save("ani.gif", writer="imagemagick")

plt.show()

这是标记边缘未隐藏的图:

Plot

您可以看到褪色的点仍然具有未进行颜色映射的标记边缘。我希望设置 edgecolor首先是不必要的,因为 2d 动画显然不需要它。但为什么添加那个 kwarg 会让我得到 operands could not be broadcast togeather错误?我没有任何形状为 (0, 4) 的数组,因此不清楚它来自哪里。

最佳答案

问题是,如果未指定 c (作为颜色参数),则无法先验清楚是否应该发生颜色映射。这导致内部对于要遵循哪些论点产生一些困惑。但我们可以将 c 指定为空列表来解决这个问题。

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

total = 10

num_whatever = 100

to_plot = [np.random.rand(num_whatever, 3) for i in range(total)]
colors = np.linspace(0, 1, num_whatever)

fig = plt.figure()
ax3d = Axes3D(fig)
scat3D = ax3d.scatter([], [], [], s=10, c=[], cmap="Blues", vmin=0, vmax=1, 
                      depthshade=False)

ttl = ax3d.text2D(0.05, 0.95, "", transform=ax3d.transAxes)

def update_plot(i):
    print( i, to_plot[i].shape)
    ttl.set_text('PCA on 3 components at step = {}'.format(i*20))
    scat3D._offsets3d = np.transpose(to_plot[i])
    scat3D.set_array(colors)
    return scat3D,

def init():
    scat3D.set_offsets([[],[],[]])
    plt.style.use('ggplot')


ani = animation.FuncAnimation(fig, update_plot, init_func=init, 
                              blit=False, interval=300, frames=range(total))
ani.save("ani.gif", writer="imagemagick")

plt.show()

关于python - edgecolors ='None' 导致动画 3d 散点图出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57485825/

相关文章:

PYTHON DLL 加载失败

python - Pandas HDFStore : changing dtype of indexes

python - 在一张图中绘制多个 Pandas 数据框

python - 如何在 matplotlib 生成的 PDF 中嵌入字体?

python - ValueError : Expect x to be a 1-D sorted array_like. 我试图绘制平滑曲线但不能

python - 我怎样才能得到所有可能的日志级别的数组?

python - TypeError : strptime() argument 1 must be str, 不是 datetime.date Python

Python @property.setter

python - 将线图添加到 Facetgrid 图中

python - Ubuntu 和 Matplotlib