Математический формат Matplotlib Colorbar Ticks - PullRequest
0 голосов
/ 28 марта 2020

Название говорит само за себя, не могу найти, как это реализовать. Для формата меток оси похожая команда выглядит так: ax.ticklabel_format(useMathText=True), с этим проблем нет, она работает. Но из-за того, что галочки цветовой панели заставили их появиться в формате MathText, я не мог найти, как это реализовать. Я пытался передать useMathText=True как аргумент в cbar.ax.tick_params() и cbar = plt.colorbar(), но это не сработало.

для воссоздания:

import numpy as np
import matplotlib.tri as mtri
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

p = np.array([[0, 0], [1, 0], [1, 1], [0, 1], [0.5, 0.5]])
e = np.array([[0, 1, 4], [3, 0, 4], [1, 2, 4], [2, 3, 4]])
t = mtri.Triangulation(p[:, 0], p[:, 1], e)
z = np.random.rand(5)

fig, ax = plt.subplots()
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
ax.set_aspect('equal', 'box')
ax.set(xlim=(min(p[:, 0]), max(p[:, 0])), ylim=(min(p[:, 1]), max(p[:, 1])))
c = ax.tricontourf(t, z, 10, cmap='plasma', vmin=np.min(z), vmax=np.max(z),
                   levels=np.linspace(np.min(z), np.max(z), 100))
ax.triplot(t, color='white', lw=0.1)
ax.set_title('Title', fontsize=16)
cbar = plt.colorbar(c, cax=cax, format='%.0e', ticks=np.linspace(np.min(z), np.max(z), 3))
cbar.set_label('Colorbar title', fontsize=16)
# cbar.ax.ticklabel_format(useMathText=True)
ax.ticklabel_format(useMathText=True)
plt.show()

1 Ответ

2 голосов
/ 28 марта 2020

Как объяснено в комментариях Эрнеста, цветовая полоса для контура получает FixedFormatter, что не принимает useMathText. В моей версии код не выдавал ошибку, но, как вы указали, также не генерировал желаемый результат.

Итак, ответ заключается в том, чтобы изменить форматер на ScalarFormatter, и на в то же время сказать ему, чтобы использовать математический текст. Форматер для вертикальной цветовой панели можно установить с помощью cbar.ax.yaxis.set_major_formatter.

from matplotlib import pyplot as plt
from matplotlib import ticker
import numpy as np

plt.tricontourf(np.random.uniform(1, 10, 100), np.random.uniform(1, 10, 100), np.random.uniform(1e-6, 1e-5, 100))
cbar = plt.colorbar()
cbar.ax.yaxis.set_major_formatter(ticker.ScalarFormatter(useMathText=True))
plt.show()

example plot

Пожалуйста, дайте мне знать, работает ли он сейчас для вас. (Моя система, теперь с matplotlib 3.2.1, Pycharm 2019.3.4 под Windows.)

...