Как построить 3 массива как поверхностный график в Python - PullRequest
0 голосов
/ 06 марта 2019

Итак, у меня есть три массива данных, X, Y и Z, каждый из которых содержит 225 чисел.То, что я хотел бы сделать, это нанести все три значения одновременно на поверхностный график.Когда я пытаюсь использовать

ax.plot_surface(X,Y,Z)

, это говорит мне, что Z должен быть двумерным массивом.Я посмотрел и увидел, что можно построить Z, если бы это была функция X и Y, но мне нужно, чтобы первая точка Z была связана с первыми точками X и Y и т. Д. Возможно ли это вPython?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Если все ваши массивы одномерные, то я думаю, что вы хотите

ax.plot_trisurf(X,Y,Z, triangles=tri.triangles, cmap=plt.cm.Spectral)

Подробнее см. На https://matplotlib.org/examples/mplot3d/trisurf3d_demo2.html

0 голосов
/ 06 марта 2019

Итак, у меня есть три массива данных, X, Y и Z, каждый из которых содержит 225 чисел. То, что я хотел бы сделать, это нанести все три значения одновременно на поверхностный график.

Итак, из того, что я понял, вы хотите построить трехмерный поверхностный график. Но, похоже, вы предоставляете только 3 1xn массива. (в данном случае n == 255)

При построении графика поверхности на практике вы получаете каждую возможную комбинацию базы (плоскость XY) и сообщаете, насколько высока точка Z в данных координатах XY, поэтому Z изображается как функция Z (I, J)

но мне нужно, чтобы первая точка Z была связана с первыми точками X и Y и т. Д. Возможно ли это в Python?

Да, но если вы свяжете каждую точку Z с первыми X, Y и т. Д., У вас будут только значения Z для X == Y, что будет неполной информацией для вашего поверхностного графика!

Хороший (отличный) пример поверхностного сюжета взят из официального описания matplotlib docs

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np


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

# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)

, что приводит к:

enter image description here

Что на самом деле делает код:

  • Определение входных векторов X и Y (диапазон и интервал)
  • Создание сетки из этих векторов (если неясно, что такое сетка, выведите вывод!)
  • Определение функции для домена X, Y
  • Применение его для получения Z

Если вы отметите, X, Y и Z - это 2-мерные массивы!

Надеюсь, это поможет!

...