3D plot com matplotlib de dados importados

2

Eu estou olhando para traçar uma superfície 3D. Os dados são gerados em mathematica e exportados em um arquivo com três colunas separadas por espaços (eu posso mudá-lo para vírgula ou outro delimitador). O problema que tenho é que até agora tenho usado o gnuplot para todos os meus gráficos 2D, mas para este gráfico em particular o gnuplot não é tão fácil de usar e os resultados não são tão bons assim.

Eu li sobre o matplotlib, mas acho a documentação realmente difícil de passar. Quando eu comecei com o gnuplot, eu encontrei um modelo realmente bom aqui que eu posso usar para gerar gráficos 2D e multiplots de qualquer maneira que eu gosto.

Existe algo semelhante para o matplotlib que eu possa usar? Quase todos os exemplos para o matplotlib envolvem funções que são plotadas de várias maneiras, mas não há exemplos onde os dados são importados e plotados.

    
por lucian 04.06.2018 / 11:29

1 resposta

0

Acho que você está fazendo várias perguntas aqui, vou tentar responder a mais fundamental: carregar seus dados CSV em Python e, em seguida, traçar um gráfico de superfície básico.

Note que no caso geral você precisa de uma matriz NxN de valores Z para um gráfico onde X e Y são vetores de comprimento N. Isto faz sentido porque cada ponto (x, y) precisa de um Valor Z e existem pontos N x N (x, y). Eu vou te mostrar duas maneiras. Uma vez que você as tenha, pelo menos, você está em uma boa posição para começar a personalizar sua trama usando documentação e outros exemplos encontrados na web.

Esta resposta assume que você está usando o Python 3 e uma versão recente do Matplotlib e Numpy . (Numpy é um pacote numérico do Python que é comumente incluído em distribuições Python, por exemplo, Anaconda.) No entanto, a sintaxe não deve ser muito diferente em versões mais antigas.

Primeiro, faça as importações necessárias:

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

Para o caso em que você tem 3 colunas de dados 1d --- x, yez:

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()

Notequeemnp.loadtxtvocêpodedefinirqualquerdelimitador,porexemplo''porumespaço.

Paraocasoemquevocêtem2colunasdedados1d---xey---eumamatriz2ddedadosz:

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()

Paraumapersonalizaçãomaisavançada,aquiestáumlinkparaoutrobomtutorialsobreoassunto:

link

Edit: Para o caso em que você tem todos os pontos de dados necessários cobertos em 3 colunas (X, Y, Z), então plot_trisurf é o que você precisa. Veja minha resposta no Stack Overflow para um exemplo simples: link

    
por 01.08.2018 / 15:13