カスタマイズされた日時インデックスを表示するグループ化された棒グラフを作成したいと思います。完全な日付ではなく、月と年だけを表示します。バーをグループ化して積み重ねないようにしたい。
私はパンダがこれを簡単に処理できると思いました:
import pandas as pd
import matplotlib.pylab as plt
import matplotlib.dates as mdates
testdata = pd.DataFrame({"A": [1, 2, 3]
,"B": [2, 3, 1]
, "C": [2, 3, 1]}
,index=pd.to_datetime(pd.DatetimeIndex(
data=["2019-03-02", "2019-04-01","2019-05-01"])))
ax = testdata.plot.bar()
これにより、必要なプロットが作成されます。これまでの日付を、2019年3月、2019年4月、2019年5月などのより単純なものに変更したいと思います。
カスタム日付フォーマッターを使用すると機能すると思いましたので、試してみました
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
しかし、私のレーベルが完全になくなったよりも。そして、この質問は、パンダとDateFormatterが少し難しい関係にあることを意味します。したがって、私はMatplotlibの基本でそれをやろうとしました:
fig, ax = plt.subplots()
width = 0.8
ax.bar(testdata.index, testdata["A"])
ax.bar(testdata.index, testdata["B"])
ax.bar(testdata.index, testdata["C"])
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
plt.show()
これで、日付の表現は期待どおりになりましたが(空白を減らすことはできますが)、データが重複しているため、役に立ちません。
私が使用しているDateTime-Indexのため、幅を定義してx値から減算しても(通常は提案されているように)役に立ちません。DatetimeIndesとfloatの減算がサポートされていないというエラーが表示されます。
fig, ax = plt.subplots()
width = 0.8
ax.bar(testdata.index-width, testdata["A"])
ax.bar(testdata.index, testdata["B"])
ax.bar(testdata.index+width, testdata["C"])
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
plt.show()
だから今、私はアイデアが不足していて、入力を望んでいます
ax.xaxis.set_major_locator(mdates.MonthLocator())
フードの下でパンダがバーをプロットしrange(len(df))
、それに応じてティックの名前を変更するため、理由は失敗します。
プロット後にxticklabelsを取得し、再フォーマットできます。
ax = testdata.plot.bar()
ticks = [tick.get_text() for tick in ax.get_xticklabels()]
ticks = pd.to_datetime(ticks).strftime('%b %Y')
ax.set_xticklabels(ticks)
これは、ImpotanceOfBeingErnestと同じ結果になります。
別の、おそらくより良い方法は、各列のバーをシフトすることです。これは、列が多く、xtickの数を減らしたい場合に効果的です。
fig, ax = plt.subplots()
# define the shift
shift = pd.to_timedelta('1D')
# modify the base of each columns, can do with a for loop
ax.bar(testdata.index + shift, testdata["A"])
ax.bar(testdata.index, testdata["B"])
ax.bar(testdata.index - shift, testdata["C"])
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
plt.show()
出力:
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加