Matplotlibを使用してPythonで時間をプロットする


163

(HH:MM:SS.mmmmmm)形式のタイムスタンプの配列と、それぞれがタイムスタンプ配列の値に対応する浮動小数点数の別の配列があります。

Matplotlibを使用して、x軸に時間、y軸に数値をプロットできますか?

私は試みましたが、どういうわけかそれは浮動小数点数の配列のみを受け入れていました。どうすれば時間をプロットできますか?何らかの方法で形式を変更する必要がありますか?

回答:


178

最初にタイムスタンプをPython datetimeオブジェクトに変換する必要があります(を使用datetime.strptime)。次に、を使用date2numして、日付をmatplotlib形式に変換します。

次を使用して日付と値をプロットしますplot_date

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)

2
それは日付をプロットするのか、それとも単に時間をプロットするのか?私は唯一の日時への変換には、年が1990年に設定されているので、時間たい
randomThought

「...日時に変換すると、年は1990に設定されます」:文字列から日時に変換するために使用するコードを投稿していただけませんか?変換に問題がある可能性があります。再 チャートラベルのフォーマットについては、JKSeppänenが提供するdate_demo1リンクを参照してください。ところで、matplot libのドキュメントはすばらしいです。matplotlib.sourceforge.net/index.html
codeape 2009年

14
plot_dates-> matplotlib.pyplot.plot_date(dates、values)
Pete

3
散布図はどうですか?散布泡のサイズを決定するためにサイズ配列を提供したいのですが、同等のはなくscatter_date()、このグラフを取得する明白な/直接的な方法もありません。
dwanderson 2016年

4
上記は、matplotlib.lines.Line2Dオブジェクトタイプの1つのオブジェクトを含むリストを返します。これを使用してグラフを表示するにはどうすればよいですか?
Arindam Roychowdhury

87

pyplot.plotを使用して、タイムスタンプと値のペアをプロットすることもできます(文字列表現から解析した後で)ます。(matplotlibバージョン1.2.0および1.3.1でテスト済み。)

例:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

結果の画像:

ラインプロット


これは散布図と同じです:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.scatter(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

次のような画像を生成します。

散布図


4
@andiそれはちょうど私の例(変更のように動作するはずplotscatter)。
moooeeeep 2014

1
なぜこれが私が遭遇した5番目の質問で、散布図を使用して実際にTRIED実行したことがないのかがわかりません。うまくいきません。Type Error - invalid type promotion
dwanderson 2016年

1
@dwanderson次に、何か間違っているのかもしれません。datetime.datetimex軸にオブジェクトがある散布図の例を投稿に追加しました。
moooeeeep 2016年

グリッドの追加plt.grid(True)
Christophe Roussy

1
@AimForClarityはmatplotlib.__version__2.2.2で動作します。ただし、散布図には、デフォルトで非常に広いx制限がいくつか設定されています。この回答は手動で調整する以外の回避策を提供するようですplt.xlim(...)stackoverflow.com/a/46467896/1025391
moooeeeep

23

7年後、このコードは私を助けました。しかし、私の時間はまだ正しく表示されていませんでした。

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

Matplotlib 2.0.0を使用していて、Paul Hによるmatplotlibのx軸目盛りラベルの日付フォーマットの編集から次のコードを追加する必要がありました。

import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)

形式を(%H:%M)に変更し、時刻が正しく表示されるようにしました。 ここに画像の説明を入力してください

コミュニティに感謝します。


16

matplotlibバージョン2.0.2を使用してこれで問題が発生しました。上から例を実行すると、中央に積み重ねられた泡のセットが得られました。

中央に配置された泡のスタックを使用したグラフ

別の行を追加して問題を「修正」しました。

plt.plot([],[])

コード全体は次のようになります。

import datetime
import random
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


# make up some data
x = [datetime.datetime.now() + datetime.timedelta(minutes=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot([],[])
plt.scatter(x,y)

# beautify the x-labels
plt.gcf().autofmt_xdate()
myFmt = mdates.DateFormatter('%H:%M')
plt.gca().xaxis.set_major_formatter(myFmt)

plt.show()
plt.close()

これにより、必要に応じて泡が分布した画像が生成されます。

経時的に分布したバブルのグラフ


py2.6では動作しません。ValueError:ビュー制限の最小値-0.05500000000000001は1未満であり、無効なMatplotlib日付値です。これは、日時以外の値を日時単位を持つ軸に渡す場合によく発生します<図のサイズが432x288、1つの軸>
AimForClarity

:奇妙なX-LIMSを解決するには、自分でそれらを設定することですstackoverflow.com/questions/21423158/...
Qaswed
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.