我最近升级到matplotlib v1.5。我开始看到的是,即使当我手动设置yaxis时,twinx绘图开始也无法对齐网格线。
我在Python2.7中使用Anaconda v.2.4。
编辑: 2015-11-25,按照@ali_m的建议,我提交了一张关于 这里 on GitHub.的罚单。
例如:
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)然而,当在图中,右轴1.0**,的最后一个勾号没有显示,也就是说,的最大值停留在,而不是** 1.2 ,如上面打印出来的.。
ax**,编辑-注意,我手动为设置了滴答,而不是**,问题发生在** 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()))实际上,我只是尝试绘制这些,而不使用手动设置刻度,您仍然会遇到相同的问题。
编辑:添加一张图片来显示默认的ax2行为,而不改变ax的刻度。

发布于 2015-11-24 19:39:44
我不知道为什么这种行为只从matplotlib v1.5开始,因为对不同轴的网格线从来都不是一个特性(据我所知)。然而,似乎你所面临的问题是设定y的限制。调用set_yticks (内部调用yaxis.set_ticks方法),而不是设置限制--它只是设置滴答的“定位器”。如果要设置轴的界限,则需要显式调用这些方法之一,在本例中为ax.set_ylim或ax.set_ybound。
增添:
勾痕总是很奇怪/很难弄乱。这些天我倾向于做事情的方式是总是非常明确地处理它们。将限制设置为特定值,将滴答设置为特定值。不要指望默认定义的勾标是你天真地期望的。
https://stackoverflow.com/questions/33901668
复制相似问题