2

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

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

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

1 ответ1

0

Я думаю, что вы задаете здесь несколько вопросов, я постараюсь ответить на самый фундаментальный: загрузка ваших 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .