[英]Plotting time in Python with Matplotlib
我有一個格式為 (HH:MM:SS.mmmmmm) 的時間戳數組和另一個浮點數數組,每個數組對應於時間戳數組中的一個值。
我可以使用 Matplotlib 在 x 軸上繪制時間並在 y 軸上繪制數字嗎?
我試圖這樣做,但不知何故它只接受浮點數數組。 我怎樣才能讓它繪制時間? 我必須以任何方式修改格式嗎?
您必須首先將時間戳轉換為 Python datetime
對象(使用datetime.strptime
)。 然后使用date2num
將日期轉換為 matplotlib 格式。
使用plot_date
繪制日期和值:
dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, 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,我必須添加以下代碼, 這些代碼來自 Paul H.
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()
這將產生氣泡按需要分布的圖像。
尚未提及 Pandas 數據框。 我想展示這些是如何解決我的日期時間問題的。 我的日期時間為毫秒2021-04-01 16:05:37
。 我正在從 /proc 中提取 linux/haproxy 吞吐量,因此我可以根據自己的喜好對其進行格式化。 這對於將數據輸入實時圖形動畫非常有用。
下面來看看 csv。 (忽略我在另一個圖中使用的每秒數據包數列)
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 將日期字符串作為“對象”拉入,它只是字符類型。 在腳本中按原樣使用:
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()
這可能不適合您的用例,但它可能會幫助其他人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.