【Matplotlib】table.Cell.set_transform()のエラー解消とデバッグ手法

2025-05-31

matplotlib.table.Cell.set_transform() は、Matplotlibのテーブル内の特定のセルに描画される要素の座標変換を設定するためのメソッドです。

Matplotlibでは、描画されるすべての要素(テキスト、線、図形など)は、最終的に画面上のピクセル座標に変換されます。この変換の過程には、いくつかの異なる座標系が関わっています。

  • ディスプレイ座標系 (Display coordinates): 画面上の実際のピクセルに基づいた座標系。
  • Figure座標系 (Figure coordinates): Figure全体の左下を(0,0)、右上を(1,1)とする正規化された座標系。
  • Axes座標系 (Axes coordinates): 各Axes(サブプロット)の左下を(0,0)、右上を(1,1)とする正規化された座標系。
  • データ座標系 (Data coordinates): プロットしているデータの実際の値に基づいた座標系。

set_transform(trans) メソッドは、trans パラメータとして matplotlib.transforms.Transform オブジェクトを受け取ります。この Transform オブジェクトは、セルのコンテンツがどの座標系に基づいて描画されるかを決定します。

具体的な意味と使用例

通常、matplotlib.table.Cell オブジェクトは、デフォルトでそのセルが属するAxestransData(データ座標系)またはtransAxes(Axes座標系)を継承しています。しかし、set_transform() を使うことで、このデフォルトの変換を上書きし、セルの内容を異なる座標系で配置したり、独自のカスタム変換を適用したりすることができます。

使用例

例えば、テーブル内のセルのテキストをAxes全体に対する相対位置で固定したい場合、ax.transAxes を使うことができます。

import matplotlib.pyplot as plt
from matplotlib.table import Table
import numpy as np

fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)

# テーブルを作成
table_data = [['A1', 'B1'], ['A2', 'B2']]
table = Table(ax, bbox=[0.1, 0.1, 0.8, 0.4]) # bboxはAxes座標系でテーブルの範囲を指定

for (i, j), val in np.ndenumerate(np.array(table_data)):
    cell = table.add_cell(i, j, 0.5, 0.5, text=val, loc='center')
    # 例えば、特定のセルのテキストをAxes座標系の左上 (0.1, 0.9) に強制的に配置したい場合
    if i == 0 and j == 0:
        cell.set_transform(ax.transAxes) # ここで変換を設定
        cell.get_text().set_position((0.1, 0.9)) # Axes座標系での位置を設定
        cell.get_text().set_ha('left')
        cell.get_text().set_va('top')
    else:
        # デフォルトの変換(通常はデータ座標系)
        pass

ax.add_table(table)
plt.show()

この例では、セル(0,0)のテキストの変換をax.transAxesに設定しています。これにより、そのテキストはAxesの左上隅に固定され、Axesのズームやパンによってデータ座標が変化しても、Axesの表示領域に対する相対位置は変わりません。

Matplotlibでは、描画されるすべてのアーティスト(Artistクラスのインスタンス)は、その描画位置やサイズを決定するための「変換 (transform)」を持っています。この変換によって、データ値が画面上のピクセルにどのようにマッピングされるかが決まります。

table.Cell.set_transform() を使用することで、以下のようなことが可能になります。

  1. 異なる座標系での要素の配置
    セルの内容をデータ座標系ではなく、Axes座標系やFigure座標系、またはディスプレイ座標系など、別の座標系で配置できます。これにより、ズームやパンに影響されない固定された要素を作成できます。
  2. カスタム変換の適用
    独自の変換ロジックを持つカスタム Transform オブジェクトを作成し、それをセルに適用することで、より複雑な配置や効果(例: 歪んだテキスト、非線形な配置など)を実現できます。
  3. 柔軟なレイアウト
    テーブルのセルは通常、テーブル自体のレイアウトに従いますが、set_transform() を使用することで、個々のセルの内容をそのレイアウトから独立させて配置する柔軟性が得られます。


