Лисаков и макромир

Замена значений отметок по осям в matplotlib

Допустим, подписи к отметкам на горизонтальной оси у графика выглядят так:

normal-minus

А хочется заменить «4000» на «четыретыщи»:

four thousands

Для этого перед сохранением файла и перед plt.show() пишем код:

1
2
3
4
5
from matplotlib.ticker import FuncFormatter
def my_formatter(x, pos):
return str('%.0f' % x).replace('4000', u'четыретыщи')

ax.xaxis.set_major_formatter(FuncFormatter(my_formatter))

Вторая строка определяет функцию my_formatter(x, pos), зависящую от двух переменных: x — значение подписи к отметки, pos — позиция подписи (наверное).

Третья строка описывает, что должна выполнять данная функция, а именно она должна возвращать str('%.0f' % x).replace('-', u'–'). В моём случае нужно взять '%.0f' % x, т.е. целую часть (чтобы получить 3 цифры после запятой, смените 0 на 3. Однако будьте внимательны, надписи могут заезжать друг на друга, поэтому контролируйте количество цифр после запятой при построении графика). Чтобы можно было делать замену, нужно ещё обратить '%.0f' % x в строку: str('%.0f' % x). В скобках после replace идёт через запятую, что и на что нужно заменить. А заменить мы хотим минус (справа от нуля на клавиатуре) на, например, N-тире (про N-тире, M-тире и дефис см. тут). Можете просто скопировать отсюда: - (дефис), – (N-тире), — (M-тире). Обратите внимание на букву u перед '–', она означает, что надо использовать юникод. Без неё не сработает вставка таких спецсимволов.

Четвёртая строка применяет нашу функцию к горизонтальной оси. Для воздействия на вертикальную ось замените xaxis на yaxis.

Также возможен вариант return str('%.0f' % x).replace('-', '$-$'). То, что внутри долларов, будет обработано LaTeX’ом. Значит, можно там вставить ‘$\endash$’, ‘$\emdash$’ и т.д. Но тогда по plt.show() при наведении курсора на отрицательную координату будет показано, например, x=$\endash$4000, хотя на сохранённом графике всё будет в порядке.

Возможно, чтобы Латех заработал, в начало программы придётся добавить строки:

1
2
3
import matplotlib as mpl
mpl.rcParams['text.usetex']=True
mpl.rcParams['text.latex.unicode']=True

но у меня работает и без них.

Если что-то не заработало, пожалуйста, сообщите, попробуем разобраться.