当我有一个窄范围的数据和日志格式时,我无法显示任何刻度线。我找到一个similar problem谈论强制最小数量的滴答并尝试了解决方案,但它似乎没有帮助。
我想要做的是让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()
答案 0 :(得分:1)
您可以获得major_ticks
和minor_ticklocs
的数组。然后找到给定的缩放y限制的边界。然后,您可以显式设置绘图的ylim
。由于示例中的值在10到20之间,因此显示了major_ticks中的10和minor_ticks中的20。请考虑以下代码:
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()