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みましたが、何も飛び出しませんでした。 のメソッドと同じmpl_toolkits.axes_grid1.axes_grid.ImageGridです。

誰かが私がこれを使用してこれを行う方法を知っていますImageGridか?

4

1 に答える 1

2

このgithub プル リクエストでは、図全体の x および y ラベルの可能な実装を試しました (そのような機能を持ちたいと思っているのは私だけではないことを嬉しく思います。

このコードは、PR 実装の要点を要約し、この図を生成します。今日 (18.03.2013) 取得した matplotlib マスターに対してテストされています。

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: これは、このメソッドがsubplotsnot tomatplotlib.Figureオブジェクトに固有のものであるためです。

  2. 数か月前にartists、 で図を保存するときにすべてを含めるというアイデア/PR がありましたbbox_inches='tight'が、これのステータスはわかりません。

于 2013-03-18T13:13:24.823 に答える