Построение двумерного массива с помощью mplot3d

У меня есть массив 2D numpy, и я хочу построить его в 3D. Я слышал о mplot3d, но не могу нормально работать

Вот пример того, что я хочу сделать. У меня есть массив с размерами (256,1024). Он должен построить трехмерный график, где ось x от 0 до 256, ось y от 0 до 1024, а ось z графика отображает значение массива для каждой записи.

Как мне это сделать?


person Fourier    schedule 10.07.2012    source источник


Ответы (4)


Похоже, вы пытаетесь создать график surface (альтернативно вы можете нарисовать каркас или заполненный график.

Из информации в вопросе вы можете попробовать что-то вроде:

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

# Set up grid and test data
nx, ny = 256, 1024
x = range(nx)
y = range(ny)

data = numpy.random.random((nx, ny))

hf = plt.figure()
ha = hf.add_subplot(111, projection='3d')

X, Y = numpy.meshgrid(x, y)  # `plot_surface` expects `x` and `y` data to be 2D
ha.plot_surface(X, Y, data)

plt.show()

Очевидно, вам нужно выбрать более разумные данные, чем использование numpy.random, чтобы получить разумную поверхность.

person Chris    schedule 10.07.2012
comment
спасибо за ваш ответ;) Может быть, я немного глуп, но я действительно не знаю, как получить свой 2D-массив из двух 2D-массивов и списка: o - person Fourier; 10.07.2012
comment
Я сделал это за вас: x, y = range(nx), range(ny) создаст одномерные списки значений x и y, а строка X, Y = numpy.meshgrid(x, y) преобразует эти списки в двумерные массивы NumPy (NumPy должен быть установлен для работы Matplotlib, поэтому он уже есть в вашей системе). Если у вас есть другой вопрос, возможно, вы можете отредактировать свой вопрос, чтобы предоставить больше информации, например, включить данные, которые вы пытаетесь построить. - person Chris; 10.07.2012
comment
Ваш 2D-массив в приведенном выше коде называется просто data, а его размер называется nx, ny. Надеюсь, это поможет вам двигаться вперед. - person Eric O Lebigot; 10.07.2012
comment
Хорошо, спасибо, я понял это до сих пор, но при компиляции я получаю сообщение об ошибке: Файл /usr/lib/pymodules/python2.6/matplotlib/figure.py, строка 678, в add_subplot projection_class = get_projection_class(projection) File /usr/ lib/pymodules/python2.6/matplotlib/projections/__init__.py, строка 61, в get_projection_class поднять ValueError (неизвестная проекция '%s' % проекция) ValueError: неизвестная проекция '3d' - person Fourier; 10.07.2012
comment
Это означает, что вы не включили строку from mpl_toolkits.mplot3d import Axes3D в свой сценарий. - person Chris; 10.07.2012
comment
@Chris Выполнение вашего кода в Python 3.6 приводит к ошибке b = np.broadcast(*args[:32]) ValueError: несоответствие формы: объекты не могут транслироваться в одну форму - person Karlo; 23.03.2017
comment
как бы вы добавили цветную полосу к этому? и метки осей? - person ALUW; 16.02.2018
comment
@ALUW Пожалуйста, задайте это как новый вопрос, а не как комментарий к ответу на существующий вопрос. Хотя я уверен, что вы найдете ответ в документации по matplotlib. - person Chris; 19.02.2018
comment
@Chris просто пытается сохранить все в одном обсуждении. И нет, я не нашел его в документации. - person ALUW; 20.02.2018
comment
@Karlo Карло Я не уверен, для какой версии Python этот ответ действителен, поэтому я не буду редактировать ваш ответ. Но для тех, кто использует по крайней мере Python 3.6... измените команду plot_surface на: ha.plot_surface(X.T, Y.T, data) Тогда вы получите правильный результат - person zwep; 30.11.2018


Вы можете найти ответ в одном из примеров галереи Matplotlib; 3D-примеры ближе к концу.

В более общем плане галерея Matplotlib — отличный первоначальный ресурс для поиска того, как делать некоторые графики.

Примеры, которые я рассмотрел, по существу работают с тремя 2D-массивами: один со всеми значениями x, один со всеми значениями y и последний со всеми значениями z. Таким образом, одним из решений является создание массивов значений x и y (например, с meshgrid()).

person Eric O Lebigot    schedule 10.07.2012

Вы также можете использовать модуль oct2py, который на самом деле является мостом python-octave. Используя его, вы можете использовать функции октавы, и вы можете получить то, что вам нужно, и это довольно просто.

ознакомьтесь с этой документацией: https://www.gnu.org/software/octave/doc/v4.0.1/Three_002dDimensional-Plots.html

И для примера примера:

from oct2py import octave as oc

tx = ty = oc.linspace (-8, 8, 41)
[xx, yy] = oc.meshgrid (tx, ty)
r = oc.sqrt (xx * xx + yy * yy) + oc.eps()
tz = oc.sin (r) / r
oc.mesh (tx, ty, tz)

Выше приведен код Python, который аналогичен первому примеру, реализованному в октаве в приведенной выше документации.

person AnnShress    schedule 05.07.2016