#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()