Почему аргументы для двумерных массивов plot_wireframe у Matplotlib? - PullRequest
0 голосов
/ 21 марта 2019

Я не могу найти четкого объяснения аргументов X, Y и Z для функции plot_wireframe в Matplotlib. Я играл с их предоставленным примером wire3d_demo.py , но я не понимаю, почему X, Y и Z являются двумерными массивами. Это довольно изогнутое трехмерное изображение, но если вы посмотрите на массивы X, Y и Z, все они имеют размер 120 на 120 2D массивов. Документация Matplotlib имеет такое краткое описание: «Значения данных». Кто-нибудь может уточнить это немного? Мне нравится Matplotlib, но его документация может быть немного скудной.

Обновление вопроса на основе ответа. Возможно, первое измерение двумерного массива представляет собой линию в трехмерном пространстве, и каркас сконструирован так, чтобы соединить все линии. В этом примере я рисую две четверти окружности в плоскости x, y с координатами z, равными 1,0:

temp_x = []
temp_y = []
temp_z1 = []
temp_z2 =[]

import math
# x^2+y^2=4
for i in range(201):
    x = 0.01 * i
    temp_x.append(x)
    y = math.sqrt(4-(x*x))
    temp_y.append(y)
    temp_z1.append(0.0)
    temp_z2.append(1.0)

X=np.array([temp_x,temp_x])
Y=np.array([temp_y,temp_y])
Z=np.array([temp_z1,temp_z2])

# Plot a basic wireframe.
ax.plot_wireframe(X, Y, Z)

two quarter circles connected by wire frame

Полагаю, первое измерение - это номер строки или, возможно, номер функции, а второе - это номер точки.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

В plot_wireframe(X,Y,Z), X - координаты x, Y - координаты y и Z - координаты z. Это должны быть 2D-массивы. Причина в том, что для функции построения графика требуется двумерная сетка. Следовательно, (X[i,j], Y[i,j], Z[i,j]) определяет точку в декартовом пространстве. i,j - индексы сетки.

Теперь возникает вопрос: зачем нам нужен i,j в качестве индекса сетки, и мы не можем использовать одну одномерную сетку с одним индексом k, так что X,Y,Z будет 1D массивом?
Это потому, что в случае (X[k], Y[k], Z[k]) информация о том, какая точка находится рядом с другой, теряется. В двумерной сетке вы можете однозначно определить, что (X[i,j], Y[i,j], Z[i,j]) подключен к (соседу) (X[i+1,j], Y[i+1,j], Z[i+1,j]), а также, например, (X[i,j-1], Y[i,j-1], Z[i,j-1]).
В одномерном случае (X[k+1], Y[k+1], Z[k+1]) явно подключен к (X[k], Y[k], Z[k]), но это дает вам только два соединения, в то время как вам нужно 4 соединения в каркасном режиме.

1 голос
/ 21 марта 2019

Позвольте мне объяснить с некоторыми числами. Для каждого значения x существует диапазон значений y. Предположим, у вас есть 9 точек на трехмерной поверхности. Каждый из них будет иметь значение x, значение y и соответствующее значение z. Допустим, x = 1, 2, 3 и y = 1, 2, 3.

Теперь для каждого значения x есть 3 y-точки, потому что у вас есть своего рода сетка

x = 1 --> y = 1, 2, 3     
x = 2 --> y = 1, 2, 3
x = 3 --> y = 1, 2, 3

Аналогично, для каждого значения y есть 3 x-точки.

y = 1 --> x = 1, 2, 3
y = 2 --> x = 1, 2, 3
y = 3 --> x = 1, 2, 3

Итак, всего комбинаций х и у и 9

(x, y) --> (1, 1), (1, 2), (1, 3), 
           (2, 1), (2, 2), (2, 3), 
           (3, 1), (3, 2), (3, 3) 

Таким образом, форма значений x теперь становится (3x3), потому что у вас есть всего 9 значений. Точно так же форма значений у становится (3х3). Теперь для каждой из этих (x, y) пар у вас есть соответствующее значение z в трехмерном пространстве. Следовательно, ваши z-значения также должны быть массивом 3x3.

Та же концепция и объяснение применимы для любого количества точек, в вашем вопросе это число составляет 120x120.

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