Skip to content

FixedFormatter と FixedLocator の警告

この記事では、matplotlib で UserWarning: FixedFormatter should only be used together with FixedLocator という警告が表示される原因とその解決方法について詳しく説明します。

問題の原因

この警告は、matplotlib のバージョンアップに伴って導入されたもので、軸ラベルを設定する際の適切な使用方法を促すものです。

python
# 警告が発生するコード例
def format_y_label_thousands():
    ax = plt.gca()
    label_format = '{:,.0f}'
    ax.set_yticklabels([label_format.format(x) for x in ax.get_yticks().tolist()])

matplotlib の公式ドキュメントによると、FixedFormatterFixedLocator と組み合わせてのみ使用すべきであり、そうしないとラベルが正確な位置に配置される保証がないため、この警告が表示されます。

解決方法

方法1: FixedLocator を明示的に使用する

最も正式な解決方法は、FixedLocator を明示的に使用することです。

python
import matplotlib.ticker as ticker

def format_y_label_thousands():
    ax = plt.gca()
    label_format = '{:,.0f}'
    
    # 現在のティック位置を取得
    ticks_loc = ax.get_yticks().tolist()
    
    # FixedLocator を使用してティック位置を設定
    ax.yaxis.set_major_locator(ticker.FixedLocator(ticks_loc))
    
    # ラベルを設定
    ax.set_yticklabels([label_format.format(x) for x in ticks_loc])

方法2: set_ticks を先に呼び出す

より簡潔な方法として、set_ticks() を先に呼び出してから set_ticklabels() を呼ぶ方法もあります。

python
def format_y_label_thousands():
    ax = plt.gca()
    label_format = '{:,.0f}'
    
    # まずティック位置を設定
    ax.set_yticks(ax.get_yticks().tolist())
    
    # その後でラベルを設定
    ax.set_yticklabels([label_format.format(x) for x in ax.get_yticks().tolist()])

TIP

この方法は内部で自動的に FixedLocator が使用されるため、警告が表示されなくなります。

方法3: tick_params を使用する

回転などの書式設定のみを行う場合は、tick_params() メソッドを使用するのがより適切です。

python
# 警告が発生するコード
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)

# 改善後のコード
ax.tick_params(axis='x', labelrotation=45)

方法4: プロットの順序を確認する

ラベル設定をデータプロットの前に行っている場合、ティック位置が正しく設定されていない可能性があります。

python
# 誤った順序
ax.set_xticklabels(labels)  # プロット前にラベル設定
plt.boxplot(data)           # その後でプロット

# 正しい順序
plt.boxplot(data)           # まずプロット
ax.set_xticklabels(labels)  # その後でラベル設定

よくある使用例

ヒートマップでのカラーバーラベル回転

python
import seaborn as sns

# 警告が発生するコード
heatmap = sns.heatmap(data, annot=True)
cbar = heatmap.collections[0].colorbar
cbar.ax.set_yticklabels(cbar.ax.get_yticklabels(), rotation=90)

# 改善後のコード
heatmap = sns.heatmap(data, annot=True)
cbar = heatmap.collections[0].colorbar
cbar.ax.tick_params(axis='y', labelrotation=90)

日付ティックのフォーマット

python
import matplotlib.dates as mdates

# 正しい使用方法
ax.xaxis.set_major_locator(mdates.DayLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

注意点

WARNING

警告を無視することはお勧めしません。この警告は、ラベルが誤った位置に表示される可能性があることを知らせています。

どうしても警告を抑制する必要がある場合は、以下の方法がありますが、根本的な解決にはなりません。

python
import warnings
warnings.filterwarnings("ignore")

まとめ

FixedFormatter should only be used together with FixedLocator 警告は、matplotlib がより正確なラベル配置を保証するために導入されたものです。適切な解決方法を選択することで、警告を解消しつつ、意図した通りの可视化を実現できます。

  • FixedLocator を明示的に使用する
  • set_ticks()set_ticklabels() を適切な順序で使用する
  • 単純な書式設定には tick_params() を使用する
  • プロットとラベル設定の順序に注意する

これらの方法を適切に使い分けることで、警告なく美しいグラフを作成できます。