如何使用matplotlib在同一图表上绘制两个具有不同采样率的时间序列

时间:2018-04-10 18:32:39

标签: python matplotlib python-datetime

我想在同一个图表上绘制两组数据。两组数据都有200秒的数据。数据集A(BLUE)以25Hz采样,数据集B(红色)采样为40Hz。因此,数据集A具有25 * 200 = 5000(时间,值)样本......并且数据集B具有40 * 200 = 8000(时间,值)样本。

datasets with different sample rates

正如您在上面所看到的,我已经设法使用' plot_date'在matplotlib中绘制这些图。功能。据我所知,该情节'函数不起作用,因为每个样本中(x,y)对的数量不同。我遇到的问题是xaxis的格式。我希望时间是以秒为单位的持续时间,而不是格式为hh:mm:ss的确切时间。目前,当秒数达到每分钟时,秒值会重置为零(如下面的缩小图像所示)。

zoomed out full time scale

如何让情节显示时间从0到20秒增加而不是显示小时:分钟:秒?

是否有private void getResponse() { output.Text = "You have searched for: " + "'" + search + "'"; try { //the value of 'search' is the product they searched for WebClient c = new WebClient(); var data = c.DownloadString("http://localhost/api/index.php?search=" + search); JObject o = JObject.Parse(data); nameField.Text = o["name"].ToString(); descrField.Text = o["description"].ToString(); priceField.Text = o["price"].ToString(); quantityField.Text = o["quantity"].ToString(); dateField.Text = o["dateadded"].ToString(); } catch { nameField.Text = "Product not found."; descrField.Text = "Product not found."; priceField.Text = "Product not found."; quantityField.Text = "Product not found."; dateField.Text = "Product not found."; } } 可以做到这一点(我已经尝试了,但无法弄明白......)?或者我是否需要以某种方式将matplotlib.dates.DateFormatter x轴值操作为持续时间而不是确切的时间? (怎么做)?

供参考: 下面的代码是我如何将浮点值的原始csv列表(以秒为单位)转换为datetime对象,并再次转换为matplotlib日期时间对象 - 以与datetime函数一起使用。

axes.plot_date()

感谢您的帮助/建议!

1 个答案:

答案 0 :(得分:0)

好的,感谢ImportanceOfBeingErnst指出我的事情过于复杂......

事实证明,我真的只需要ax.plot(x,y)函数而不是ax.plot_date(mdatetime, y)函数。只要每个单独的迹线具有相同数量的x和y值,绘图实际上可以绘制不同长度的数据。由于数据全部以秒为单位给出,因此可以使用0作为我的“参考时间”轻松绘制。

对于其他任何挣扎于绘图持续时间而不是确切时间的人来说,你可以通过使用python的map()函数简单地操纵“时间”(x)数据,或者更好的是列表理解来“时移”数据或转换为单个时间单位(例如,通过除以60将分钟转换为秒)。

“时间转移”可能如下所示:

# build some sample 25 Hz time data
time = range(0,1000,1)
time = [x*.04 for x in time]
# "time shift it by 5 seconds, since this data is recorded 5 seconds after the other signal
time = [x+5 for x in time]

这是我的绘图代码,对于像我这样的任何其他matplotlib初学者:)(这不会运行,因为我没有将我的变量转换为通用数据......但是它是使用matplotlib的一个简单示例。)

fig,ax = plt.subplots()
ax.grid()
ax.set_title(plotTitle)
ax.set_xlabel("time (s)")
ax.set_ylabel("value")

# begin looping over the different sets of data.
tup = 0
while (tup < len(alldata)):
    outTime = alldata[tup][1].get("time")
    # each signal is time shifted 5 seconds later.
    # in addition each signal has different sampling frequency, 
    # so len(outTime) is different for almost every signal.
    outTime = [x +(5*tup) for x in outTime]
    for key in alldata[tup][1]:
        if(key not in channelSelection):
            ## if we dont want to plot that data then skip it.
            continue
        else:
            data = alldata[tup][1].get(key)
            ## using list comprehension to scale y values.
            data = [100*x for x in data]
        ax.plot(outTime,data,linestyle='solid', linewidth='1', marker='')
    tup+=1
plt.show()