На 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])
Любые профессиональные советы будут очень признательны!
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волшебство (кто-нибудь знает почему?)


Comments