Реализация 3D-графика с использованием Python из данных, хранящихся в 3 матрицах - PullRequest
0 голосов
/ 03 сентября 2018

Пусть M и N будут целыми числами. Одному дается один вектор s размера (M, 1), один вектор p размера (N, 1) и одна матрица u0 размера (M, N).

Предположим, что кто-то хочет построить 3D-график (s, p) как сетку, а u0 - как функцию для построения (ось z). Когда кто-то пишет:

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(s, p, u0, cmap=cm.coolwarm,
                   linewidth=0, antialiased=False)
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

терминал выводит следующее сообщение об ошибке:

ValueError: shape mismatch: objects cannot be broadcast to a single shape

Тем не менее, размеры совпадают! Есть ли способ 3D-построения u0 по сетке (s, p), не используя функцию arange для сетки ( cf слишком много повторяющихся примеров при https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#d-plots-in-3d)?

РЕДАКТИРОВАТЬ: Здесь MCVE. Первоначальная проблема - та, с которой столкнулся следующий пример.

import math
from math import *
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import plot, axis, savefig, show, title, meshgrid, cm, imshow, contour, clabel, colorbar
from numpy import exp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#

M = 10
N = 20

h = 1/float(M)
l = 1/float(N)

#

s = np.zeros((M + 1, 1))
p = np.zeros((N + 1, 1))

for j in range(0, M + 1):
    s[j] = 0.0 + 5.0*j*h
for k in range(0, N + 1):
    p[k] = 0.0 + 20.0*k*l

#

u0 = np.zeros((M + 1, N + 1))

for j in range(0, M):
    for k in range(0, N):
        u0[j, k] = exp(-(s[j] + p[k] - 10)**2)

#

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(p, s, u0, cmap=cm.coolwarm,
                   linewidth=0, antialiased=False)
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

1 Ответ

0 голосов
/ 04 сентября 2018

Хорошо, я не уверен, что вывод правильный, но вот решение. Добавьте следующую строку перед u0 = np.zeros((M + 1, N + 1))

sv, pv = np.meshgrid(s, p) # creating a meshgrid of MxN points

и замените вашу команду построения на

surf = ax.plot_surface(sv, pv, u0.T, cmap=cm.coolwarm,
               linewidth=0, antialiased=False)

выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...