web-dev-qa-db-ja.com

matplotlibを使用してx軸の特定の日付に対してデータをプロットする方法

日付と値のペアで構成されるデータセットがあります。 x軸に特定の日付を含む棒グラフにそれらをプロットしたいと思います。

私の問題は、matplotlibxticksを日付範囲全体に分散することです。また、ポイントを使用してデータをプロットします。

日付はすべてdatetimeオブジェクトです。データセットのサンプルは次のとおりです。

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123),
        (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678),
        (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987),
        (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)]

pyplotを使用した実行可能なコードサンプルを次に示します。

import datetime as DT
from matplotlib import pyplot as plt

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123),
        (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678),
        (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987),
        (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)]

x = [date for (date, value) in data]
y = [value for (date, value) in data]

fig = plt.figure()

graph = fig.add_subplot(111)
graph.plot_date(x,y)

plt.show()

質問の概要:
私の状況は、Axesインスタンスの準備ができている(上記のコードではgraphによって参照されている)ようなもので、次のことを実行したいと思います。

  1. xticksを正確な日付値に対応させます。 matplotlib.dates.DateLocatorについて聞いたことがありますが、それを作成して特定のAxesオブジェクトに関連付ける方法がわかりません。
  2. 使用されているグラフのタイプ(棒、線、点など)をより厳密に制御します。
17
Kit

あなたがしていることは十分に単純なので、plot_dateよりもplotを使用するのが最も簡単です。 plot_dateはより複雑なケースに最適ですが、必要な設定はそれなしで簡単に実行できます。

例:上記の例に基づく:

_import datetime as DT
from matplotlib import pyplot as plt
from matplotlib.dates import date2num

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123),
        (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678),
        (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987),
        (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)]

x = [date2num(date) for (date, value) in data]
y = [value for (date, value) in data]

fig = plt.figure()

graph = fig.add_subplot(111)

# Plot the data as a red line with round markers
graph.plot(x,y,'r-o')

# Set the xtick locations to correspond to just the dates you entered.
graph.set_xticks(x)

# Set the xtick labels to correspond to just the dates you entered.
graph.set_xticklabels(
        [date.strftime("%Y-%m-%d") for (date, value) in data]
        )

plt.show()
_

棒グラフが必要な場合は、 plt.bar() を使用してください。線とマーカーのスタイルを設定する方法を理解するには、 plt.plot()マーカーの場所に日付ラベルを付けてプロットするhttp://www.geology.wisc.edu/~)を参照してください。 jkington/matplotlib_date_labels.png

31
Joe Kington