【发布时间】:2014-09-09 00:08:05
【问题描述】:
我是matplotlib的新手,所以请原谅我的无知并帮助我解决这个问题。本质上,我有以下数据由 CSV 文件中的其他 python 脚本生成。
CSV1: 时间戳,数据1
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: 时间戳,数据3
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 值分别显示“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 个以上的数据点。所以当我绘图时,我得到一个非常糟糕的图表。我如何解决它 ?但是,当我有少量数据时,我会得到一个合适的图表。
【问题讨论】:
标签: python graph matplotlib