Применить цветовую карту к mpl_toolkits.mplot3d.Axes3D.bar3d

Существует аргумент 'color' для функции bar3d Axes3D, которая может принимать массивы для окрашивания отдельных баров в разные цвета - но как бы я применил цветовую карту (например, cmap = cm.jet) так же, как, например, функцию plot_surface? Это сделало бы полосу определенной высоты цветом, который отражает ее высоту.

http://matplotlib.sourceforge.net/examples/mplot3d/hist3d_demo.html

http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/api.html

3 ответа

Решение

Вот мое решение:

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)

Первая строка требуется только в том случае, если ваши данные становятся отрицательными.

Код адаптирован здесь http://matplotlib.sourceforge.net/examples/pylab_examples/hist_colormapped.html.

Следуя ответу, предоставленному Ferguzz, вот более полное / актуальное решение:

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)

Пожалуйста, обратите внимание на следующие моменты:

  • У вас должны быть все переменные (такие как xpos, ypos), определенные как код, описанный в https://matplotlib.org/examples/pylab_examples/hist_colormapped.html

  • normalize () теперь Normalize()

  • ГРП относится к типу Series (из панд) и должно быть преобразовано в список

Вы можете передать массив цветов в аргумент facecolors, он может установить цвет для каждого пятна на поверхности.

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()

Другие вопросы по тегам