2016-02-15 2 views
8

У меня есть лог-лог-график, в котором диапазон варьируется от 10^-3 до 10^+3. Я хотел бы, чтобы значения ≥10^0 имели знак + в экспоненте, аналогичный значению <10^0. Знак экспонента -. Есть ли простой способ сделать это в matplotlib?Добавление знака + к показателю в осях matplotlib

Я просмотрел FuncFormatter, но это слишком сложно для достижения этого, и я не мог заставить его работать.

+0

Вы хотите отформатировать аннотации для меток на осях x и y? – tokamak

+0

@tokamak - На данный момент фактически интересуется только осью y, но было бы неплохо установить обе оси отдельно. – nluigi

+0

Глядя на код, который генерирует отметки галочки https://github.com/matplotlib/matplotlib/blob/ 7d1a7c2e4637efba239ad3b984928c0175d45f98/lib/matplotlib/ticker.py # L803 похоже, что нет очевидного способа его изменения. Я думаю, что оптимальным способом было бы просто создать измененную версию этой меняющейся линии 823. –

ответ

5

Вы можете сделать это с помощью FuncFormattermatplotlib.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() 

enter image description here

Некоторые пояснения форматной строки:

"$10^{{+{:.0f}}}$".format(logx) 

двойные фигурные скобки {{ и }} передаются LaTeX, чтобы показать все, что в них должны быть подняты в качестве показателя. Нам нужны двойные фигурные скобки, потому что отдельные фигурные скобки используются python для хранения строки формата, в данном случае {:.0f}. Более подробное описание спецификаций формата см. В docs here, но TL; DR для вашего случая - это форматирование поплавка с точностью до десяти знаков после запятой (т. Е. Печать по существу как целое число); показателем является float в этом случае, потому что np.log10 возвращает поплавок. (можно альтернативно преобразовать вывод np.log10 в int, а затем форматировать строку как int - только вопрос вашего предпочтения, который вы предпочитаете).

+0

Ok thx, я собираюсь с этим ... Можете ли вы объяснить формат' {{: .0f}} 'Я угадываю, чрезмерные скобки используются для выхода, но что именно делает: .0f'? – nluigi

0

Я надеюсь, что это то, что вы имеете в виду:

def fmt(y, pos): 
    a, b = '{:.2e}'.format(y).split('e') 
    b = int(b) 
    if b >= 0: 
     format_example = r'$10^{+{}}$'.format(b) 
    else: 
     format_example = r'$10^{{}}$'.format(b) 
    return 

Затем используйте FuncFormatter, например, для цветной панели: plt.colorbar(name_of_plot,ticks=list_with_tick_locations, format = ticker.FuncFormatter(fmt)). Я думаю, вам нужно импортировать import matplotlib.ticker as ticker.

С уважением