共享不同大小的子图轴的缩放比例(不共享轴)

时间:2019-01-04 14:19:32

标签: python matplotlib scaling subplot

对于matplotlib,我想绘制两个具有相同x轴比例的图形,但是我想显示不同大小的部分。我该怎么办?

到目前为止,我可以用GridSpec绘制不同大小的子图,或者共享x轴的相同大小的子图。一次尝试这两个子图时,较小的子图具有相同的轴但比例较小,而我想要相同的比例和不同的轴,因此共享轴可能是一个错误的主意。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

x=np.linspace(0,10,100)
y=np.sin(x)

x2=np.linspace(0,5,60)
y2=np.cos(x2)

fig=plt.figure()

gs=GridSpec(2,3)

ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x,y)

ax2 = fig.add_subplot(gs[1,:-1])
    #using sharex=ax1 here decreases the scaling of ax2 too much
ax2.plot(x2,y2)

plt.show()    

我希望x.axes具有相同的缩放比例,即,相同的x值始终精确地位于彼此之上,this应该给您一个想法。较小的图的框架可以扩展或适合该图,这无关紧要。 As it is now,比例尺不匹配。

谢谢。

2 个答案:

答案 0 :(得分:1)

这仍然有些粗糙。我敢肯定有一种更优雅的方法,但是您可以在transformation的轴坐标和{{的数据坐标之间创建一个自定义ax2(请参阅Transformations Tutorial) 1}}。换句话说,您要计算与ax1的左边缘和右边缘相对应的位置处的数据值(根据ax1),然后调整{{ 1}}。

这是一个演示,即使第二个子图与第一个子图没有任何特定的对齐方式,它也可以正常工作。

ax2

enter image description here

编辑:一种可能的改进是在the xlim_changed event callback中进行转换。这样,即使在第一个轴上缩放/平移时,轴仍保持同步。

您注意到,xlim还有一个小问题,但是可以通过直接调用回调函数来轻松解决。

ax2

答案 1 :(得分:0)

我建议根据ax1的限制设置第二轴的限制。

尝试一下!

ax2 = fig.add_subplot(gs[1,:-1])
ax2.plot(x2,y2)
lb, ub = ax1.get_xlim()
# Default margin is 0.05, which would be used for auto-scaling, hence reduce that here
# Set lower bound and upper bound based on the grid size, which you choose for second plot
ax2.set_xlim(lb, ub *(2/3) -0.5)

plt.show()   

enter image description here