Как заставить matplotlib расширить диапазон хотя бы на два тика - PullRequest
0 голосов
/ 14 мая 2018

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

То, что я хочу сделать, - это автоматически расширить диапазон Y до тех пор, пока не будет включено по крайней мере два тика, включая один основной тик (поэтому он получает метку). Я не могу ничего сделать с ручным или пользовательским режимом, потому что через эту процедуру проходит много разных данных, и лишь в редких случаях диапазон настолько узок, что никаких меток не появляется.

Вот пример, который сохраняет как можно больше моего локального окружения:

import matplotlib
import numpy as np
import pylab as plt

fig=plt.figure(figsize=(15, 20))
locmin = matplotlib.ticker.LogLocator(base=10.0,subs=(.1,.2,.3,.4,.5,.6,.7,.8,.9),numticks=15)

ax6 = plt.subplot(616)
plt.plot(np.random.random(1000)*4+14, 'b')
plt.plot(np.random.random(1000)*4+14, 'r')
plt.minorticks_on()
plt.ylabel('Y')
plt.yscale('log')

ax6.yaxis.set_minor_locator(locmin)
ax6.yaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())
plt.show()

enter image description here В результате получается этот график, на котором нет меток Y ...

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете получить массив major_ticks и minor_ticklocs.Затем найдите границы для заданных масштабированных пределов y.Тогда вы можете явно установить ylim графика.Поскольку значения в примере масштабируются между 10 и 20, отображаются 10 из major_ticks и 20 из minor_ticks.Рассмотрим код ниже:

import matplotlib
import numpy as np
import pylab as plt

fig=plt.figure(figsize=(15, 20))
locmin = matplotlib.ticker.LogLocator(base=10.0,subs=(.1,.2,.3,.4,.5,.6,.7,.8,.9),numticks=15)

ax6 = plt.subplot(616)
plt.plot(np.random.random(1000)*4+14, 'b')
plt.plot(np.random.random(1000)*4+14, 'r')
plt.minorticks_on()
plt.ylabel('Y')
plt.yscale('log')

ax6.yaxis.set_minor_locator(locmin)
ax6.yaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())
plt.tick_params(axis='y', which='minor')
ax6.yaxis.set_minor_formatter(matplotlib.ticker.FormatStrFormatter("%.1f"))

tickArr = np.concatenate((plt.yticks()[0], ax6.yaxis.get_minorticklocs()))
ylim_min = tickArr[tickArr < plt.ylim()[0]].max()
ylim_max = tickArr[tickArr > plt.ylim()[1]].min()

plt.ylim([ylim_min, ylim_max])
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...