Я думаю, вы просто хотите использовать Mappable
материал в Matplotlib, что-то вроде:
import matplotlib.pyplot as plt
mappable = plt.cm.ScalarMappable()
mappable.set_array(Z)
, а затем позвоните plot_surface
с cmap
и norm
из этого сопоставляемого, например:
ax.plot_surface(X, Y, Z, cmap=mappable.cmap, norm=mappable.norm, linewidth=0, antialiased=False)
затем вы можете использовать этот сопоставимый для colorbar
:
plt.colorbar(mappable)
для этого следует использовать стандартную viridis
карту цветов карту цветов, но ее можно указать вручную как:
mappable = plt.cm.ScalarMappable(cmap=plt.cm.viridis)
Viridis - это хорошая "воспринимаемая равномерно" цветовая карта, посмотрите на видео выше, почему Matlab jet
почти всегда является плохим выбором, и почему он даже лучше, чем более современный по умолчанию parula
это просто повторное использование данных в Z как для "вертикальной" высоты, так и для цвета, поэтому я предлагаю использовать imshow
, например:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
X, Y = np.meshgrid(
np.linspace(-2, 2, 128),
np.linspace(-2, 2, 128),
)
Z = np.exp(-(X ** 2 + Y ** 2)) * 3 + 5
mappable = plt.cm.ScalarMappable(cmap=plt.cm.viridis)
mappable.set_array(Z)
mappable.set_clim(5, 8) # optional
fig = plt.figure(figsize=(10,4))
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot_surface(X, Y, Z, cmap=mappable.cmap, norm=mappable.norm, linewidth=0, antialiased=False)
ax2 = fig.add_subplot(122)
ax2.imshow(Z, cmap=mappable.cmap, norm=mappable.norm, extent=(
np.min(X), np.max(X), np.min(Y), np.max(Y)), interpolation='none')
plt.colorbar(mappable)
plt.tight_layout()
дает мне:

Я обнаружил, что второй не 3D-сюжет позволяет мне гораздо легче увидеть, что происходит