よくあるエラーと問題

    • 原因
      set_transform() で設定した変換と、その後のテキストや他のアーティストのset_position()set_xy()などのメソッドで指定する座標が、互いに矛盾しているか、異なる座標系で解釈されている。

    • cell.set_transform(ax.transAxes)を設定したにも関わらず、cell.get_text().set_position((10, 20))のようにデータ座標系で数値を指定してしまっている。
    • トラブルシューティング
      • set_transform()で設定した変換の種類(ax.transAxesax.transDatafig.transFigureなど)と、それに続く位置指定メソッドで使う座標値の解釈を一致させます。
      • 例えば、ax.transAxesを設定した場合、位置はAxesの左下(0,0)から右上(1,1)の範囲で指定する必要があります。
      • cell.get_text().get_transform()を使って、実際にテキストがどの変換を使っているかを確認することも有効です。
  1. テキストや図形がセルからはみ出す、または表示されない

    • 原因
      • set_transform()によって設定された変換が、セルの描画領域(Bounding Box)と合致していない。
      • 特に、ax.transData以外の変換を使う場合、セルの物理的なサイズとは異なる座標系で描画されるため、クリッピングされる可能性があります。
      • clip_on=True(デフォルト)の場合、アーティストはAxesの境界内でクリッピングされます。
    • トラブルシューティング
      • Artist.set_clip_on(False)を呼び出して、セルのコンテンツのクリッピングを無効にすることを検討してください。ただし、これは他の要素との重なりなどの問題を引き起こす可能性もあります。
      • セルのサイズ(width, height)と、set_transform()で設定した変換後のコンテンツのサイズや位置が適切であることを確認します。必要に応じてセルのサイズを調整します。
  2. table.Tableの初期設定との衝突

    • 原因
      table.Tableは、セルテキストの配置や整列(loc引数など)に関する独自のロジックを持っています。set_transform()でカスタム変換を設定すると、これらのデフォルトのロジックと衝突する可能性があります。
    • トラブルシューティング
      • set_transform()を使用する場合、cell.get_text().set_position()cell.get_text().set_ha()(水平方向の整列)、cell.get_text().set_va()(垂直方向の整列)などを明示的に設定して、配置を完全に制御する必要があります。テーブルのデフォルトの整列設定は無視されると考えるべきです。
  3. 描画順序の問題(Z-order)

    • 原因
      複数のアーティストが同じ領域に描画される場合、Z-order(描画の重なり順序)によって表示が異なります。set_transform()自体が直接Z-orderを変更するわけではありませんが、変換によって要素が重なることで問題が顕在化することがあります。
    • トラブルシューティング
      • Artist.set_zorder()を使用して、セルのコンテンツや他のアーティストの描画順序を調整します。Z-orderの値が大きいほど手前に描画されます。
  4. set_transform()後に変更が反映されない

    • 原因
      Matplotlibは、描画を最適化するために内部でキャッシュを使用することがあります。set_transform()を呼び出した後、すぐにその変更が画面に反映されない場合があります。
    • トラブルシューティング
      • 通常はplt.show()fig.canvas.draw()fig.canvas.flush_events()などを呼び出すことで描画が更新されます。
      • インタラクティブモードを使用している場合は、変更を加えた後に明示的な描画コマンドが必要な場合があります。
  • 最小限の再現可能な例 (Minimal Reproducible Example - MRE) の作成
    問題が発生した場合、複雑なコードから問題の部分だけを切り出して、最小限のコードで再現できる例を作成します。これにより、問題の原因を特定しやすくなります。

  • 各アーティストのtransform属性の確認
    print(cell.get_text().get_transform())のようにして、各アーティストが現在どの変換を使用しているかを確認します。

  • 境界ボックスの可視化
    セルの境界ボックスやテキストの境界ボックスを可視化することで、どこに何が描画されているかを理解するのに役立ちます。

    import matplotlib.patches as mpatches
    # セルの境界ボックスを表示
    cell_bbox = cell.get_bbox()
    rect = mpatches.Rectangle((cell_bbox.x0, cell_bbox.y0), cell_bbox.width, cell_bbox.height,
                               facecolor='none', edgecolor='red', linewidth=1, transform=ax.transData) # または適切な変換
    ax.add_patch(rect)
    
    # テキストの境界ボックスを表示
    text = cell.get_text()
    text_bbox = text.get_window_extent(fig.canvas.get_renderer()) # ディスプレイ座標系
    # これをデータ座標系に戻すには、テキストの変換を逆変換する必要があります
    # inverse_transform = text.get_transform().inverted()
    # text_bbox_data = text_bbox.transformed(inverse_transform)
    # rect_text = mpatches.Rectangle((text_bbox_data.x0, text_bbox_data.y0), text_bbox_data.width, text_bbox_data.height,
    #                                facecolor='none', edgecolor='blue', linewidth=1, transform=ax.transData)
    # ax.add_patch(rect_text)
    

    (テキストの境界ボックスをデータ座標系に戻すのは少し複雑なので、上記の例は簡略化しています。通常はget_window_extent()で得られるディスプレイ座標系の境界ボックスを直接利用することは少ないです。)



