2

我用 matplotlib 的ImageGrid助手类创建了一个图。下面是代码:

from mpl_tookits.axes_grid1 import ImageGrid
from matplotlib.pyplot import *

fig = figure(figsize=(20, 12), dpi=300)
grid = ImageGrid(fig, 111, nrows_ncols=(3, 4), axes_pad=1, aspect=False)
for gridax, (i, sub) in zip(grid, enumerate(eyelink_data)):
    subnum = i + start_with

     # format data
    xdat = sub['x'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())]
    ydat = sub['y'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())]

    # plot
    gridax.hist2d(xdat, ydat, bins=[np.linspace(-.005, .005, num=1000), np.linspace(-.005, .005, num=1000)])
    gridax.plot(0, 0, 'ro')  # origin

show()

我查看了这个食谱页面以获取有关如何为整个图形设置单个 x 和 y 标签的信息,但这些食谱似乎仅适用于具有标准子图的标准图形。

我还看了一些mpl_toolkits.axes_grid1.axes_divider.LocatableAxes's 的方法,但没有任何反应。 中的方法同上mpl_toolkits.axes_grid1.axes_grid.ImageGrid

有谁知道我如何使用ImageGrid?

4

1 回答 1

2

这个 github 拉取请求中,我尝试了图形范围 x 和 y 标签的可能实现(我很高兴我不是唯一一个想要拥有这种功能的人。

这段代码概括了 PR 实现的要点并生成了这个图。针对今天(18.03.2013)获取的 matplotlib master 进行了测试。

from mpl_toolkits.axes_grid1 import ImageGrid
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(20, 12))
grid = ImageGrid(fig, 111, nrows_ncols=(3, 4), axes_pad=1, aspect=False)

#get the extent of the largest box containing all the axes/subplots
extents = np.array([a.get_position().extents for a in grid])  #all axes extents
bigextents = np.empty(4)   
bigextents[:2] = extents[:,:2].min(axis=0)
bigextents[2:] = extents[:,2:].max(axis=0)

#text to mimic the x and y label. The text is positioned in the middle 
labelpad=0.08  #distance between the external axis and the text
xlab_t = fig.text((bigextents[2]+bigextents[0])/2, bigextents[1]-labelpad, 'x label',
    horizontalalignment='center', verticalalignment = 'bottom')
ylab_t = fig.text( bigextents[0]-labelpad, (bigextents[3]+bigextents[1])/2, 'y label',
    rotation='vertical', horizontalalignment = 'left', verticalalignment = 'center')

如果您以交互方式工作或想要封装在一个函数/类中,您可以在绘制新标签之前摆脱旧[xy]lab_t.set_visible(False)标签(有一个text.remove()方法但尚未实现)。

使用这种方法有几个注意事项:

  1. 不适用于plt.tight_layout:这是因为此方法特定于subplotsmatplotlib.Figure对象

  2. 几个月前,有一个想法/公关artists在保存数字时包含所有内容bbox_inches='tight',但我不知道这个状态。

于 2013-03-18T13:13:24.823 回答