3D График с matplotlib из импортированных данных

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

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

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

5
задан lucian
10.02.2023 3:05 Количество просмотров материала 2915
Распечатать страницу

1 ответ

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

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

этот ответ предполагает, что вы используете 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()

enter image description here

Примечание чем в 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()

enter image description here

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

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

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

0
отвечен Moustache 2023-02-11 10:53

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх