У меня есть список из трех кортежей, представляющих набор точек в трехмерном пространстве. Я хочу построить поверхность, покрывающую все эти точки.
plot_surface
Функция в mplot3d
пакете требует в качестве аргументов X, Y и Z , чтобы быть 2d массивов. Подходит ли plot_surface
функция для построения поверхности и как мне преобразовать данные в требуемый формат?
data = [(x1,y1,z1),(x2,y2,z2),.....,(xn,yn,zn)]
python
numpy
matplotlib
surface
Градди
источник
источник
Ответы:
Для поверхностей это немного отличается от списка из трех кортежей, вы должны передать сетку для домена в 2d массивах.
Если все, что у вас есть, это список трехмерных точек, а не какая-то функция
f(x, y) -> z
, тогда у вас возникнет проблема, потому что есть несколько способов триангулировать это трехмерное облако точек на поверхность.Вот пример гладкой поверхности:
источник
f(x,y) -> z
вы подробнее рассказать о том, как наличие функции дает вам больше информации, чем простое использование спискового подхода, который изначально был у OP.plot_trisurf
вместо этого посмотреть . Но, как я уже упоминал, это нетривиально, потому что вам нужно триангулировать поверхность и есть несколько решений. В качестве базового примера рассмотрим только 4 точки, заданные формулами (0, 0, 0,2), (0, 1, 0), (1, 1, 0,2), (1, 0, 0). Если смотреть сверху, он выглядит как квадрат с небольшой складкой. Но по какой диагонали происходит «складка»? Это «высокая» диагональ 0,2 или «низкая» диагональ 0? Обе подходящие поверхности! Итак, вам нужно выбрать алгоритм триангуляции, прежде чем у вас будет четко определенное решение.projection='3d'
в вызовеfig.add_subplot
будет недоступно без этого импорта.Вы можете читать данные прямо из какого-либо файла и строить график
При необходимости вы можете передать vmin и vmax для определения диапазона шкалы палитры, например
Бонусный раздел
Мне было интересно, как делать интерактивные графики, в данном случае с искусственными данными
источник
Я столкнулся с той же проблемой. Я равномерно распределены данные , которые в 3 - 1-D массивов вместо 2-D массивов,
matplotlib
«Splot_surface
хочет. Мои данные оказались в виде,pandas.DataFrame
поэтому вотmatplotlib.plot_surface
пример с модификациями для построения 3 одномерных массивов.Это оригинальный пример. Добавление этого следующего бита создает тот же график из 3-х одномерных массивов.
Вот итоговые цифры:
источник
Просто чтобы поддержать разговор, у Эмануэля был ответ, который я (и, вероятно, многие другие) ищу. Если у вас есть трехмерные разбросанные данные в 3 отдельных массивах, pandas будет невероятным подспорьем и работает намного лучше, чем другие варианты. Чтобы уточнить, предположим, что ваши x, y, z - некоторые произвольные переменные. В моем случае это были c, гамма и ошибки, потому что я тестировал машину опорных векторов. Есть много возможных вариантов построения данных:
Каркасный график данных
3D разброс данных
Код выглядит так:
Вот окончательный результат:
источник
проверьте официальный пример. X, Y и Z действительно являются 2d-массивами, numpy.meshgrid () - простой способ получить 2d-сетку x, y из 1d значений x и y.
http://matplotlib.sourceforge.net/mpl_examples/mplot3d/surface3d_demo.py
вот питонический способ преобразовать ваши 3-кортежи в 3 1d массивы.
Вот триангуляция (интерполяция) mtaplotlib delaunay, она преобразует 1d x, y, z во что-то совместимое (?):
http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.griddata
источник
Просто чтобы добавить некоторые дополнительные мысли, которые могут помочь другим с проблемами нестандартного типа домена. Для ситуации, когда у пользователя есть три вектора / списка, x, y, z, представляющие 2D-решение, где z должен быть нанесен на прямоугольную сетку в виде поверхности, применимы комментарии plot_trisurf () от ArtifixR. Аналогичный пример, но с непрямоугольным доменом:
Приведенный выше код производит:
Однако это может не решить все проблемы, особенно если проблема определена в неправильном домене. Кроме того, в случае, когда домен имеет одну или несколько вогнутых областей, триангуляция с задержкой может привести к генерации ложных треугольников, находящихся вне области. В таких случаях эти неправильные треугольники должны быть удалены из триангуляции, чтобы получить правильное представление поверхности. В этих ситуациях пользователю может потребоваться явно включить расчет триангуляции Делоне, чтобы эти треугольники можно было удалить программно. В этих обстоятельствах следующий код может заменить предыдущий код графика:
Ниже приведены примеры графиков, иллюстрирующих решение 1) с ложными треугольниками и 2) где они были удалены:
Я надеюсь, что изложенное выше может помочь людям с вогнутыми данными в данных решения.
источник
В Matlab я сделал что - то подобное с помощью
delaunay
функции наx
,y
Coords только (неz
), а затем заговор сtrimesh
илиtrisurf
, используя вz
качестве высоты.SciPy имеет класс Delaunay , который основан на той же базовой библиотеке QHull, что и
delaunay
функция Matlab , поэтому вы должны получить идентичные результаты.Оттуда должно быть несколько строк кода для преобразования этого Plotting 3D Polygons in python-matplotlib в то, что вы хотите достичь, так как
Delaunay
дает вам спецификацию каждого треугольного многоугольника.источник
ax.plot_trisurf(..)
.Невозможно напрямую создать трехмерную поверхность, используя ваши данные. Я бы порекомендовал вам построить модель интерполяции, используя некоторые инструменты, такие как pykridge . Процесс будет включать три этапа:
pykridge
X
иY
используяmeshgrid
Z
Создав свою сетку и соответствующие
Z
значения, теперь вы готовы к работеplot_surface
. Обратите внимание, что в зависимости от размера ваших данныхmeshgrid
функция может работать некоторое время. Обходной путь - создать равномерно распределенные выборки с помощью осейnp.linspace
forX
иY
, а затем применить интерполяцию для вывода необходимыхZ
значений. В таком случае интерполированные значения могут отличаться от исходных,Z
посколькуX
иY
были изменены.источник