我正在尝试在matplotlib中的对数y轴上绘制漂亮的刻度(标量不是指数)。一般来说,我希望从那里包含第一个值(在此示例中为100
)。但在某些情况下,我会得到不同的代码,如下所示。我没有发现如何管理它的线索。是否有一种简单的方法来强制matplotlib以特定值开始并自动选择合理的代码(在此示例中120, 110, 100, 90, 80, 70, 60, 50, 40, 30, 20
会很好)。
我的代码:
from matplotlib.ticker import ScalarFormatter, MaxNLocator
x = range(11)
y = [ 100., 91.3700879 , 91.01104689, 58.91189746,
46.99501432, 55.3816625 , 37.49715841, 26.55818469,
36.34538328, 37.7811044 , 47.45953131]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_yscale('log')
ax.yaxis.set_major_locator(MaxNLocator(nbins=11, steps=[1,2,3,4,5,6,7,8,9,10]))
ax.yaxis.set_major_formatter(ScalarFormatter())
ax.plot(x,y)
结果:
答案 0 :(得分:1)
您可以使用set_ylim()
:
ax.set_ylim(20, 120)
这可能是使限制取决于y数据而不是硬连线的一种方法:
ymax = round(max(y), -1) + 10
ymin = max(round(min(y), -1) - 10, 0)
ax.set_ylim(ymin, ymax)
您可以使用ax.set_yticks()
强制刻度线位置:
ymax = round(max(y), -1) + 20
ymin = max(round(min(y), -1) - 10, 0)
ax.set_ylim(ymin, ymax)
ax.set_yticks(range(int(ymin), int(ymax) + 1, 10))
ax.plot(x,y)
有关:
y = [ 100. , 114.088362 , 91.14833261, 109.33399855, 73.34902925,
76.43091996, 56.84863363, 65.34297117, 78.99411287, 70.93280065,
55.03979689]
它产生了这个情节: