2017-10-02 5 views
0

J'essaie d'écrire un script pour matplotlib où les points de données sont tracés comme une structure filaire. Je l'ai fait dans gnuplot une fois (ce qui fonctionne). Néanmoins, je suis en train de migrer certains de mes scripts vers matplotlib car j'en suis plus convaincu maintenant.Tracer Wireframe en dehors des données ne fonctionnant pas

J'ai calculé certaines données en coordonnées cylindriques. Pour les z fixes, j'ai calculé les coordonnées x et y en fonction de l'angle phi. Quand un cercle complet est dessiné, la prochaine étape est z calculcated etc. Les données ressemble à ce

6.71570E+01 0.00000E+00 6.00000E+01 4.46028E+01 
    6.70761E+01 3.29524E+00 6.00000E+01 4.46028E+01 
    6.68336E+01 6.58254E+00 6.00000E+01 4.46028E+01 
    6.64301E+01 9.85398E+00 6.00000E+01 4.46028E+01 
    6.58666E+01 1.31017E+01 6.00000E+01 4.46028E+01 
    6.51444E+01 1.63178E+01 6.00000E+01 4.46028E+01 
    6.42653E+01 1.94947E+01 6.00000E+01 4.46028E+01 
    6.32313E+01 2.26245E+01 6.00000E+01 4.46028E+01 
    [...] 
    6.68336E+01 -6.58254E+00 6.00000E+01 4.46028E+01 
    6.70761E+01 -3.29524E+00 6.00000E+01 4.46028E+01 
    6.71570E+01 -8.51512E-13 6.00000E+01 4.46028E+01 

    6.34799E+01 0.00000E+00 5.70000E+01 4.21513E+01 
    6.34035E+01 3.11481E+00 5.70000E+01 4.21513E+01 
    6.31742E+01 6.22212E+00 5.70000E+01 4.21513E+01 
    6.27928E+01 9.31444E+00 5.70000E+01 4.21513E+01 
    6.22602E+01 1.23843E+01 5.70000E+01 4.21513E+01 
    6.15775E+01 1.54244E+01 5.70000E+01 4.21513E+01 
    6.07465E+01 1.84272E+01 5.70000E+01 4.21513E+01 
    5.97691E+01 2.13857E+01 5.70000E+01 4.21513E+01 
    5.86478E+01 2.42927E+01 5.70000E+01 4.21513E+01 
    5.73852E+01 2.71412E+01 5.70000E+01 4.21513E+01 
    5.59843E+01 2.99242E+01 5.70000E+01 4.21513E+01 
    5.44485E+01 3.26352E+01 5.70000E+01 4.21513E+01 
    5.27816E+01 3.52676E+01 5.70000E+01 4.21513E+01 
    [...] 

où des lignes vides sont nécessaires pour obtenir gnuplot pour tracer le wireframe, décrit ici (lowrank.net/gnuplot/ datafile-e.html, voir 'Données tridimensionnelles'). Il suffit d'appeler 'splot' dans gnuplot pour dessiner la bonne structure filaire de mes données.

GnuPlot plot of my wireframe

En essayant de tracer dans matplotlib avec le code suivant:

import matplotlib.pyplot as plt 
import numpy as np 

from mpl_toolkits.mplot3d import Axes3D 

plt.close('all') 
fig = plt.figure() 
ax = fig.add_subplot(111, projection = '3d') 

file_in = open('wireframe_data.dat') 
with file_in as file: 
    data_mani = [[np.double(digit) for digit in line.split()] for line in file] 
file_in.close() 

data_mani = list(filter(None, data_mani)) # remove blank lines, fastest way 
data_mani = np.array(data_mani, dtype='float64') 

ax.plot_wireframe(data_mani[:, 0], data_mani[:, 1], data_mani[:, 2], rcount = 10, ccount = 10, linewidth=0.7) 

Il ne tire que les cercles au point de coordonnées fixes z et une ligne le long des cercles dans la direction z, à savoir pas entièrement un wireframe. Les résultats loooks comme celui-ci

Matplotlib plot of my wireframe (different data, but same structure)

J'essaie de comprendre comment tracer correctement en python et je ne peux pas le faire fonctionner avec différents appels de meshgrid. Pour l'instant, je ne sais même pas si j'ai besoin de meshgrid, car les données de surface sont déjà là. Peut-être que quelqu'un a une idée et peut m'aider ici? Je suis vraiment frustré pour le moment.

Dans l'attente de vos réponses.

Meilleurs voeux, TheOrangeman

Répondre

1

Ok, je trouve une solution. Je devais réorganiser mes données de la manière suivante:

[...] 
num_z = len(np.unique(data_mani[:, 2])) 
points_per_z = len(data_mani)/num_z 

XX = np.reshape(data_mani[:, 0], (num_z, points_per_z)) 
YY = np.reshape(data_mani[:, 1], (num_z, points_per_z)) 
ZZ = np.reshape(data_mani[:, 2], (num_z, points_per_z)) 

ax.plot_wireframe(XX, YY, ZZ) 

il ressemble maintenant this.