[英]Plotting multiple Y values against multiple X values which are different timestamps in matplotlib in the same graph?
我是matplotlib的新手,所以請原諒我的無知並幫助我解決此問題。 本質上,其他python腳本在CSV文件中生成了以下數據。
CSV1: 時間戳,data1
23:04:17, 1163557.14 bps
23:04:27, 1137578.47 bps
23:04:37, 1139094.66 bps
23:04:47, 1095752.97 bps
23:04:57, 1264145.01 bps
CSV2: 時間戳,數據2
23:04:21, 1011000.00 bps
23:04:31, 1011000.00 bps
23:04:41, 1011000.00 bps
23:04:51, 1014000.00 bps
23:05:01, 1008000.00 bps
CSV3: 時間戳記, data3
23:05:28, 1109617.96 bps
23:05:38, 1139177.95 bps
23:05:48, 1108110.09 bps
23:05:58, 1107078.94 bps
23:06:08, 1163406.80 bps
我想要的是讓時間沿着X軸運行,並使三個Y值沿Y軸運行,每個Y值分別顯示“ data1”,“ data2”和“ data3”。 每10秒鍾收集一次數據,但不一定同步。 因此,我無法為X軸使用單個數組。 但是我希望所有這些都在同一個圖表中進行比較。 我怎么解決這個問題 ?
任何示例代碼或導致文檔將不勝感激。
**編輯:
從本質上來說,我的問題是該數據沿不同的時間戳顯示,但我想在同一張圖上標出它們。 我怎樣才能做到這一點 ?**
編輯2:
謝謝大家的投入。 那真的有幫助。 這是我現在擁有的代碼:
import csv
import sys
import datetime
import random
import matplotlib.pyplot as plt
from matplotlib.dates import MinuteLocator, SecondLocator, DateFormatter
time_e_z_raw_list = []
bitrate_e_z_list = []
time_i_z_raw_list = []
bitrate_i_z_list = []
time_i_query_z_raw_list = []
bitrate_i_q_z_raw_list = []
f_enc_z = open(sys.argv[1], 'rt')
f_ing_z = open(sys.argv[2], 'rt')
f_ing_q_z = open(sys.argv[3], 'rt')
try:
reader1 = csv.reader(f_enc_z)
for row in reader1:
bitrate = row[1]
time_e_z_raw_list.append(row[0])
bitrate_e_z_list.append(bitrate[:-4])
reader3 = csv.reader(f_ing_z)
for row in reader3:
bitrate = row[1]
time_i_z_raw_list.append(row[0])
bitrate_i_z_list.append(bitrate[:-4])
reader4 = csv.reader(f_ing_q_z)
for row in reader4:
bitrate = row[1]
time_i_q_z_raw_list.append(row[0])
bitrate_i_q_z_raw_list.append(bitrate[:-4])
finally:
f_enc_z.close()
f_ing_z.close()
f_ing_q_z.close()
time_e_z_list = [datetime.datetime.strptime(s, '%H:%M:%S') for s in time_e_z_raw_list]
time_i_z_list = [datetime.datetime.strptime(s, '%H:%M:%S') for s in time_i_z_raw_list]
time_i_q_z_list = [datetime.datetime.strptime(s, '%H:%M:%S') for s in time_i_q_z_raw_list]
fig = plt.figure(figsize=(18,16))
plt.plot(time_e_z_list, bitrate_e_z_list, label="label1", lw=1)
plt.plot(time_i_z_list, bitrate_i_z_list, label="label2", lw=1)
plt.plot(time_i_q_z_list, bitrate_i_z_list, label="label3", lw=1)
minutes = MinuteLocator()
seconds = SecondLocator()
ax = plt.gca()
ax.xaxis.set_major_locator(minutes)
ax.xaxis.set_minor_locator(seconds)
ax.xaxis.set_major_formatter(DateFormatter("%H:%M:%S"))
plt.xlabel('time')
plt.ylabel('bitrate in bps')
plt.grid()
plt.legend(loc='upper right')
plt.gcf().autofmt_xdate()
plt.show()
問題是當我的時間戳超過3小時以上時,圖表會失真。 如何確保X軸顯示的范圍根據我采樣的時間戳范圍進行動態調整? 通常,我每20秒運行4小時以上的數據點。 所以當我繪圖時,我得到了一個非常糟糕的圖表。 我如何解決它 ? 但是,當我有少量數據時,會得到一個合適的圖形。
好的,我更新了最初的答案。 這是一種可能的解決方案。 但是,由於您正在談論的是CSV文件,因此您可能希望了解在Pandas中使用時間序列的情況。
import datetime
import random
import matplotlib.pyplot as plt
data1 = (1163557.14, 1137578.47, 1139094.66)
times1_raw = ('23:04:17', '23:04:27', '23:04:37')
times1 = [datetime.datetime.strptime(s, '%H:%M:%S') for s in times1_raw]
data2 = (1011000.00, 1011000.00, 1011000.00)
times2_raw = ('23:04:21', '23:04:31', '23:04:41')
times2 = [datetime.datetime.strptime(s, '%H:%M:%S') for s in times2_raw]
fig = plt.figure(figsize=(8,6))
plt.plot(times1, data1, label='data1', lw=2, marker='o')
plt.plot(times2, data2, label='data2', lw=2, marker='s')
plt.xlabel('time in seconds')
plt.ylabel('speed in bps')
plt.grid()
plt.legend(loc='upper right')
plt.gcf().autofmt_xdate()
plt.show()
這是我解決這個問題的方法。
首先,嘗試利用datetime
模塊。 處理帶時間戳的數據時,它可以節省生命。
我們知道時間步長中最小的增量是一秒。 因此,讓我們首先列出所有可能的時間。
import matplotlib.pyplot as plt
import datetime
start_date = datetime.datetime(2014,6,17,23,4,17)
end_date = datetime.datetime(2014,6,17,23,6,8)
number_seconds = (end_date - start_date).seconds
time_stamps = [start_date + datetime.timedelta(seconds=t) for t in range(number_seconds)]
現在列表time_stamps
是一個datetime
對象,我假設您只是想根據樣本數據從圖章中獲取hour:minute:second。 我們可以通過列表理解輕松地獲得它:
time_stamps_fmt = [datetime.datetime.strftime(t,'%H:%m:%S') for t in time_stamps]
現在讓我們創建一個空數組來存儲bps數據:
bps_1 = np.zeros([number_seconds],dtype('float'))
bps_2 = np.zeros([number_seconds],dtype('float'))
bps_3 = np.zeros([number_seconds],dtype('float'))
然后在.csv文件中的時間戳中填充bps_1/2/3
的相應索引。 如果未找到時間戳, np.nan
為該索引插入np.nan
,並且matplotlib應該將其視為缺少的值,而不要繪制任何內容。
您可以使用xticks
將時間戳顯示為x標簽:
plt.xticks(np.arange(number_seconds), time_stamps_fmt)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.