簡體   English   中英

使用 Matplotlib 在 Python 中繪制時間

[英]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)

我將格式更改為 (%H:%M) 並且時間顯示正確。 在此處輸入圖片說明

一切都歸功於社區。

我在使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM