2014-11-11 4 views
2

У меня есть некоторые данные, которые я рисую на полулогарифмическом графике (стиль лог-лина с логарифмической шкалой по оси y). Есть ли способ изменить метки метки оси y от их фактических значений до их логарифмических значений?Python, matplotlib: как установить значения меток меток на их логарифмические значения

В качестве примера, рассмотрим следующий код:

import matplotlib.pyplot as plt 
import numpy as np 

x=np.array([1,2,3,4,5]) 
def f(x): 
    return 10**(x-1) 

plt.plot(x,f(x)) 
plt.yscale(u'log') 

plt.show() 

Который производит следующий сюжет: enter image description here

(К сожалению это вид большой, я не знаю, как сделать его меньше, не стесняйтесь редактировать, чтобы помочь с этим).

На этом рисунке тиковые метки показаны как 10^0, 10^1, 10^2 и т. Д .; Однако я хотел бы их показать, как их логарифмические значения: 0, 1, 2 и т.д.

Я понимаю, что я мог вернуться назад и изменить plt.plot(x,f(x)) к plt.plot(x,np.log10(f(x))), а затем сделать линейную ось у снова вместо логарифмического, но я хочу чтобы узнать, есть ли в любом случае matplotlib может просто изменить значения галочки y-оси самостоятельно, без меня нужно поставить np.log10() во все мои plt.plot(). Моя причина для этого двоякая: у меня в моем коде много строк plt.plot(), и я бы предпочел не возвращаться и менять их для всех, и тогда у меня не было бы логарифмически разнесенных мелких тиков (хотя я уверен есть способ изменить это даже с помощью линейной оси).

EDIT: Я знаю this question, который имеет некоторое сходство с моим, но не то же самое. Человек в этом вопросе хочет изменить метки тика от научной формы до «нормальной» десятичной формы. Я хочу изменить метки тика от научной формы до значения логарифмического (базового 10) числа. Я уверен, что ответ будет похож на тот, который я связал, но для меня это не очевидно, как это сделать. Фактически, я рассмотрел этот вопрос, прежде чем публиковать мои, но все же решил опубликовать мой, потому что я не знал, как применить его к моей проблеме. Возможно, опытным программистам очевидно, как применять методы вопроса, которые я связал с моей ситуацией, но это не очевидно для меня, поэтому, пожалуйста, помогите мне пройти через это.

Если бы вы могли показать мне образец кода (скопировав образец кода и вставив необходимые строки), как это работает, я бы очень его оценил.

+0

Используй форматировщик http://matplotlib.org/examples/api/date_index_formatter.html –

+0

не уверен, что дата форматировщик лучшей целевая ссылка. .. @PaulH – tacaswell

+1

Используйте [шкалу журнала] (http://matplotlib.org/examples/pylab_examples/log_demo.html). Вы должны попробовать посмотреть [страницы галереи] (http://matplotlib.org/gallery.html) и найти то, что хотите. – will

ответ

1

Вы можете использовать пользовательское форматирования, например:

import matplotlib.pyplot as plt 
from matplotlib.ticker import FuncFormatter 
import numpy as np 
import math 

x=np.array([1,2,3,4,5]) 

def f(x): 
    return 10**(x-1) 

plt.plot(x,f(x)) 
plt.yscale(u'log') 

#SET CUSTORM TICK FORMATTING 
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x,y: '{}'.format(math.log(x, 10)))) 

plt.show()