エラーDateFormatterがx = 0の値を検出しました。これは、matplotlibバープロットで無効な日付です

2020-05-23 python matplotlib dateformatter

X軸が日付値であるmatplotlibで二重棒プロットをプロットしようとしています。 私のデータフレームは次のとおりです:

 + ------------ + ---------- + ---------- + 
 | |列A |列B | 
 + ------------ + ---------- + ---------- + 
 | 2020-03-28 | 4 | 0.0 | 
 + ------------ + ---------- + ---------- + 
 | 2020-03-29 | 250 | 58.0 | 
 + ------------ + ---------- + ---------- + 
 | 2020-03-30 | 72 | 10.0 | 
 + ------------ + ---------- + ---------- + 
 | 2020-03-31 | 10 | 0.0 | 
 + ------------ + ---------- + ---------- + 
 | 2020-04-01 | 7 | 0.0 | 
 + ------------ + ---------- + ---------- + 
 | ... | ... | ... | 
 + ------------ + ---------- + ---------- + 
 | 2020-05-12 | 6 | 0.0 | 
 + ------------ + ---------- + ---------- + 
 | 2020-05-13 | 2 | 0.0 | 
 + ------------ + ---------- + ---------- + 
 | 2020-05-14 | 9 | 0.0 | 
 + ------------ + ---------- + ---------- + 
 | 2020-05-15 | 5 | 0.0 | 
 + ------------ + ---------- + ---------- + 
 | 2020-05-16 | 35 | 1.0 | 
 + ------------ + ---------- + ---------- + 

次のコードを使用して、棒グラフでそれをプロットしたいと思います。

g.plot.bar()
ax = plt.gca()
ax.set_yscale('log')
ax.xaxis_date() 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))

最後の行は、フォーマッターをx軸の目盛りに設定することです。そうしないと、月全体のすべての日が表示されます。これを試すと、次の例外が発生します。

ValueError: DateFormatter found a value of x=0, which is an illegal date; this usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date()

私はこのエラーの多くを検索しましたが、コード/データで何が間違っているのかわかりません...

Answers

パンダはカスタム日付フォーマットをあまりうまく処理していません。
したがって、代わりに基本のmatplotlibを使用できます。
この他のSOの答えは私を助けました: https : //stackoverflow.com/a/59739281/42346

import matplotlib.pyplot as plt, numpy as np, matplotlib.dates as mdates 

x = mdates.datestr2num(g.index.strftime('%m-%d')) 
w = 0.25
fig = plt.figure(figsize=(8, 4)) 
ax = fig.add_subplot(111) 
ax.bar(x - w, g['Column A'], width=2 * w, align='center') 
ax.bar(x + w, g['Column B'], width=2 * w, align='center') 
ax.xaxis_date() 
ax.xaxis.set_major_locator(mdates.AutoDateLocator()) 
ax.xaxis.set_major_formatter(mdates.DateFormatter("%m-%d"))
plt.show()

結果:

ここに画像の説明を入力してください

Related