【问题标题】:How to plot with matplotlib a 3d quiver plot with color gradient for length? gives error "ValueError: object too deep for desired array"如何使用 matplotlib 绘制具有颜色渐变长度的 3d 箭袋图?给出错误“ValueError: object too deep for desired array”
【发布时间】:2020-12-11 16:14:59
【问题描述】:

我想通过颜色编码来表示箭袋的长度(箭头是否称为箭袋?)。这对于 2d 箭袋图没有问题。 Here 完成了。使用 3d 投影,它很难失败。此代码重现了该问题。

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')

# Make the grid
x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.8))

# Make the direction data for the arrows
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
     np.sin(np.pi * z))
M = np.sqrt(u**2 + v**2 + w**2)
ax.quiver(x, y, z, u, v, w, M)

plt.show()

这会在几个 matplotlib 文件中产生很长的回溯,并以

结尾
ValueError: object too deep for desired array

我怎样才能避免这个问题并对我的箭袋进行颜色编码?

【问题讨论】:

标签: python matplotlib 3d


【解决方案1】:

正如@venky__ 所指出的,之前已经讨论过类似的事情。我将它放入一个子程序并调整箭头长度,甚至考虑到我的数组中的复数。

def plot_3d_quiver(x, y, z, u, v, w):
    c = np.sqrt(np.abs(v) ** 2 + np.abs(u) ** 2 + np.abs(w) ** 2)
    c = (c.ravel() - c.min()) / c.ptp()
    # Repeat for each body line and two head lines
    c = np.concatenate((c, np.repeat(c, 2)))
    # Colormap
    c = plt.cm.jet(c)

    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.quiver(x, y, z, u, v, w, colors=c, length=0.1)
    plt.show()

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 2013-04-02
    • 2022-01-05
    • 2012-02-12
    • 2013-07-19
    • 2016-06-26
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多