Вы можете сделать это с помощью FuncFormatter
matplotlib.ticker
из модуля. Вам нужно условие о том, является ли значение тика больше или меньше 1. Итак, если log10(tick value)
- >0
, тогда добавьте знак +
в строку метки, если нет, то он автоматически получит свой знак минуса.
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
# sample data
x = y = np.logspace(-3,3)
# create a figure
fig,ax = plt.subplots(1)
# plot sample data
ax.loglog(x,y)
# this is the function the FuncFormatter will use
def mylogfmt(x,pos):
logx = np.log10(x) # to get the exponent
if logx < 0:
# negative sign is added automatically
return u"$10^{{{:.0f}}}$".format(logx)
else:
# we need to explicitly add the positive sign
return u"$10^{{+{:.0f}}}$".format(logx)
# Define the formatter
formatter = ticker.FuncFormatter(mylogfmt)
# Set the major_formatter on x and/or y axes here
ax.xaxis.set_major_formatter(formatter)
ax.yaxis.set_major_formatter(formatter)
plt.show()
Некоторые пояснения форматной строки:
"$10^{{+{:.0f}}}$".format(logx)
двойные фигурные скобки {{
и }}
передаются LaTeX
, чтобы показать все, что в них должны быть подняты в качестве показателя. Нам нужны двойные фигурные скобки, потому что отдельные фигурные скобки используются python для хранения строки формата, в данном случае {:.0f}
. Более подробное описание спецификаций формата см. В docs here, но TL; DR для вашего случая - это форматирование поплавка с точностью до десяти знаков после запятой (т. Е. Печать по существу как целое число); показателем является float в этом случае, потому что np.log10
возвращает поплавок. (можно альтернативно преобразовать вывод np.log10
в int, а затем форматировать строку как int - только вопрос вашего предпочтения, который вы предпочитаете).
Вы хотите отформатировать аннотации для меток на осях x и y? – tokamak
@tokamak - На данный момент фактически интересуется только осью y, но было бы неплохо установить обе оси отдельно. – nluigi
Глядя на код, который генерирует отметки галочки https://github.com/matplotlib/matplotlib/blob/ 7d1a7c2e4637efba239ad3b984928c0175d45f98/lib/matplotlib/ticker.py # L803 похоже, что нет очевидного способа его изменения. Я думаю, что оптимальным способом было бы просто создать измененную версию этой меняющейся линии 823. –