Как построить с помощью matplotlib трехмерный график колчана с цветовым градиентом по длине? выдает ошибку "ValueError: слишком глубокий объект для нужного массива"

Я хочу указать длину колчанов (стрелы называют колчанами?), пометив их цветом. Это не проблема с 2D-графиками колчана. Вот готово. С 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

Как избежать этой проблемы и пометить колчаны цветом?

Каким должен быть M?

Equinox 11.12.2020 17:30

@venky__ математически это длина трехмерных векторов. Тот же подход используется здесь для достижения эффекта цветокоррекции стрелок: matplotlib.org/3.1.1/gallery/images_contours_and_fields/…

Andreas Schuldei 11.12.2020 18:07

Ты видел это? stackoverflow.com/questions/28420504/…

Equinox 11.12.2020 18:31

Я сделал. Я не понимаю, как это можно применить к проблеме длины

Andreas Schuldei 11.12.2020 18:41

прокрутив весь путь вниз, я вижу, что это полезно и как это можно сделать. @venky__

Andreas Schuldei 11.12.2020 19:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
744
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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()

Другие вопросы по теме