[解決済み] ユーザー警告 FixedFormatter は FixedLocator と一緒に使用する必要があります。
質問
私は長い間、プロットするグラフの軸をフォーマットするために小さなサブルーチンを使ってきました。いくつか例を挙げます。
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
関連
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] を付けるべきでしょうか?(shebang)を付けるべきか、またどのような形で付けるべきか?
-
[解決済み] Pythonのdictsで'has_key()'と'in'のどちらを使うべきですか?
-
[解決済み] Pythonの終了コマンド - なぜこんなにたくさんあるのか、そしてそれぞれはいつ使うべきなのか?
-
[解決済み] カットオフまたはオーバーラップするラベルでパディングを調整する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
opencvとpillowを用いた顔認証システム(デモあり)
-
python call matlab メソッドの詳細
-
python string splicing.join()とsplitting.split()の説明
-
Python Decorator 練習問題
-
python implement mysql add delete check change サンプルコード
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない