Matplotlib - 使用多个轴时保持纵横比

时间:2015-03-21 15:54:50

标签: python matplotlib

使用两个x轴时,如何保持绘图的纵横比?下面的代码很好地显示了宽高比25/111的图像。

import numpy as np
import matplotlib.pyplot as plt

data = np.ones((25, 111))
specFig, specAx = plt.subplots()
specAx.set_xlim([0, data.shape[1]])

#newax = specAx.twiny()
#newax.set_xlim([0, data.shape[1]])

specAx.imshow(data, origin="lower")
plt.show()

然而,当取消注释这些线时,它变成一个相当二次的图像,其第二个x轴显示从0到111的值,而第一个x轴只显示约25个值的剪切。

1 个答案:

答案 0 :(得分:2)

奇怪的是,我无法通过axis('tight')axis('scaled')等,specAx.set_aspect(aspect, adjustable='box'),关闭autoscale或其他任何内容来使轴看起来正确。我在matplotlib中遇到过类似的双轴问题,并且使用matplotlib的parasiteaxis作为解决方法,对于你的情况来说,

import numpy as np
import matplotlib.pyplot as plt

from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA

data = np.ones((25, 111))

specFig = plt.figure()
specAx = host_subplot(111, axes_class=AA.Axes)

specAx.set_xlim([0, data.shape[1]])
specAx.imshow(data, origin="lower")

#Add parasite axis
newax = specAx.get_grid_helper().new_fixed_axis
specAx.axis["top"] = newax(loc="top", axes=specAx)

plt.show()

编辑:如果需要调整顶轴,之前的解决方案可能并不理想(顶部轴不是轴对象)。我设法使用box-forced关键字设置宽高比如下:

import numpy as np
import matplotlib.pyplot as plt

data = np.ones((25, 111))
specFig, specAx = plt.subplots()
specAx.set_xlim([0, data.shape[1]])

newax = specAx.twiny()
newax.set_xlim([0, data.shape[1]])

specAx.imshow(data, origin="lower")
specAx.set_aspect('equal', 'box-forced')
newax.set_aspect('equal', 'box-forced')
plt.show()

然后你应该能够调整滴答等。