196

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

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

私はしようとしていましたが、どういうわけかそれはフロートの配列しか受け入れていませんでした。どうすれば時間をプロットできますか?フォーマットを変更する必要がありますか?

4

5 に答える 5

210

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

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

import matplotlib.pyplot
import matplotlib.dates

from datetime import datetime

x_values = [datetime(2021, 11, 18, 12), datetime(2021, 11, 18, 14), datetime(2021, 11, 18, 16)]
y_values = [1.0, 3.0, 2.0]

dates = matplotlib.dates.date2num(x_values)
matplotlib.pyplot.plot_date(dates, y_values)

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

于 2009-10-15T18:18:26.013 に答える
101

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()

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

散布図

于 2013-05-07T20:30:05.907 に答える
36

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

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

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

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

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

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

于 2017-07-13T21:05:01.137 に答える
25

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()

これにより、バブルが希望どおりに分散された画像が生成されます。

時間の経過とともに分布する気泡のグラフ

于 2017-09-28T11:21:40.110 に答える
3

パンダのデータフレームについてはまだ言及されていません。これらが私の日時の問題をどのように解決したかを示したかったのです。ミリ秒までの日時があります2021-04-01 16:05:37。/procからlinux/haproxyスループットを引き出しているので、好きなようにフォーマットできます。これは、ライブグラフアニメーションにデータをフィードするのに便利です。

csvを見てみましょう。(別のグラフで使用している1秒あたりのパケット数の列は無視してください)

head -2 ~/data
date,mbps,pps
2021-04-01 16:05:37,113,9342.00
...

を使用print(dataframe.dtype)すると、データがどのように読み込まれたかを確認できます。

(base) ➜  graphs ./throughput.py
date      object
mbps      int64
pps       float64
dtype:    object

Pandasは、日付文字列を「オブジェクト」としてプルします。これは、charと入力するだけです。スクリプトでこれをそのまま使用する:

import matplotlib.pyplot as plt
import pandas as pd

dataframe = pd.read_csv("~/data")

dates = dataframe["date"]
mbps = dataframe["mbps"]

plt.plot(dates, mbps, label="mbps")
plt.title("throughput")
plt.xlabel("time")
plt.ylabel("mbps")
plt.legend()
plt.xticks(rotation=45)

plt.show()

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

Matplotlibは、すべてのミリ秒時間データをレンダリングします。plt.xticks(rotation=45)日付を傾けるために追加しましたが、それは私が望むものではありません。日付「オブジェクト」をdatetime64[ns]に変換できます。どのmatplotlibがレンダリング方法を知っていますか。

dataframe["date"] = pd.to_datetime(dataframe["date"]) 

今回は私の日付はタイプですdatetime64[ns]

(base) ➜  graphs ./throughput.py
date    datetime64[ns]
mbps             int64
pps            float64
dtype:          object

1行の違いがある同じスクリプト。

#!/usr/bin/env python
import matplotlib.pyplot as plt
import pandas as pd

dataframe = pd.read_csv("~/data")

# convert object to datetime64[ns]
dataframe["date"] = pd.to_datetime(dataframe["date"]) 

dates = dataframe["date"]
mbps = dataframe["mbps"]

plt.plot(dates, mbps, label="mbps")
plt.title("throughput")
plt.xlabel("time")
plt.ylabel("mbps")
plt.legend()
plt.xticks(rotation=45)

plt.show()

これはあなたのユースケースには理想的ではなかったかもしれませんが、他の誰かを助けるかもしれません。

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

于 2021-04-01T16:43:11.023 に答える