Pandas棒グラフが日付の書式を変更する
質問
私は、以下のコードを使用するときに魔法のように設定したい日付フォーマットを正確に持つ単純な積み重ねられた折れ線グラフを持っています。
df_ts = df.resample("W", how='max')
df_ts.plot(figsize=(12,8), stacked=True)
<イグ
しかし、同じデータを棒グラフでプロットすると、不思議なことに日付が醜く読めない形式に変わってしまいます。
df_ts = df.resample("W", how='max')
df_ts.plot(kind='bar', figsize=(12,8), stacked=True)
<イグ
元のデータを少し変形させて、週単位の最大値を持たせています。自動的に設定される日付に、なぜこのような急激な変化が起こるのでしょうか?どうしたら上記のようなきれいな書式の日付になるのでしょうか?
ここにいくつかのダミーデータがあります。
start = pd.to_datetime("1-1-2012")
idx = pd.date_range(start, periods= 365).tolist()
df=pd.DataFrame({'A':np.random.random(365), 'B':np.random.random(365)})
df.index = idx
df_ts = df.resample('W', how= 'max')
df_ts.plot(kind='bar', stacked=True)
どのように解決するのですか?
プロットコードは、棒グラフの各棒がそれ自身のラベルに値すると仮定しています。 あなた自身のフォーマッタを指定することによって、この仮定を上書きすることができます。
ax.xaxis.set_major_formatter(formatter)
は
pandas.tseries.converter.TimeSeries_DateFormatter
は、Pandasが
でうまく動作します。
線プロット
でうまく動作します。
X値が日付の場合、折れ線グラフはうまくいきます。しかし
バープロット
では、x値(少なくとも
が受け取る
TimeSeries_DateFormatter.__call__
が受け取るもの) は単なる整数です。
で始まる
ゼロから
. もし
TimeSeries_DateFormatter
を棒グラフで使おうとすると、すべてのラベルが 1970-1-1 UTC というエポックから始まるので、これはゼロに対応する日付だからです。ですから、折れ線グラフに使われるフォーマッタは、残念ながら棒グラフには役に立ちません。
(少なくとも私が見る限り)。
望ましい書式を生成するために私が見た最も簡単な方法は、ラベルを明示的に生成し設定することです。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
start = pd.to_datetime("5-1-2012")
idx = pd.date_range(start, periods= 365)
df = pd.DataFrame({'A':np.random.random(365), 'B':np.random.random(365)})
df.index = idx
df_ts = df.resample('W', how= 'max')
ax = df_ts.plot(kind='bar', x=df_ts.index, stacked=True)
# Make most of the ticklabels empty so the labels don't get too crowded
ticklabels = ['']*len(df_ts.index)
# Every 4th ticklable shows the month and day
ticklabels[::4] = [item.strftime('%b %d') for item in df_ts.index[::4]]
# Every 12th ticklabel includes the year
ticklabels[::12] = [item.strftime('%b %d\n%Y') for item in df_ts.index[::12]]
ax.xaxis.set_major_formatter(ticker.FixedFormatter(ticklabels))
plt.gcf().autofmt_xdate()
plt.show()
日付を使った棒グラフの簡単な例を探している人のために。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
dates = pd.date_range('2012-1-1', '2017-1-1', freq='M')
df = pd.DataFrame({'A':np.random.random(len(dates)), 'Date':dates})
fig, ax = plt.subplots()
df.plot.bar(x='Date', y='A', ax=ax)
ticklabels = ['']*len(df)
skip = len(df)//12
ticklabels[::skip] = df['Date'].iloc[::skip].dt.strftime('%Y-%m-%d')
ax.xaxis.set_major_formatter(mticker.FixedFormatter(ticklabels))
fig.autofmt_xdate()
# fixes the tracker
# https://matplotlib.org/users/recipes.html
def fmt(x, pos=0, max_i=len(ticklabels)-1):
i = int(x)
i = 0 if i < 0 else max_i if i > max_i else i
return dates[i]
ax.fmt_xdata = fmt
plt.show()
関連
-
[解決済み] matplotlib でプロットをクリアするために cla()、clf() または close() をいつ使うか?
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] Pandasのカラム名のリネーム
-
[解決済み] Pandas DataFrameからカラムを削除する
-
[解決済み] Pandasのデータフレームで複数の列を選択する
-
[解決済み] Pandas DataFrameの行数を取得する方法は?
-
[解決済み] Matplotlibでプロットを表示するのではなく、画像ファイルに保存する。
-
[解決済み] Matplotlib で凡例をプロットの外側に配置する方法
-
[解決済み】Pandas DataFrameのカラムヘッダからリストを取得する。
-
[解決済み】pandasでカラムの種類を変更する
最新
-
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 実装 サイバーパンク風ボタン