2016-10-28 6 views
1

Я пытаюсь сделать лог-лог-график, который охватывает многие десятилетия в Matplotlib. Тем не менее, по умолчанию тиковые галочки по умолчанию, которые мне возвращают, далеки от идеала, поскольку они охватывают два десятилетия за раз, только между 4 отметками. Код, я использую следующий:Matplotlib: странные осевые оси в два десятилетия в логарифмическом графике

rc('text', usetex=True) 
f,ax=plt.subplots(figsize=(10,8)) 
plt.xscale('log') 
plt.yscale('log') 
plt.ylim([1e26,1e29]) 
plt.xlim([20,1e10]) 
plt.xlabel(r'x',fontsize=22) 
plt.ylabel(r'y',fontsize=22) 
plt.tick_params(axis='both', which='major', labelsize=22,length=9,direction='in') 
plt.tick_params(axis='both', which='minor', labelsize=22,length=5,direction='in') 
ax.yaxis.set_tick_params(right='on',which='both') 
ax.xaxis.set_tick_params(top='on',which='both') 
plt.savefig('example.pdf',bbox_inches='tight') 

изображение возвращается ко мне показано ниже:

enter image description here

Как вы можете видеть, основные х-метки оси идут от 10^3 до 10^5 и т. д. С другой стороны, между основными метками имеется только 4 младших метки оси x. Я хотел бы иметь основные лейблы каждое десятилетие, как и по оси y, со стандартными 8 тиками между каждым десятилетием. Более того, я бы идеально хотел, чтобы маркировка на оси х оставалась такой, какой есть сейчас, чтобы ось не была слишком захламлена. То есть, я хочу, чтобы 10^3, 10^5, 10^7, 10^9 были помечены так, как они есть сейчас. Я просто хочу распространять основные/мелкие тики на все десятилетия между ними.

Заранее спасибо. Кроме того, если это полезно, я использую matplotlib версии 2.0.0. Мне нужно использовать эту версию (вместо старой версии) для дополнительной функциональности, которая доступна только в версии 2.0.0.

ответ

1

Похоже, что с v2, matplotlib изменился, чтобы уменьшить количество тиков/меток, которые он рисует на логарифмических осях, охватывающих большие диапазоны. В приведенном ниже коде показан один способ добавления тиков назад.

С помощью этого кода

import pylab as plt 
import numpy as np 
from matplotlib.ticker import LogLocator 

plt.rc('text', usetex=True) 
f,ax=plt.subplots(figsize=(10,8)) 
plt.xscale('log') 
plt.yscale('log') 
plt.ylim([1e26,1e29]) 
plt.xlim([20,1e10]) 
plt.xlabel(r'x',fontsize=22) 
plt.ylabel(r'y',fontsize=22) 
plt.tick_params(axis='both', which='major', labelsize=22,length=9,direction='in') 
plt.tick_params(axis='both', which='minor', labelsize=22,length=5,direction='in') 
ax.yaxis.set_tick_params(right='on',which='both') 
ax.xaxis.set_tick_params(top='on',which='both') 

# manipulate x-axis ticks and labels 
ax.xaxis.set_major_locator(LogLocator(numticks=15)) #(1) 
ax.xaxis.set_minor_locator(LogLocator(numticks=15,subs=np.arange(2,10))) #(2) 
for label in ax.xaxis.get_ticklabels()[::2]: 
    label.set_visible(False) #(3) 

plt.savefig('example.pdf',bbox_inches='tight') 

я получаю большой клещ каждое десятилетия, 8 второстепенных клещи между основными клещами и метками осей для любого другого крупного клеща. Но поскольку я только что сделал учетную запись, чтобы опубликовать этот ответ, у меня недостаточно репутации, чтобы поделиться соответствующим образом :(

Некоторые сведения о каждой из помеченных строк (см. Пронумерованные комментарии в коде выше):

  1. Увеличивает максимальное количество разрешенных отметок. значение 15 является порогом из v1, увидеть исходный код в matplotlib/lib/matplotlib/ticker.py.
  2. Когда ось участка охватывает более чем 5 десятилетий (без документов, но см исходного кода), matplotlib v2 по умолчанию использует только малые тики при (2,4,6,8), что указывает полный диапазон незначительных тиков.
  3. Отключает каждую другую метку оси X, см., Например, this answer.
Смежные вопросы