例1: セルのテキストをAxes座標系に固定する

この例では、テーブルの最初のセルのテキストをAxes(サブプロット)の左上隅に固定します。これにより、Axesのズームやパンを行っても、テキストはAxesの表示領域に対する相対位置を保ちます。

import matplotlib.pyplot as plt
from matplotlib.table import Table
import numpy as np

fig, ax = plt.subplots(figsize=(8, 6))

# ダミーのプロットデータ
ax.plot(np.random.rand(10), np.random.rand(10), 'o')
ax.set_title("Table with Custom Transformed Cell")
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)

# テーブルデータ
table_data = [['Header 1', 'Header 2', 'Header 3'],
              ['Row 1, Col 1', 'Row 1, Col 2', 'Row 1, Col 3'],
              ['Row 2, Col 1', 'Row 2, Col 2', 'Row 2, Col 3']]

# テーブルを作成 (bboxはAxes座標系でテーブルの全体的な位置とサイズを指定)
# bbox=[left, bottom, width, height]
table = Table(ax, bbox=[0.1, 0.6, 0.8, 0.3]) # Axesの0.1から0.9まで、高さ0.3の範囲にテーブルを配置

# セルを追加
for i, row_data in enumerate(table_data):
    for j, cell_text in enumerate(row_data):
        # width, heightはセル内のコンテンツが占める相対的な幅と高さ
        # loc='center'はセルの内容を中央に配置
        cell = table.add_cell(row=i, col=j, width=1/len(row_data), height=1/len(table_data),
                              text=cell_text, loc='center')

        if i == 0 and j == 0: # 最初のセル (Header 1)
            # ここが重要: セルのテキストの変換をAxes座標系に設定
            cell.get_text().set_transform(ax.transAxes)
            # Axes座標系での位置を指定 (左下0,0、右上1,1)
            cell.get_text().set_position((0.05, 0.95)) # Axesの左上近く
            cell.get_text().set_ha('left') # 水平方向の配置
            cell.get_text().set_va('top')  # 垂直方向の配置
            cell.get_text().set_color('red')
            cell.get_text().set_fontweight('bold')
            cell.set_facecolor('lightblue')
        elif i == 0: # ヘッダー行
            cell.set_facecolor('lightgray')
            cell.get_text().set_fontweight('bold')

# テーブルをAxesに追加
ax.add_table(table)

# プロット表示
plt.show()

解説

  • set_ha('left'), set_va('top'): テキストのアンカーポイントを設定します。positionで指定した点がテキストの左上になるように配置されます。
  • cell.get_text().set_position((0.05, 0.95)): Axes座標系なので、x=0.05はAxesの左端から5%、y=0.95はAxesの下端から95%の位置を意味します。
  • cell.get_text().set_transform(ax.transAxes): これにより、このセルのテキストの描画はデータ座標系ではなく、Axes座標系(ax.transAxes)に切り替わります。

このコードを実行し、グラフをズームイン・アウトしても、"Header 1" のテキストは常にAxesの左上隅の近くに表示され続けることが確認できます。他のセルはテーブルのレイアウトに従って表示されます。

例2: セルのテキストをFigure座標系に固定する

今度は、テーブルの特定のセルのテキストをFigure(グラフ全体)の座標系に固定してみましょう。これは、複数のサブプロットがあっても、常に図の特定の場所にテキストを表示したい場合に便利です。

import matplotlib.pyplot as plt
from matplotlib.table import Table
import numpy as np

fig, axs = plt.subplots(1, 2, figsize=(10, 5)) # 2つのサブプロットを作成

# 最初のサブプロット
axs[0].plot(np.sin(np.linspace(0, 2*np.pi, 100)))
axs[0].set_title('Subplot 1')

