График журнала журнала Matplotlib не отображает все основные и второстепенные галочки при использовании логлокатора и различных ограничениях x и y

#python #matplotlib #axis-labels

Вопрос:

Я создаю график журнала журнала и использую matplotlib. Я использую логлокатор, чтобы убедиться, что отображаются соответствующие основные и второстепенные галочки. Тем не менее, я заметил, что, когда пределы x и y различаются, некоторые галочки и метки галочек и отсутствуют: (см. рисунок)

Ниже приведен простой пример, который приводит к такому нежелательному поведению. Любая помощь будет очень признательна.

 import matplotlib.pyplot as plt
import numpy as np
import matplotlib

Npoints=100
xs=np.logspace(-8,0, 100)
ys=xs

fig=plt.figure(figsize=(4,3))
ax=fig.add_subplot(111)
ax.plot(xs, ys)
ax.set_xscale('log')
ax.set_yscale('log')

locmaj = matplotlib.ticker.LogLocator(base=10,numticks=100) 
locmin = matplotlib.ticker.LogLocator(base=10,subs=np.arange(2, 10) * .1,numticks=100) # subs=(0.2,0.4,0.6,0.8)

ax.yaxis.set_major_locator(locmaj)
ax.yaxis.set_minor_locator(locmin)
ax.yaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())

ax.xaxis.set_major_locator(locmaj)
ax.xaxis.set_minor_locator(locmin)
ax.xaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())

ax.set_xlim(1.0e-3, 1.0)
ax.set_ylim(1.0e-8, 1.0)

plt.show()
 

Ответ №1:

В общем случае Locator экземпляры не следует повторно использовать на разных осях. Из Locator документов:

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

Таким образом, для вашего графика, когда вы повторно используете локаторы на оси x, они изменяют галочки на оси y нежелательным образом. Чтобы исправить это. вы должны создать отдельный экземпляр каждого LogLocator из них для использования на каждой оси. Например:

 import matplotlib.pyplot as plt
import numpy as np
import matplotlib

Npoints=100
xs=np.logspace(-8,0, 100)
ys=xs

fig=plt.figure(figsize=(4,3))
ax=fig.add_subplot(111)
ax.plot(xs, ys)
ax.set_xscale('log')
ax.set_yscale('log')

locmajx = matplotlib.ticker.LogLocator(base=10,numticks=100) 
locminx = matplotlib.ticker.LogLocator(base=10,subs=np.arange(2, 10) * .1,numticks=100) # subs=(0.2,0.4,0.6,0.8)
locmajy = matplotlib.ticker.LogLocator(base=10,numticks=100) 
locminy = matplotlib.ticker.LogLocator(base=10,subs=np.arange(2, 10) * .1,numticks=100) # subs=(0.2,0.4,0.6,0.8)

ax.yaxis.set_major_locator(locmajy)
ax.yaxis.set_minor_locator(locminy)
ax.yaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())

ax.xaxis.set_major_locator(locmajx)
ax.xaxis.set_minor_locator(locminx)
ax.xaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())

ax.set_xlim(1.0e-3, 1.0)
ax.set_ylim(1.0e-8, 1.0)

plt.show()
 

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