matplotlib 1.5无法对齐网格线

时间:2015-11-24 18:58:15

标签: python matplotlib

我最近升级到matplotlib v1.5。我开始看到的是twinx图表开始无法对齐网格线,即使我手动设置了yaxis刻度。

我使用Anaconda v.2.4和Python 2.7。

编辑:2015-11-25,根据@ali_m的建议,我在GitHub上提交了关于此here的票据。

E.g:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = [x + 0.5 for x in range(10)]
z = [(y+0.0)/10-0.004 for y in range(10)]

df1 = pd.DataFrame({'x': x})
df2 = pd.DataFrame({'z': z})

fig, ax = plt.subplots()
# plot something with ax
df1.plot(ax=ax)

# plot second dataframe on secondary y
ax2 = ax.twinx()
df2.plot(ax=ax2)

print('Before setting ax ticks (not ax2)')
print('ax ticks', ax.get_yticks())
print('ax2 ticks', ax2.get_yticks())
print('ax2 ybound', ax2.get_ybound())

# manually set the number of ticks for both axes to match 
ticks = ax.get_yticks()
dis = ticks[-1] - ticks[-2]
# left axis has less ticks then right by default
for _ in range(len(ax2.get_yticks()) - len(ax.get_yticks())):
    ticks = np.append(ticks, ticks[-1] + dis)
# print('ticks', ticks)
# comment out this line below to NOT set ticks
ax.yaxis.set_ticks(ticks)

print('After setting ax ticks (not ax2)')
print('ax ticks', ax.get_yticks())
print('ax2 ticks', ax2.get_yticks())
print('ax2 ybound', ax2.get_ybound())

输出:

# you can see here that the number of ticks matched for both axes.

Before setting ticks
ax ticks [  0.   2.   4.   6.   8.  10.]
ax ybound (0.0, 10.0)
ax2 ticks [-0.2  0.   0.2  0.4  0.6  0.8  1.   1.2]
ax2 ybound (-0.20000000000000001, 1.0000000000000002)
After setting ticks
ax ticks [  0.   2.   4.   6.   8.  10.  12.  14.]
ax ybound (0.0, 14.0)
ax2 ticks [-0.2  0.   0.2  0.4  0.6  0.8  1.   1.2]
ax2 ybound (-0.20000000000000001, 1.0000000000000002)

但是,在绘图中,右轴ax2的最后一个刻度线未显示,即最大值停留在1.0,而不是1.2如上面的印刷品所示。

编辑 - 请注意,我手动设置了ax的刻度,而不是ax2,问题发生在ax2 enter image description here

问题1:为什么最后一个勾号没有显示在右轴上?

编辑:感谢@DilithiumMatrix& @ali_m,我现在看到设置标记不会更新限制或边界。但是,这个问题发生在右轴上,其极限和边界是通过df2.plot(ax=ax2)自动设置的。 也许有人可以评论如何设置限制的逻辑&边界自动工作?

问题2:有关如何让网格线再次匹配的任何建议?

编辑我通过手动设置上部ybound找出了一个黑客,它重新排列了网格线...

ax.set_ybound(upper=max(ax.get_yticks()))
ax2.set_ybound(upper=max(ax2.get_yticks()))

事实上,我只是试图用这些 WITHOUT 来设置勾号,你仍然会遇到同样的问题。

编辑:添加图片以显示默认ax2行为,而不更改ax的标记。

Default <code>ax2</code> behaviour still does not show 1.2 tick

1 个答案:

答案 0 :(得分:2)

我不确定为什么这种行为只是从matplotlib v1.5开始,因为对齐不同轴的网格线从来就不是一个功能(据我所知)。但是,您似乎遇到的问题是设置y 限制。拨打set_yticks(内部调用yaxis.set_ticks方法),设置限制 - 只需设置“定位器”即可。的蜱虫。如果要设置轴的边界,则需要显式调用其中一个方法,在本例中为ax.set_ylimax.set_ybound

增加:
刻度标记总是很奇怪/很难搞乱。这些天我倾向于做事的方式是始终非常明确地处理它们。将限制设置为特定值,将刻度设置为特定值。不要指望默认定义的刻度标记是您天真期望的。