我最近升级到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
。
问题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
的标记。
答案 0 :(得分:2)
我不确定为什么这种行为只是从matplotlib v1.5开始,因为对齐不同轴的网格线从来就不是一个功能(据我所知)。但是,您似乎遇到的问题是设置y 限制。拨打set_yticks
(内部调用yaxis.set_ticks
方法),不设置限制 - 只需设置“定位器”即可。的蜱虫。如果要设置轴的边界,则需要显式调用其中一个方法,在本例中为ax.set_ylim
或ax.set_ybound
。
增加:
刻度标记总是很奇怪/很难搞乱。这些天我倾向于做事的方式是始终非常明确地处理它们。将限制设置为特定值,将刻度设置为特定值。不要指望默认定义的刻度标记是您天真期望的。