Форматирование z-оси в mplot3d

Я пытаюсь сделать поверхностный график в matplotlib, но я не могу сделать форматирование оси z хорошим. Я хочу, чтобы это было на научной нотации, с префиксом вдоль оси и показателем над осью (как то, что вы обычно получаете в Matlab). На данный момент я могу получить значения без научной нотации (с запятой и пятью нулями спереди), или я получаю префиксы, но не экспоненты...

Попробуйте 1: (дает научную нотацию, но не показатель)

from matplotlib import ticker

ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, rstride=3, cstride=3)
formatter = ticker.ScalarFormatter()
formatter.set_scientific(True)
formatter.set_powerlimits((-2,2))
ax.w_zaxis.set_major_formatter(formatter)

Попробуйте 2: (дает значения в десятичной форме, такие же, как и выходные данные по умолчанию)

from matplotlib import ticker

ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, rstride=3, cstride=3)
ax.ticklabel_format(axis="z", style="sci", scilimits=(0,0))

Что я здесь делаю неправильно?

Ответ 1

Когда вы создаете свой ScalarFormatter, попробуйте использовать параметр "Использовать текст Math":

from matplotlib import ticker
niceMathTextForm = ticker.ScalarFormatter(useMathText=True)
ax.w_zaxis.set_major_formatter(niceMathTextForm)