Каркасный график matplotlib / 3D-график, как

Я хотел бы иметь 3D-сюжет с matplotlib.

Данные следующие: у меня есть матрица, каждая строка которой содержит координаты Y для трехмерного графика. Первые элементы каждой строки представляют собой координаты X для трехмерного графика. Наконец, вторая матрица содержит максимум для каждой точки в позиции X, Y. Таким образом, эта вторая матрица содержит мои координаты Z. Обе матрицы представляют собой массивы массивов с Python. Я хотел бы знать, как преобразовать данные, чтобы получить:

  • график каждого сигнала 1d, соответствующего X, как это (фото доступно в Интернете) введите описание изображения здесь
  • каркасный график для тех же данных, например введите здесь описание изображения

Я написал вспомогательную функцию для работы с каркасом,

 ########  HELPER FOR PLOT 3-D

 def plot_3d(name,X,Y,Z):

     fig = plt.figure(name)
     ax = fig.gca(projection='3d')
     X = np.array(X)
     Y = np.array(Y)
     Z = np.array(Z)
     ax.plot_wireframe(X,Y,Z,rstride=10,cstride=10)
     ax.set_xlabel('X Label')
     ax.set_ylabel('Y Label')
     plt.show()

но я не знаю, как преобразовать данные X, Y, Z, чтобы они соответствовали требованиям для функции matplotlib, которой нужны 2D-списки для X, Y, Z.

Для первого графика я прочитал справку и хочу использовать 2D-график в 3D. Пример исходного кода дает:

x = np.linspace(0, 1, 100)
y = np.sin(x * 2 * np.pi) / 2 + 0.5
ax.plot(x, y, zs=0, zdir='z', label='zs=0, zdir=z')

где z — постоянная координата. В моем случае x - постоянная координата. я адаптируюсь с

        fig = plt.figure('2d profiles')
        ax = fig.gca(projection='3d')
        for i in range(10):
             x = pt  ## this is a scalar
             y = np.array(y)
             z = np.array(z)
             ax.plot(xs = x, y, z, xdir='x')
        plt.show()

но есть предупреждение: non-keyword arg after keyword arg. Как исправить?

Спасибо и привет


person kiriloff    schedule 01.08.2012    source источник
comment
Вы имеете в виду исключение. Попробуйте заменить строку ax.plot(xs = x, y, z, xdir='x') на ax.plot(xs = x, ys-y, zs=z, xdir='x')   -  person pelson    schedule 01.08.2012


Ответы (1)


Что касается отображения серии векторов в 3D, я пришел к следующему «почти рабочему» решению:

def visualizeSignals(self, imin, imax):

    times = self.time[imin:imax]
    nrows = (int)((times[(len(times)-1)] - times[0])/self.mod) + 1

    fig = plt.figure('2d profiles')
    ax = fig.gca(projection='3d')
    for i in range(nrows-1):
        x = self.mat1[i][0] + self.mod * i
        y = np.array(self.mat1T[i])
        z = np.array(self.mat2[i])
        ax.plot(y, z, zs = x, zdir='z')

    plt.show()

Что касается 2D-поверхности или графика meshgrid, я использую meshgrid. Обратите внимание, что вы можете воспроизвести меш-сетку самостоятельно, как только узнаете, как строится меш-сетка. Для получения дополнительной информации о meshgrid я ссылаюсь на этот пост.

Вот код (нельзя использовать его как таковой, поскольку он относится к членам класса, но вы можете построить свой код на основе методов трехмерного графика из matplotlib, который я использую)

def visualize(self, imin, imax, typ_ = "wireframe"):
    """
    3d plot signal between imin and imax
    . typ_: type of plot, "wireframce", "surface"
    """

    times = self.retT[imin:imax]
    nrows = (int)((times[(len(times)-1)] - times[0])/self.mod) + 1

    self.modulate(imin, imax)

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

    x = []
    for i in range(nrows):
        x.append(self.matRetT[i][0] + self.mod * i)

    y = []
    for i in range(len(self.matRetT[0])):
        y.append(self.matRetT[0][i])
    y = y[:-1]


    X,Y = np.meshgrid(x,y)

    z = [tuple(self.matGC2D[i]) for i in range(len(self.matGC))] # matGC a matrix

    zzip = zip(*z)

    for i in range(len(z)):
        print len(z[i])

    if(typ_ == "wireframe"):
        ax.plot_wireframe(X,Y,zzip)
        plt.show()
    elif(typ_ == "contour"):
        cset = ax.contour(X, Y, zzip, zdir='z', offset=0)
        plt.show()
    elif(typ_ == "surf_contours"):
        surf = ax.plot_surface(X, Y, zzip, rstride=1, cstride=1, alpha=0.3)
        cset = ax.contour(X, Y, zzip, zdir='z', offset=-40)
        cset = ax.contour(X, Y, zzip, zdir='x', offset=-40)
        cset = ax.contour(X, Y, zzip, zdir='y', offset=-40)
        plt.show()
person kiriloff    schedule 02.08.2012