22 votes

Couleur de la ligne de la courbe paramétrique 3D dans matplotlib.pyplot de python

J'ai cherché sur Google pendant un certain temps sans succès ... peut-être que mes mots-clés sont tout simplement mauvais. Quoi qu'il en soit, supposons que j'aie trois 1D numpy.ndarray de même longueur, j'aimerais les représenter en 3D sous la forme d'une trajectoire. De plus, j'aimerais pouvoir faire l'une ou l'autre des choses suivantes :

  1. Modifier la couleur de la ligne en fonction de z
  2. Modifier la couleur de la ligne en fonction du temps (c'est-à-dire de l'indice dans les tableaux).

Cette démo présente un exemple de réalisation d'une telle courbe :

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

fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z)

plt.show()

enter image description here

Mais comment faire ? 1 o 2 ? Les solutions à l'une ou l'autre de ces questions sont les bienvenues ! Merci d'avance.

23voto

askewchan Points 12215

Comme pour les tracés 2D normaux, il n'est pas possible d'avoir un dégradé de couleur le long d'une ligne ordinaire. Cependant, vous pouvez le faire avec scatter :

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

fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)

#1 colored by value of `z`
ax.scatter(x, y, z, c = plt.cm.jet(z/max(z))) 

#2 colored by index (same in this example since z is a linspace too)
N = len(z)
ax.scatter(x, y, z, c = plt.cm.jet(np.linspace(0,1,N)))

plt.show()

J'ai aimé @Junuxx's piratage Je l'ai donc appliquée ici :

for i in xrange(N-1):
    ax.plot(x[i:i+2], y[i:i+2], z[i:i+2], color=plt.cm.jet(255*i/N))

2-Color by index2-Color lines by index

15voto

Junuxx Points 7969

Vous pouvez tracer chaque segment de ligne séparément, comme indiqué ci-dessous. Ceci ne fait que passer en boucle sur 6 couleurs prédéfinies, puisque la réponse de @askewchan démontre déjà bien comment utiliser une carte des couleurs.

cols = 'rgbcmy'

for i in range(len(x)-1):
    ax.plot(x[i:i+2], y[i:i+2], z[i:i+2], color=cols[i%6])

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X