# 2番目のサブプロット
axs[1].plot(np.cos(np.linspace(0, 2*np.pi, 100)))
axs[1].set_title('Subplot 2')

# テーブルデータ
table_data = [['Info', 'Value'],
              ['A', '10'],
              ['B', '20']]

# テーブルを作成 (Axesの0.5から0.8まで、高さ0.2の範囲に配置)
# ここではaxs[0]に関連付けますが、set_transformでFig座標系を使うため、
# 実際の位置はFigure全体に対する相対位置になります。
table = Table(axs[0], bbox=[0.5, 0.1, 0.4, 0.2])

for i, row_data in enumerate(table_data):
    for j, cell_text in enumerate(row_data):
        cell = table.add_cell(row=i, col=j, width=0.5, height=1/len(table_data),
                              text=cell_text, loc='center')

        if i == 0 and j == 0: # 最初のセル ("Info")
            # ここが重要: セルのテキストの変換をFigure座標系に設定
            cell.get_text().set_transform(fig.transFigure)
            # Figure座標系での位置を指定 (左下0,0、右上1,1)
            cell.get_text().set_position((0.02, 0.98)) # Figure全体の左上近く
            cell.get_text().set_ha('left')
            cell.get_text().set_va('top')
            cell.get_text().set_color('blue')
            cell.get_text().set_fontsize(14)
            cell.set_facecolor('lightgreen')

# テーブルを最初のAxesに追加 (Axesに属するが、テキストはFigure座標系で描画される)
axs[0].add_table(table)

plt.tight_layout() # サブプロットのレイアウトを調整
plt.show()

解説

  • cell.get_text().set_position((0.02, 0.98)): Figureの左端から2%、上端から2%の位置(右上98%)に配置されます。
  • cell.get_text().set_transform(fig.transFigure): このセル内のテキストは、Figure全体の座標系で配置されます。これは、サブプロットのレイアウトやサイズが変更されても、テキストはFigure全体の特定の場所に固定されることを意味します。

この例では、"Info" テキストが、どのサブプロットに属するテーブルであっても、Figure全体の左上隅に固定されているのがわかります。

matplotlib.transformsモジュールを使って、より複雑なカスタム変換を作成することもできます。ここでは、テキストを少し傾けるアフィン変換を適用する例を示します。

import matplotlib.pyplot as plt
from matplotlib.table import Table
import numpy as np
import matplotlib.transforms as mtransforms

fig, ax = plt.subplots(figsize=(7, 5))
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_title("Cell Text with Custom Transform (Shear)")

table_data = [['Hello', 'World'],
              ['Custom', 'Transform']]

table = Table(ax, bbox=[0.1, 0.5, 0.8, 0.4])

for i, row_data in enumerate(table_data):
    for j, cell_text in enumerate(row_data):
        cell = table.add_cell(row=i, col=j, width=0.5, height=0.5,
                              text=cell_text, loc='center')

        if i == 1 and j == 0: # "Custom" のセル
            # アフィン変換行列を作成: y軸に沿ってx方向を少し傾ける (シア変換)
            # [1  shear_x_y]
            # [0      1    ]
            # (これは簡略化されたシア変換です。より複雑な変換も可能です。)
            shear_transform = mtransforms.Affine2D().skew_deg(30, 0) # X軸方向を30度傾ける

            # 元のセルのテキストの変換 (通常はax.transData) とカスタム変換を結合
            # set_transform()は元の変換を置き換えるので、結合することで元の位置関係を維持しつつ変換を適用
            combined_transform = ax.transData + shear_transform
            cell.get_text().set_transform(combined_transform)
            cell.get_text().set_color('purple')
            cell.get_text().set_fontsize(12)
            cell.get_text().set_fontweight('bold')
            cell.set_facecolor('lightyellow')

ax.add_table(table)
plt.show()

解説

  • ax.transData + shear_transform: これは非常に重要な概念です。元のデータ座標系への変換(ax.transData)に、カスタムのシア変換を追加しています。これにより、テキストはまずデータ座標系に配置され、その上でシア変換が適用されます。set_transform() は既存の変換を置き換えるため、この結合操作がなければテキストが予期せぬ位置に飛んでいってしまいます。
  • mtransforms.Affine2D().skew_deg(30, 0): 30度X軸方向にテキストを傾けるアフィン変換を作成します。

