堆叠子图的对齐方式

11

编辑:

我找到了一个答案(见下文),如何在子图中对齐图像:

for ax in axes:
    ax.set_anchor('W')

我有一些数据需要使用imshow绘制。由于在x方向上很长,因此我通过在垂直堆叠的子图中绘制数据的切片来将其分成多行。我对结果感到满意,但最后一个子图(不像其他子图那么宽)我希望与其他子图左对齐。

以下代码在Python 2.7.1和matplotlib 1.2.x中进行了测试。

#! /usr/bin/env python

import matplotlib.pyplot as plt
import numpy as np

x_slice = [0,3]
y_slices = [[0,10],[10,20],[20,30],[30,35]]
d = np.arange(35*3).reshape((35,3)).T
vmin = d.min()
vmax = d.max()
fig, axes = plt.subplots(len(y_slices), 1)


for i, s in enumerate(y_slices):
    axes[i].imshow( 
        d[ x_slice[0]:x_slice[1], s[0]:s[1] ], 
        vmin=vmin, vmax=vmax,
        aspect='equal',
        interpolation='none'
    )

plt.show()

结果是

垂直堆叠的子图,最后居中

在 Zhenya 的提示下,我尝试了 axis.get/set_position。我试图将宽度减半,但我不明白它产生的效果。

for ax in axes:
    print ax.get_position()

p3 = axes[3].get_position().get_points()
x0, y0 = p3[0]
x1, y1 = p3[1]
# [left, bottom, width, height]
axes[3].set_position([x0, y0, (x1-x0)/2, y1-y0])

输入图像描述

get_position 函数可以给出每个子图的位置边界框(bbox):

for ax in axes:
    print ax.get_position()

Bbox(array([[ 0.125     ,  0.72608696],
            [ 0.9       ,  0.9       ]]))
Bbox(array([[ 0.125     ,  0.5173913 ],
            [ 0.9       ,  0.69130435]]))
Bbox(array([[ 0.125     ,  0.30869565],
            [ 0.9       ,  0.4826087 ]]))
Bbox(array([[ 0.125     ,  0.1       ],
            [ 0.9       ,  0.27391304]]))

所以所有的子图都有相同的水平范围(从0.125到0.9)。从较窄的第四个子图可以看出,子图内部的图像是居中的。

让我们来看看AxesImage对象:

for ax in axes:
    print ax.images[0]

AxesImage(80,348.522;496x83.4783)
AxesImage(80,248.348;496x83.4783)
AxesImage(80,148.174;496x83.4783)
AxesImage(80,48;496x83.4783)

再次强调,第四张图片的水平范围与之前三张相同。

接下来尝试使用AxesImage.get_extent():

for ax in axes:
    print ax.images[0].get_extent()

# [left, right, bottom, top]
(-0.5, 9.5, 2.5, -0.5)
(-0.5, 9.5, 2.5, -0.5)
(-0.5, 9.5, 2.5, -0.5)
(-0.5, 4.5, 2.5, -0.5)

右边有一个区别,但左边的值对于所有值都是相同的,那么为什么第四个是居中的呢?

编辑:它们都是居中的...


太棒了!!!非常感谢你!! - Rahul K.
3个回答

12

Axis.set_anchor目前可以使用(我只希望现在不必手动调整太多):

for ax in axes:
    ax.set_anchor('W')

在这里输入图片描述


3
您可以手动控制子图的位置,例如:
for ax in axes:
  print ax.get_position()

and

ax[3].set_position([0.1,0.2,0.3,0.4])

或者,您可能希望查看GridSpec

谢谢Zhenya,我尝试了axis.set_position,但似乎有些问题我不明白 - 请参见更新的问题。 - arose

-1

我经常发现ax.set_position很难精确调整。我更喜欢使用plt.subplots_adjust(wspace=0.005) # 调整子图之间的宽度来调整两个水平子图之间的距离。

你也可以调整垂直距离。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接