簡體   English   中英

將多個Y值與多個X值相對應,這些X值是同一張圖中matplotlib中不同的時間戳?

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

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