На matplotlib логарифмические оси метки



Уважаемое сообщество matplotlib,



У меня есть очень быстрый вопрос относительно маркировки логарифмической оси, на который, я уверен, один из вас мог бы ответить в любой момент.



По существу у меня есть логарифмическая ось в matplotlib с метками 10^-2, 10^-1, 10^0, 10^1, 10^2 etc



Тем не менее, я хотел бы 0.01, 0.1, 1, 10, 100.



Может ли кто-нибудь направлять меня в этом. Я попробовал несколько вариантов, таких как:



ax.set_xticks([0.01,0.1,1,10,100])

ax.set_xlabels([0.01,0.1,1,10,100])


Любые профессиональные советы будут очень признательны!

645   3  

3 ответов:

Хороший способ-использовать класс FuncFormatter matplotlib.модуль ИНФОРМЕР. В сочетании с пользовательским определением функции собственного изготовления это может помочь настроить ваши тики точно так, как вы хотите. Этот конкретный бит кода хорошо работает с логарифмической шкалой, используемой matplotlib.

import numpy as np
import matplotlib.pylab as plt

x = np.linspace(-10,10)
y = np.exp(x)

plt.close('all')

fig,ax = plt.subplots(1,1)
ax.plot(x,y,'bo')
ax.set_yscale('log')

#Placed the import/function definitions here to emphasize
#the working lines of code for this particular task.
from matplotlib.ticker import FuncFormatter

def labeller(x, pos):
    """
    x is the tick value, pos is the position. These args are needed by 
    FuncFormatter.
    """

    if x < 1:
        return '0.'+'0'*(abs(int(np.log10(x)))-1)+\
                format(x/10**(np.floor(np.log10(x))),'.0f')
    else:
        return format(x,'.0f')

#FuncFormatter class instance defined from the function above
custom_formatter = FuncFormatter(labeller)

ax.yaxis.set_major_formatter(custom_formatter)
plt.show()

Результат:

Введите описание изображения здесь

Во-первых, вместо set_xlabels Вы должны вызвать set_xticklabels для фактических меток тика. Тем не менее, по крайней мере, в моей текущей среде (python 2.7, matplotlib 1.4.3, OS X 10.10) этого не всегда достаточно. При выполнении инструкции инструкцией в REPL (например, ipython) иногда необходимо обновить ось после вызова set_xticklabels. Быстрый хак для этого-просто позвонить grid(True) или grid(False). Например:

x = np.logspace(-2,2, 1000)
y = np.sin(x)

l = [0.01,0.1,1,10,100]

plt.semilogx(x,y)
plt.gca().set_xticks(l)
plt.gca().set_xticklabels(l)
plt.grid(True)

Эмпирическое Примечание: трюк grid(False), кажется, не нужен при вставке этой сути используя оболочкой IPython по %paste волшебство (кто-нибудь знает почему?)

Я думаю, что вы хотите ax.xaxis.set_major_formatter(FormatStrFormatter("%g")), как в:

x=[0.1,1,10,100,1000]
y=[-1,0,1,2,3]
fig,ax=plt.subplots()
ax.plot(x,y,'.-')
ax.set_xscale('log')
ax.xaxis.set_major_formatter(FormatStrFormatter("%g"))

Пример вывода: пример вывода из журнала изменение формата метки оси графика

Comments

    Ничего не найдено.