Hay un argumento de “color” en la función bar3d de Axes3D que puede aceptar matrices para colorear barras individuales de diferentes colores, pero ¿cómo puedo aplicar un mapa de color (es decir, cmap = cm.jet) de la misma manera que una función plot_surface por ejemplo? Esto haría de una barra de cierta altura un color que refleje su altura.
http://matplotlib.sourceforge.net/examples/mplot3d/hist3d_demo.html
http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/api.html
Siguiendo la respuesta proporcionada por Ferguzz, aquí hay una solución más completa / actualizada:
import matplotlib.colors as colors import matplotlib.cm as cm dz = height_values offset = dz + np.abs(dz.min()) fracs = offset.astype(float)/offset.max() norm = colors.Normalize(fracs.min(), fracs.max()) color_values = cm.jet(norm(fracs.tolist())) ax.bar3d(xpos,ypos,zpos,1,1,dz, color=color_values)
Por favor, preste atención a los siguientes puntos:
Debe tener todas las variables (como xpos, ypos) definidas de manera similar al código en https://matplotlib.org/examples/pylab_examples/hist_colormapped.html
normalizar () ahora es normalizar ()
fracs es de tipo Series (de pandas) y debe convertirse a la lista
Aquí está mi solución:
offset = dz + np.abs(dz.min()) fracs = offset.astype(float)/offset.max() norm = colors.normalize(fracs.min(), fracs.max()) colors = cm.jet(norm(fracs)) ax.bar3d(xpos,ypos,zpos,1,1,dz, color=colors)
La primera línea solo es necesaria si sus datos se vuelven negativos.
Código adaptado desde aquí http://matplotlib.sourceforge.net/examples/pylab_examples/hist_colormapped.html .
Puede pasar una matriz de colores al argumento de facecolors, puede establecer un color para todos los parches en la superficie.
from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.gca(projection='3d') X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) colors = np.random.rand(40, 40, 4) surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors, linewidth=0, antialiased=False) ax.set_zlim(-1.01, 1.01) ax.zaxis.set_major_locator(LinearLocator(10)) ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) plt.show()