[解決済み] Pandasの時系列プロットでは、X軸の大小の目盛りとラベルを設定します。
質問
Pandasの時系列オブジェクトからプロットされた時系列グラフのメジャー、マイナーxticksとそのラベルを設定できるようにしたいのですが。
Pandas 0.9 "新機能"のページにはこうあります。
"to_pydatetimeを使用するか、または、コンバータを登録して Timestamp型"
が、matplotlibを使用するための方法がわかりません。
ax.xaxis.set_major_locator
と
ax.xaxis.set_major_formatter
(およびマイナー) コマンドを使用します。
pandasの時間を変換せずに使用すると、X軸の目盛りとラベルがおかしくなってしまいます。
xticks' パラメータを使用することにより、私は主要な目盛りをpandas.plotに渡すことができ、そして主要な目盛りラベルを設定することができます。この方法を使用して、マイナーな目盛りを行う方法を見つけることができません。(pandas.plotによって設定されたデフォルトのminor ticksにラベルを設定することはできます)
以下は私のテストコードです。
import pandas
print 'pandas.__version__ is ', pandas.__version__
print 'matplotlib.__version__ is ', matplotlib.__version__
dStart = datetime.datetime(2011,5,1) # 1 May
dEnd = datetime.datetime(2011,7,1) # 1 July
dateIndex = pandas.date_range(start=dStart, end=dEnd, freq='D')
print "1 May to 1 July 2011", dateIndex
testSeries = pandas.Series(data=np.random.randn(len(dateIndex)),
index=dateIndex)
ax = plt.figure(figsize=(7,4), dpi=300).add_subplot(111)
testSeries.plot(ax=ax, style='v-', label='first line')
# using MatPlotLib date time locators and formatters doesn't work with new
# pandas datetime index
ax.xaxis.set_minor_locator(matplotlib.dates.WeekdayLocator(byweekday=(1),
interval=1))
ax.xaxis.set_minor_formatter(matplotlib.dates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.xaxis.grid(False, which="major")
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('\n\n\n%b%Y'))
plt.show()
# set the major xticks and labels through pandas
ax2 = plt.figure(figsize=(7,4), dpi=300).add_subplot(111)
xticks = pandas.date_range(start=dStart, end=dEnd, freq='W-Tue')
print "xticks: ", xticks
testSeries.plot(ax=ax2, style='-v', label='second line',
xticks=xticks.to_pydatetime())
ax2.set_xticklabels([x.strftime('%a\n%d\n%h\n%Y') for x in xticks]);
# set the text of the first few minor ticks created by pandas.plot
# ax2.set_xticklabels(['a','b','c','d','e'], minor=True)
# remove the minor xtick labels set by pandas.plot
ax2.set_xticklabels([], minor=True)
# turn the minor ticks created by pandas.plot off
# plt.minorticks_off()
plt.show()
print testSeries['6/4/2011':'6/7/2011']
とその出力。
pandas.__version__ is 0.9.1.dev-3de54ae
matplotlib.__version__ is 1.1.1
1 May to 1 July 2011 <class 'pandas.tseries.index.DatetimeIndex'>
[2011-05-01 00:00:00, ..., 2011-07-01 00:00:00]
Length: 62, Freq: D, Timezone: None
<イグ
xticks: <class 'pandas.tseries.index.DatetimeIndex'>
[2011-05-03 00:00:00, ..., 2011-06-28 00:00:00]
Length: 9, Freq: W-TUE, Timezone: None
<イグ
2011-06-04 -0.199393
2011-06-05 -0.043118
2011-06-06 0.477771
2011-06-07 -0.033207
Freq: D
更新しました。 主要なxtickラベルをループで構築することで、思い通りのレイアウトに近づけることができました。
# only show month for first label in month
month = dStart.month - 1
xticklabels = []
for x in xticks:
if month != x.month :
xticklabels.append(x.strftime('%d\n%a\n%h'))
month = x.month
else:
xticklabels.append(x.strftime('%d\n%a'))
しかし、これではX軸を
ax.annotate
を使うようなもので、可能ではありますが理想的ではありません。
どのように解決するのですか?
どちらも
pandas
と
matplotlib.dates
を使う
matplotlib.units
でダニの位置を特定します。
しかし、一方で
matplotlib.dates
には目盛りを手動で設定する便利な方法がありますが、pandasは今のところ自動整形に重点を置いているようです(
のコード
をご覧ください)。
ですから、今のところ、より合理的に見えるのは
matplotlib.dates
(を使う方が合理的だと思われます(@BrenBarn氏のコメントで言及されています)。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dates
idx = pd.date_range('2011-05-01', '2011-07-01')
s = pd.Series(np.random.randn(len(idx)), index=idx)
fig, ax = plt.subplots()
ax.plot_date(idx.to_pydatetime(), s, 'v-')
ax.xaxis.set_minor_locator(dates.WeekdayLocator(byweekday=(1),
interval=1))
ax.xaxis.set_minor_formatter(dates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.yaxis.grid()
ax.xaxis.set_major_locator(dates.MonthLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n\n%b\n%Y'))
plt.tight_layout()
plt.show()
<イグ
(私のロケールはドイツ語なので、火曜日 [Tue] は Dienstag [Di] になります)
関連
-
[解決済み] pandasのプロットにxとyのラベルを追加する
-
[解決済み] Python Matplotlib Y軸の目盛りがプロットの右側に表示される。
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] pandasプロットでX軸の目盛りラベルを回転させる方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] if 節の終了方法