(HH:MM:SS.mmmmmm)形式のタイムスタンプの配列と、それぞれがタイムスタンプ配列の値に対応する浮動小数点数の別の配列があります。
Matplotlibを使用して、x軸に時間をプロットし、y軸に数値をプロットできますか?
私はしようとしていましたが、どういうわけかそれはフロートの配列しか受け入れていませんでした。どうすれば時間をプロットできますか?フォーマットを変更する必要がありますか?
(HH:MM:SS.mmmmmm)形式のタイムスタンプの配列と、それぞれがタイムスタンプ配列の値に対応する浮動小数点数の別の配列があります。
Matplotlibを使用して、x軸に時間をプロットし、y軸に数値をプロットできますか?
私はしようとしていましたが、どういうわけかそれはフロートの配列しか受け入れていませんでした。どうすれば時間をプロットできますか?フォーマットを変更する必要がありますか?
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)
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()
次のような画像を生成します。
7年後、このコードは私を助けてくれました。しかし、私の時間はまだ正しく表示されていませんでした。
Matplotlib 2.0.0を使用して、PaulHによるmatplotlibのx軸目盛りラベルの日付フォーマットの編集から次のコードを追加する必要がありました。
import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)
コミュニティに感謝します。
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()
これにより、バブルが希望どおりに分散された画像が生成されます。
パンダのデータフレームについてはまだ言及されていません。これらが私の日時の問題をどのように解決したかを示したかったのです。ミリ秒までの日時があります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()
これはあなたのユースケースには理想的ではなかったかもしれませんが、他の誰かを助けるかもしれません。