この例では、"Custom" のテキストが少し傾いて表示されるはずです。

table.Cell.set_transform()は、Matplotlibのテーブル内の特定の要素の描画座標系を柔軟に制御するための強力なツールです。

  • カスタム変換: matplotlib.transformsモジュールを使って独自の変換(回転、拡大縮小、平行移動、シアなど)を作成し、結合することができます。
  • ax.transData: データ座標系。これがデフォルトの変換です。データプロットに合わせて要素が移動・拡大縮小します。
  • fig.transFigure: Figure全体の左下を(0,0)、右上を(1,1)とする正規化された座標系。複数のサブプロットがある場合でも、Figure全体に対する相対位置に要素を固定したい場合に便利です。
  • ax.transAxes: Axes(サブプロット)の左下を(0,0)、右上を(1,1)とする正規化された座標系。Axesのズームやパンに影響されずに、Axesに対する相対位置に要素を固定したい場合に便利です。


matplotlib.table.Table の loc および bbox 引数を使用する

テーブル全体の配置を制御する場合、Table クラスのコンストラクタや plt.table() 関数で提供される loc および bbox 引数を使用することが最も一般的で推奨される方法です。

  • bbox (bounding box): Axes 座標系におけるテーブルの正確な位置とサイズを [left, bottom, width, height] の形式で指定します。loc よりも詳細な制御が可能です。

    • 例: table = Table(ax, bbox=[0.1, 0.1, 0.8, 0.4]) (Axesの左下(0.1,0.1)から始まり、幅0.8、高さ0.4の範囲にテーブルを配置)
  • loc (location): Axes 内でのテーブルの相対的な位置を決めます。文字列で指定します。

    • 'upper right', 'upper left', 'lower right', 'lower left'
    • 'center', 'top', 'bottom', 'left', 'right'
    • 例: table = Table(ax, loc='upper right')

なぜこれが代替になるのか?

set_transform() が個々のセル内のコンテンツの座標系を制御するのに対し、locbbox はテーブル全体を Axes 内のどの座標系で配置するかを決定します。多くの場合、個々のセルのコンテンツはテーブル全体の配置に従っていれば十分であり、個別の変換は不要です。

import matplotlib.pyplot as plt
from matplotlib.table import Table

fig, ax = plt.subplots(figsize=(6, 4))
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_title("Table positioned with bbox")

table_data = [['A', 'B'], ['C', 'D']]

# テーブル全体をAxesの特定のbbox内に配置
# 個々のセルのテキストには明示的なset_transform()は不要
table = Table(ax, bbox=[0.2, 0.6, 0.6, 0.3]) # Axesの[0.2, 0.6]から始まる領域に配置

for i, row_data in enumerate(table_data):
    for j, cell_text in enumerate(row_data):
        cell = table.add_cell(i, j, width=0.5, height=0.5, text=cell_text, loc='center')
        cell.set_facecolor(f'C{i+j}')

ax.add_table(table)
plt.show()

Cell.get_text().set_position() および set_ha()/set_va() を使用する

set_transform() を使用せずとも、セルのテキストの位置や整列を調整したい場合は、Cell オブジェクトが持つテキストアーティストのプロパティを直接操作できます。

  • cell.get_text().set_verticalalignment(va) (set_va() のエイリアス): テキストの垂直方向の整列 ('top', 'bottom', 'center', 'baseline') を設定します。
  • cell.get_text().set_horizontalalignment(ha) (set_ha() のエイリアス): テキストの水平方向の整列 ('left', 'center', 'right') を設定します。
  • cell.get_text().set_position((x, y)): テキストのアンカーポイントを設定します。デフォルトでは、この(x, y)はセルの内部座標(通常はセルの左下を(0,0)、右上を(1,1)とするような相対座標、またはデータ座標)で解釈されます。

なぜこれが代替になるのか?

多くの場合、テキストをセルの特定の位置に配置する目的は、set_transform() を使って座標系を変更するよりも、単に整列プロパティを調整することで達成できます。例えば、セルの中央にテキストを置きたいなら、loc='center' を使うか、set_ha('center')set_va('center') を組み合わせるのが一般的です。

import matplotlib.pyplot as plt
from matplotlib.table import Table

