我绘制了两个数据集,y轴上的单位不同。有没有办法使刻度线和网格线在两个y轴上对齐?
第一张图片显示了我得到的东西,第二张图片显示了我想要得到的东西。
这是我用来绘图的代码:
import seaborn as sns
import numpy as np
import pandas as pd
np.random.seed(0)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(pd.Series(np.random.uniform(0, 1, size=10)))
ax2 = ax1.twinx()
ax2.plot(pd.Series(np.random.uniform(10, 20, size=10)), color='r')
8条答案
按热度按时间ltskdhd11#
我不确定这是否是最好的方法,但它确实用一行来解决它:
7ivaypg92#
我可以通过在网格轴中停用
ax.grid(None)
来解决这个问题:fcipmucu3#
我写了这个函数,它接受Matplotlib轴对象ax1,ax2,并浮动minresax1minresax2:
它计算并设置刻度,以便有七个刻度。最低刻度对应于当前最低刻度,并增加最高刻度,使得每个刻度之间的间隔是minrexax1或minrexax2的整数倍。
为了使其通用,您可以通过将您看到的任何
7
更改为滴答总数,并将6
更改为滴答总数减1来设置所需的滴答总数。我在matplotlib.ticer.LinearLocator中加入了一个pull请求:
https://github.com/matplotlib/matplotlib/issues/6142
在未来(Matplotlib 2.0也许?),试试:
这应该可以工作,并为两个y轴选择方便的刻度。
cwdobuhd4#
我创建了一个方法来对齐多个y轴的刻度线(可能超过2),在不同的轴上可能有不同的比例。
下面是示例图:
有3个y轴,左边一个蓝色,右边一个绿色和一个红色。将3条曲线绘制在y轴上,并绘制相应颜色。请注意,它们都具有非常不同的数量级。
*左图:没有对齐。
*中间图:在(近似)每个y轴的下限对齐。
*右图:以指定值对齐:
0
表示蓝色,2.2*1e8
表示红色,44
表示绿色。这些都是任意选择的。我所做的是将每个y数组缩放到1-100的范围内,然后将所有缩放的y值合并到一个数组中,使用
MaxNLocator
从这个数组中创建一组新的刻度。然后,使用相应的缩放因子对这组新的刻度进行缩放,以获得每个轴的新刻度。如果需要一些特定的对齐,则y阵列在缩放之前移位,并且在缩放之后向后移位。完整的代码在这里(关键函数是
alignYaxes()
):yc0p9oo05#
此代码将确保两个轴的网格彼此对齐,而不必隐藏任何一个轴的网格线。在本例中,它允许您匹配具有更细网格线的任何一条。这是基于@Leo的想法。希望有帮助!
mefy6pfw6#
如果使用轴标签,Leo的解决方案可以push them off the side,这是由于刻度中数字的精确性。
所以除了类似Leo的解决方案(这里重复)之外,
您可以使用
autolayout
设置,如this answer中所述;例如,在脚本的前面,您可以更新rcParams
:在一些测试用例中,这似乎产生了预期的结果,输出中完全包含了排列的刻度和标签。
rdrgkggo7#
我有同样的问题,除了这是一个次要的x轴。我通过设置第二个x轴等于主轴的极限来解决。下面的例子没有设置第二个x轴等于第一个x轴的极限:
ax2 = ax.twiny()
一旦我将第二个轴的极限设置为等于第一个
ax2.set_xlim(ax.get_xlim())
,这里是我的结果:k4aesqcs8#
1.固定两个轴的限制(从任意数字到任意数字)
1.将两个轴分成相同的n个部分