Cómo trazar colores de mapa de calor en 3D en Matplotlib

Estoy usando Matplotlib 3D para trazar 3 dimensiones de mi conjunto de datos como a continuación: introduzca la descripción de la imagen aquí

Pero ahora también quiero visualizar una cuarta dimensión (que es un valor escalar entre 0 y 20) como un mapa de calor. Básicamente, quiero que cada punto tome su color en función del valor de esta cuarta dimensión.

¿Existe tal cosa en Matplotlib? ¿Cómo puedo convertir un grupo de números entre [0-20] a colores de mapa de calor?

Tomé el código de aquí: http://matplotlib.org/mpl_examples/mplot3d/scatter3d_demo.py

Sí, algo como esto:

La actualización aquí es una versión con una barra de colores.

import numpy as np from pylab import * from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt def randrange(n, vmin, vmax): return (vmax-vmin)*np.random.rand(n) + vmin fig = plt.figure(figsize=(8,6)) ax = fig.add_subplot(111,projection='3d') n = 100 xs = randrange(n, 23, 32) ys = randrange(n, 0, 100) zs = randrange(n, 0, 100) colmap = cm.ScalarMappable(cmap=cm.hsv) colmap.set_array(zs) yg = ax.scatter(xs, ys, zs, c=cm.hsv(zs/max(zs)), marker='o') cb = fig.colorbar(colmap) ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') plt.show() 

parece:

colbar

actualización Aquí hay un ejemplo explícito de colorear sus puntos de datos por algún atributo de 4ta dimensión.

 import numpy as np from pylab import * from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt def randrange(n, vmin, vmax): return (vmax-vmin)*np.random.rand(n) + vmin fig = plt.figure(figsize=(8,6)) ax = fig.add_subplot(111,projection='3d') n = 100 xs = randrange(n, 0, 100) ys = randrange(n, 0, 100) zs = randrange(n, 0, 100) the_fourth_dimension = randrange(n,0,100) colors = cm.hsv(the_fourth_dimension/max(the_fourth_dimension)) colmap = cm.ScalarMappable(cmap=cm.hsv) colmap.set_array(the_fourth_dimension) yg = ax.scatter(xs, ys, zs, c=colors, marker='o') cb = fig.colorbar(colmap) ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') plt.show() 

4dcoles