fig, ax = plt.subplots(figsize=(6, 4))
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_title("Cell Text Alignment without set_transform()")

table_data = [['Top Left', 'Center'], ['Bottom Right', 'Custom']]

table = Table(ax, bbox=[0.1, 0.1, 0.8, 0.5])

for i, row_data in enumerate(table_data):
    for j, cell_text in enumerate(row_data):
        cell = table.add_cell(i, j, width=0.5, height=0.5, text=cell_text)

        if i == 0 and j == 0:
            cell.get_text().set_ha('left')
            cell.get_text().set_va('top')
            cell.set_facecolor('lightcoral')
        elif i == 0 and j == 1:
            cell.get_text().set_ha('center')
            cell.get_text().set_va('center')
            cell.set_facecolor('lightgreen')
        elif i == 1 and j == 0:
            cell.get_text().set_ha('right')
            cell.get_text().set_va('bottom')
            cell.set_facecolor('lightblue')
        elif i == 1 and j == 1:
            # セル内の相対位置でテキストを移動
            # デフォルトの変換 (セル内の相対座標系) を利用
            cell.get_text().set_position((0.2, 0.8)) # セルの左下から20%, 下端から80%
            cell.get_text().set_ha('left')
            cell.get_text().set_va('top')
            cell.set_facecolor('lightgoldenrodyellow')

ax.add_table(table)
plt.show()

table.Table の scale() メソッドを使用する

テーブル全体のサイズを調整したい場合、table.Table.scale(xscale, yscale) メソッドを使用できます。これはテーブルのすべての列幅と行高さをスケーリングします。

なぜこれが代替になるのか?

set_transform() は個々のセルのテキストのサイズや位置に影響を与えるカスタムなスケーリングを可能にしますが、テーブル全体の見た目を変更するだけであれば、scale() を使う方が簡単で意図が明確です。

import matplotlib.pyplot as plt
from matplotlib.table import Table

fig, ax = plt.subplots(figsize=(6, 4))
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_title("Table Scaled with scale() method")

table_data = [['A', 'B'], ['C', 'D']]

table = Table(ax, bbox=[0.1, 0.1, 0.8, 0.5])

for i, row_data in enumerate(table_data):
    for j, cell_text in enumerate(row_data):
        cell = table.add_cell(i, j, width=0.5, height=0.5, text=cell_text, loc='center')

# テーブル全体を水平方向に1.2倍、垂直方向に1.5倍に拡大
table.scale(1.2, 1.5)

ax.add_table(table)
plt.show()

テキストがセル内に収まらない場合や、フォントサイズを調整したい場合、これらのメソッドが有効です。

  • table.set_fontsize(size): テーブル内のすべてのセルのテキストのフォントサイズを設定します。
  • table.auto_set_column_width(col): 指定された列の幅を、その列のコンテンツに合わせて自動調整します。

なぜこれが代替になるのか?

set_transform() を使ってテキストのサイズを直接変換することも可能ですが、これらのメソッドは Matplotlib が用意している標準的なテキスト調整機能であり、通常はこちらを使う方が直感的です。

import matplotlib.pyplot as plt
from matplotlib.table import Table

fig, ax = plt.subplots(figsize=(7, 4))
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_title("Auto-set Column Width and Font Size")

table_data = [['Short', 'A Very Long Column Header Indeed'],
              ['Data 1', 'Some more data that is quite long']]

table = Table(ax, bbox=[0.1, 0.1, 0.8, 0.5])

for i, row_data in enumerate(table_data):
    for j, cell_text in enumerate(row_data):
        cell = table.add_cell(i, j, width=0.5, height=0.5, text=cell_text, loc='center')

# フォントサイズを小さく設定
table.set_fontsize(10)

# 0列目と1列目の幅を自動調整
table.auto_set_column_width(col=list(range(len(table_data[0]))))

ax.add_table(table)
plt.show()

table.Cell.set_transform() は非常に強力で、特定の高度なカスタマイズ(例:テキストの傾斜、 Axes や Figure の特定のピクセル位置に固定された要素の配置など)には不可欠です。しかし、ほとんどの一般的なテーブルのレイアウトやテキストの配置の調整には、上記で説明したような、よりシンプルで直感的な Matplotlib の標準機能で十分です。