1. ホーム
  2. python

[解決済み] ユーザー警告 FixedFormatter は FixedLocator と一緒に使用する必要があります。

2022-03-02 19:59:26

質問

私は長い間、プロットするグラフの軸をフォーマットするために小さなサブルーチンを使ってきました。いくつか例を挙げます。

def format_y_label_thousands(): # format y-axis tick labels formats
    ax = plt.gca()
    label_format = '{:,.0f}'
    ax.set_yticklabels([label_format.format(x) for x in ax.get_yticks().tolist()])

def format_y_label_percent(): # format y-axis tick labels formats
    ax = plt.gca()
    label_format = '{:.1%}'
    ax.set_yticklabels([label_format.format(x) for x in ax.get_yticks().tolist()])

しかし、昨日matplotlibをアップデートした後、この2つの関数のいずれかを呼び出すと、次のような警告が表示されるようになりました。

UserWarning: FixedFormatter should only be used together with FixedLocator
  ax.set_yticklabels([label_format.format(x) for x in ax.get_yticks().tolist()])

このような警告が出る理由は何でしょうか?matplotlibのドキュメントを調べてもわからなかったのですが。

どうすればいいですか?

回避策

警告を回避する方法は、FixedLocator (matplotlib.ticker の一部)を使用することです。以下では、3つのチャートをプロットするコードを紹介します。それぞれの軸を異なる方法でフォーマットしています。set_ticks" は警告を消しますが、実際の目盛りの位置やラベルを変えてしまうことに注意してください (FixedLocator が同じ情報を使って目盛りの位置をそのままにすることを理解するのに少し時間がかかりました)。x/yを弄って、それぞれのソリューションが出力にどのような影響を与えるかを確認することができます。

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mticker

mpl.rcParams['font.size'] = 6.5

x = np.array(range(1000, 5000, 500))
y = 37*x

fig, [ax1, ax2, ax3] = plt.subplots(1,3)

ax1.plot(x,y, linewidth=5, color='green')
ax2.plot(x,y, linewidth=5, color='red')
ax3.plot(x,y, linewidth=5, color='blue')

label_format = '{:,.0f}'

# nothing done to ax1 as it is a "control chart."

# fixing yticks with "set_yticks"
ticks_loc = ax2.get_yticks().tolist()
ax2.set_yticks(ax1.get_yticks().tolist())
ax2.set_yticklabels([label_format.format(x) for x in ticks_loc])

# fixing yticks with matplotlib.ticker "FixedLocator"
ticks_loc = ax3.get_yticks().tolist()
ax3.yaxis.set_major_locator(mticker.FixedLocator(ticks_loc))
ax3.set_yticklabels([label_format.format(x) for x in ticks_loc])

# fixing xticks with FixedLocator but also using MaxNLocator to avoid cramped x-labels
ax3.xaxis.set_major_locator(mticker.MaxNLocator(3))
ticks_loc = ax3.get_xticks().tolist()
ax3.xaxis.set_major_locator(mticker.FixedLocator(ticks_loc))
ax3.set_xticklabels([label_format.format(x) for x in ticks_loc])

fig.tight_layout()
plt.show()

OUTPUT CHARTS(アウトプット・チャート)。

明らかに、上記のような数行のアイドルコード(私は基本的にyticksまたはxticksを取得し、それらを再び設定する)を持つことは、私のプログラムにノイズを追加するだけです。私は、この警告が削除されることを望みます。しかし、いくつかの "bug reports" (上/下のコメントのリンクから。問題は実際にはバグではありません: それはいくつかの問題を発生させているアップデートです) を調べてみてください、そして matplotlib を管理している貢献者は警告を維持する理由があります。

matplotlibの古いバージョン。 (私のように)コードの重要な出力を制御するためにコンソールを使用している場合、警告メッセージは問題となる可能性があります。したがって、この問題に対処するのを遅らせる方法は、matplotlib をバージョン 3.2.2 にダウングレードすることです。私はPythonのパッケージを管理するためにAnacondaを使用していますが、matplotlibをダウングレードするために使用するコマンドは以下の通りです。

conda install matplotlib=3.2.2

リストアップされたすべてのバージョンが使用できるとは限りません。例えば、matplotlib 3.3.0 は matplotlib のリリースページに掲載されていますが、インストールできませんでした。 https://github.com/matplotlib/matplotlib/releases