3D-график с помощью matplotlib из импортированных данных

761
lucian

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

Я читал о matplotlib, но мне очень трудно получить документацию. Когда я начал с Gnuplot, я нашел очень хороший шаблон здесь, который я могу использовать для создания 2D - графики и multiplots любым удобным способом мне нравится.

Есть ли что-то похожее на matplotlib, которое я могу использовать? Почти во всех примерах для matplotlib используются функции, которые отображаются различными способами, но нет примеров, когда данные импортируются и отображаются.

2
Похоже, вы могли бы «функционализировать» данные в файле - под этим я подразумеваю создание функции, которая могла бы вызываться или иным образом использоваться matplotlib, который предоставляет данные файла ему / так, как он ожидает / требует .. martineau 5 лет назад 0
Я не очень понимаю, что вы имеете в виду под функционализацией. Если вы имеете в виду, что я должен генерировать данные (которые теперь поступают из mathematica) внутри matplotlib, хотя в принципе это выполнимо, у меня нет опыта работы с python. Я написал довольно сложную программу в Mathematica, которая дает мне данные. Проблема в том, что Mathematica изо всех сил слабо экспортирует хорошие цифры, пригодные для публикации. lucian 5 лет назад 0
Нет, я не это имел в виду под (вымышленным) термином «функционализировать». То, что я пытался описать, было создание функции, которая могла бы использоваться с существующими возможностями построения функций matplotlib, которые представляли бы / возвращали данные (из вашего существующего экспортированного файла) в них в формате или так, как это ожидалось или требуется. Python может легко читать данные файла, а также может предоставлять эти данные вызывающей стороне (matplotlib) постепенно, если это необходимо. Я предлагаю вам повторно задать свой вопрос на [stackoveflow] (https://stackoverflow.com/questions/tagged/python). martineau 5 лет назад 0
Надеюсь, поможет. Когда вы это сделаете, обязательно пометьте ** ваш вопрос ** тегами "python" и "matplotlib". martineau 5 лет назад 0

1 ответ на вопрос

0
Moustache

Я думаю, что вы задаете здесь несколько вопросов, я постараюсь ответить на самый фундаментальный: загрузка ваших CSV-данных в Python, а затем построение основного графика поверхности.

Обратите внимание, что в общем случае вам нужна матрица NxN значений Z для графика, где X и Y - векторы длины N. Это имеет смысл, потому что каждая точка (x, y) нуждается в значении Z и существует N x N (x). у) баллы. Я покажу вам два пути. Если у вас есть такие данные, то, по крайней мере, вы сможете начать настраивать свой график, используя документацию и другие примеры, найденные в Интернете.

Этот ответ предполагает, что вы используете Python 3 и последние версии Matplotlib и Numpy . (Numpy - это числовой пакет Python, который обычно включается в дистрибутивы Python, например, Anaconda.) Однако в старых версиях синтаксис не должен сильно отличаться.

Сначала сделайте необходимый импорт:

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

Для случая, когда у вас есть 3 столбца данных 1d --- x, y и z:

DataAll1D = np.loadtxt("datacsv_1d.csv", delimiter=",")  # create 2d x,y grid (both X and Y will be 2d) X, Y = np.meshgrid(DataAll1D[:,0], DataAll1D[:,1])  # repeat Z to make it a 2d grid Z = np.tile(DataAll1D[:,2], (len(DataAll1D[:,2]), 1))  fig = plt.figure() ax = fig.add_subplot(111, projection='3d')  ax.plot_surface(X, Y, Z, cmap='ocean')  plt.show() 

Обратите внимание, что в np.loadtxt вы можете установить любой разделитель, например, '' для пробела.

Для случая, когда у вас есть 2 столбца данных 1d --- x и y --- и 2d матрицы данных z:

DataX_Y_1D = np.loadtxt("datacsv_1d_xy.csv", delimiter=",")  # create 2d x,y grid (both X and Y will be 2d) X, Y = np.meshgrid(DataX_Y_1D[:,0], DataX_Y_1D[:,1])  # get 2D z data Z = np.loadtxt("datacsv_2d_Z.csv", delimiter=",")  fig = plt.figure() ax = fig.add_subplot(111, projection='3d')  ax.plot_surface(X, Y, Z, cmap='ocean')  plt.show() 

Для более сложной настройки, вот ссылка на другой хороший учебник по этому вопросу:

https://jakevdp.github.io/PythonDataScienceHandbook/04.12-three-dimensional-plotting.html

Изменить: Для случая, когда у вас есть все необходимые точки данных, покрытые в 3 столбца (X, Y, Z), то plot_trisurfэто то, что вам нужно. См. Мой ответ о переполнении стека для простого примера: https://stackoverflow.com/questions/39240327/3d-surface-plot-using-matplotlib-in-python/52630484#52630484

Большое спасибо! это очень четкий ответ! Я постараюсь опираться на это! lucian 5 лет назад 1
Конечно --- Не стесняйтесь отправлять новый вопрос / комментарий, если вам нужны разъяснения. Поверхностные участки всегда немного хитры. Moustache 5 лет назад 0
Примечание: я написал другой ответ для случая, когда у вас есть только 3 столбца неструктурированных данных X, Y, Z (когда все необходимые точки данных покрыты в этих 3 столбцах) при переполнении стека: https://stackoverflow.com/questions / 39240327 / 3d-поверхность сюжетное с использованием-Matplotlib-в-питон / 52630484 # 52630484 Moustache 5 лет назад 0