Трехмерный график неравных массивов с использованием matplotlib - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть два массива, представляющих координаты x и y в двух измерениях. Эти (x, y) позиции дают координаты точек в 2D плоскости. Примеры массивов x и y приведены ниже.

x = np.array([1.0, 4.0, 3.0, 5.0])
y = np.array([1.5, 4.2, 3.5, 5.2]) 

В приведенном выше примере у нас есть координаты четырех двумерных (x,y) точек [т.е. (1.0, 1.5), (4.0, 4.2), (3.0, 3.5), (5.0, 5.2)].

Начиная с каждой из этих четырех двумерных (x, y) точек, у меня есть массивы, которые представляют z координаты. Для этого примера у меня будет четыре z массива. Давайте рассмотрим примеры, приведенные ниже.

z1 = np.array([3.1, 3.6, 7.8, 9.2, 11.2, 11.7])
z2 = np.array([4.2, 4.8, 5.9, 10.2])
z3 = np.array([2.1, 2.5, 2.8, 3.5, 4.9])
z4 = np.array([2.0, 4.5, 5.7, 7.2, 7.8, 8.1, 9.2, 15.6])

Различные массивы z (z1, z2, z3 и z4), как ожидается, будут иметь неодинаковую длину.

Я хочу получить трехмерный график этих z массивов (начиная с упомянутых (x, y) позиций) с использованием matplotlib. Пример такого сюжета, который я ожидаю, можно найти ниже. here Я пытался начать с этого:

Axes3D.scatter(xs=x, ys=y, zs=z1, zdir='z)

Но я получаю следующую ошибку:

TypeError: unbound method scatter() must be called with Axes3D instance as first argument (got nothing instead)

Как создать желаемый трехмерный график для простого примера (массивы x, y и z), который я дал в этом вопросе (я использую python 2.7)?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Поздно к игре, но вот еще один способ сделать это без циклов for.

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1.0, 4.0, 3.0, 5.0])
y = np.array([1.5, 4.2, 3.5, 5.2])

z1 = np.array([3.1, 3.6, 7.8, 9.2, 11.2, 11.7])
z2 = np.array([4.2, 4.8, 5.9, 10.2])
z3 = np.array([2.1, 2.5, 2.8, 3.5, 4.9])
z4 = np.array([2.0, 4.5, 5.7, 7.2, 7.8, 8.1, 9.2, 15.6])

zs = [z1, z2, z3, z4]
zi_len = [z.shape[0] for z in zs]  # [6, 4, 5, 8]

x_ = np.repeat(x, zi_len)  # [1.0, 1.0, 1.0, 1.0, 1.0,  1.0,  4.0, 4.0, 4.0, 4.0,  3.0, 3.0, 3.0, 3.0, 3.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]
y_ = np.repeat(y, zi_len)  # [1.5, 1.5, 1.5, 1.5, 1.5,  1.5,  4.2, 4.2, 4.2, 4.2,  3.5, 3.5, 3.5, 3.5, 3.5, 5.2, 5.2, 5.2, 5.2, 5.2, 5.2, 5.2, 5.2]
z_ = np.concatenate(zs)    # [3.1, 3.6, 7.8, 9.2, 11.2, 11.7, 4.2, 4.8, 5.9, 10.2, 2.1, 2.5, 2.8, 3.5, 4.9, 2.0, 4.5, 5.7, 7.2, 7.8, 8.1, 9.2, 15.6]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xs=x_, ys=y_, zs=z_, zdir='z', c=z_)
plt.show()

enter image description here

0 голосов
/ 06 ноября 2018

Что делать

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

x = np.array([1.0, 4.0, 3.0, 5.0])
y = np.array([1.5, 4.2, 3.5, 5.2])

z1 = np.array([3.1, 3.6, 7.8, 9.2, 11.2, 11.7])
z2 = np.array([4.2, 4.8, 5.9, 10.2])
z3 = np.array([2.1, 2.5, 2.8, 3.5, 4.9])
z4 = np.array([2.0, 4.5, 5.7, 7.2, 7.8, 8.1, 9.2, 15.6])

zs = [
    z1, z2, z3, z4
]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

for i, x_i in enumerate(x):
    for z_ij in zs[i]:
        ax.scatter(xs=x_i, ys=y[i], zs=z_ij, zdir='z')
plt.show()

enter image description here


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