web-dev-qa-db-fra.com

Python: Comment tracer des graphiques 3D en utilisant Python?

J'utilise matplotlib pour ce faire

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

fig = plt.figure()
ax = Axes3D(fig)

x = [6,3,6,9,12,24]
y = [3,5,78,12,23,56]

ax.plot(x, y, zs=0, zdir='z', label='zs=0, zdir=z')

plt.show()

Maintenant, cela crée un graphique horizontal dans l'espace 3D. Comment rendre le graphique vertical pour qu'il soit face à l'utilisateur?

Ce que je veux faire, c'est créer plusieurs de ces graphiques verticaux qui sont séparés par une certaine distance et font face à l'utilisateur.

24
Bruce

la réponse de bp pourrait bien fonctionner, mais il existe un moyen beaucoup plus simple.

Votre graphique actuel est "plat" sur l'axe z, c'est pourquoi il est horizontal. Vous voulez qu'il soit vertical, ce qui signifie que vous voulez qu'il soit "plat" sur l'axe des y. Cela implique la moindre modification de votre code:

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

fig = plt.figure()
ax = Axes3D(fig)

x = [6,3,6,9,12,24]
y = [3,5,78,12,23,56]
# put 0s on the y-axis, and put the y axis on the z-axis
ax.plot(xs=x, ys=[0]*len(x), zs=y, zdir='z', label='ys=0, zdir=z')
plt.show()

Ensuite, vous pouvez facilement avoir plusieurs de ces graphiques en utilisant des valeurs différentes pour le paramètre ys (par exemple, ys=[2]*len(x) au lieu de cela mettrait le graphique légèrement derrière).

12
Daniel G

Mayavi, en particulier le module mlab , fournit un tracé 3D puissant qui fonctionnera sur des données volumineuses et complexes et devrait être facile à utiliser sur des tableaux numpy.

7
Gael Varoquaux

Vous pouvez définir l'angle de vue du tracé 3D avec la fonction view_init (). L'exemple ci-dessous concerne la version 1.1 de matplotlib.

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

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

x = [6,3,6,9,12,24]
y = [3,5,78,12,23,56]

ax.plot(x, y, zs=0, zdir='z', label='zs=0, zdir=z')
ax.view_init(90, -90)
plt.show()
7
Ben

Selon la documentation que vous souhaitez utiliser la méthode ax.plot_surface(x,y,z). Plus d'informations et types de graphiques ici .

Les éléments suivants devraient fonctionner:

x = [1,2,3]
y = [4,5,6]
z = [7,8,9]
data = Zip(x,y,z)

#map data on the plane
X, Y = numpy.meshgrid(arange(0, max(x), 1), arange(0, max(y), 1))
Z = numpy.zeros((len(Y), len(X)), 'Float32')
for x_,y_,z_ in data:
  Z[x_, y_] = z_ #this should work, but only because x and y are integers
                 #and arange was done with a step of 1, starting from 0
fig = p.figure()
ax = p3.Axes3D(fig)
ax.plot_surface(X, Y, Z)
3
badp