2015-03-09 1 views
0

Je voudrais utiliser matplotlib pour créer un tracé 3D dispersé avec une surface projetée qui ressemble à cette démo mais en utilisant un fichier CSV que j'ai créé à partir d'Excel et qui contient les données XYZ 3 colonnes de nombres.Modifier la démo matplotlib pour utiliser le fichier csv avec les données XYZ

est ici le code de démonstration ...

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
from matplotlib import cm 

fig = plt.figure() 

ax = fig.gca(projection='3d') 

X, Y, Z = axes3d.get_test_data(0.05) 

ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) 
cset = ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm) 
cset = ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm) 
cset = ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm) 

ax.set_xlabel('X') 
ax.set_xlim(-40, 40) 
ax.set_ylabel('Y') 
ax.set_ylim(-40, 40) 
ax.set_zlabel('Z') 
ax.set_zlim(-100, 100) 

plt.show() 
+0

Quelle est votre question? – Alex

+0

Je voudrais utiliser la démo ci-dessus mais en lisant les données d'un fichier csv. Comment je fais ça? Mes données sont actuellement dans des colonnes dans Excel exporté en tant que fichier csv mais pourrait réorganiser s'il y avait une alternative plus simple. – matt12

Répondre

1

Vous pouvez simplement utiliser un csv.reader pour charger les données, les cartographier puis flotter. Ensuite, vous devez les mettre en forme pour numpy.

import csv 
from itertools import groupby 

data = [] 
with open('my.csv') as my_csv: 
    csv_reader = csv.reader(my_csv) 
    for line in csv_reader: 
     data.append(map(float, line)) 
data.sort() 
X, Z = [], [] 
for x, g in groupby(data, key=lambda line: line[0]): 
    X.append(x) 
    Y = [] 
    new_Z = [] 
    for y, gg in groupby(g, key=lambda line: line[1]): 
     Y.append(y) 
     new_Z.append(list(gg)[-1][2]) 
    Z.append(new_Z) 
X, Y = np.meshgrid(X, Y) # transform into 2D index numpy arrays 
Z = np.array(Z) # transform into 2D values numpy array 

edit: oublié de remodeler des valeurs; code mis à jour.

+0

Dois-je supprimer cette ligne .. "X, Y, Z = axes3d.get_test_data (0.05)" et remplacer avec votre code? Lorsque j'ai essayé que le message d'erreur était "TypeError: Input z doit être un tableau 2D." – matt12

+0

Oh, en effet, désolé; ça pourrait être mieux. –

+0

Merci :) C'est plus compliqué que ce à quoi je m'attendais! Testera plus tard aujourd'hui. Quelle est la méthode la plus simple pour utiliser un ensemble de données d'environ 2 000 à 10 000 valeurs? Quel serait le meilleur format pour simplifier le code? Je peux réorganiser avec un tableau croisé dynamique dans Excel, etc. – matt12