2015-08-29 2 views
2

Уважаемые Matplotlib сообщества,На Matplotlib логарифмических осях этикетки

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

По существу у меня есть ось журнала в Matplotlib с метками 10^-2, 10^-1, 10^0, 10^1, 10^2 и т.д.

Однако, хотелось бы 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]) 

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

ответ

2

Хороший способ использовать класс FuncFormatter модуля matplotlib.ticker. В сочетании с определением пользовательских функций вашего собственного создания это может помочь настроить ваши тики так, как вы хотите. Этот конкретный бит кода хорошо работает с логарифмической шкалой, используемой 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() 

Результат:

enter image description here

2

Прежде всего, вместо 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 магии (кто-нибудь знает, почему?)

+0

Отлично, спасибо очень много. В ожидании узнать дальнейшие ответы на ваш% past. –

1

Я думаю, что вы хотите 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")) 

Пример вывода: example output from log plot axis label format change

Смежные вопросы