如何在matplotlib中的对数轴上设置刻度

时间:2016-03-26 11:50:04

标签: python matplotlib

我正在尝试在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)

结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用set_ylim()

ax.set_ylim(20, 120)

enter image description here

这可能是使限制取决于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] 

它产生了这个情节:

enter image description here