2016-12-30 121 views
1

我有一个包含大约100万个条目的大型数据库。在一列中有这种形式的日期:'%Y-%m-%d%H:%M:%S。每秒有一个条目。在x轴上绘制大量的日期数据

我可以选择我想从数据库绘制时间,例如

日期1 =“2015年4月22日20时28分50秒”

日期2 =“2015年4月23日21: 42:09'

另一列我想绘制在Y轴上。 正如您在具体示例中所看到的,从date1到date2大约有86000个条目 - 或 - 要绘制的点。

有没有一种方法可以有效地使用matplotlib绘制这些数据,日期显示在x轴上? 当然,并不是所有的日期都可以显示出来,但是由于绘图周期是动态的(我将日期插入网络表单中),是否有一种编程方式,以便每次都可以实现最佳图形?

到目前为止,我可以把所有日期放在一个列表中,并将所有的Y数据放在另一个列表中。

下面是我的代码到目前为止,它绘制的数据,但X轴标签没有什么我想要的。

from buzhug import Base 
import datetime 
import data_calculations as pd 
import matplotlib.pyplot as plt 
import matplotlib 
import time 

date1 = '2015-04-22 20:28:50' 
date2 = '2015-04-24 19:42:09' 

db = Base('monitor').open() 
result_set = db.select(['MeanVoltage','time'],"time>=start and time<=stop", start=date1, stop=date2) 

V = [float(record.MeanVoltage) for record in result_set] 
Date = [str(record.time) for record in result_set] 


dates = [datetime.datetime.strptime(record, '%Y-%m-%d %H:%M:%S') for record in Date] 
dates = matplotlib.dates.date2num(dates) 

fig, ax = plt.subplots() 
ax.plot_date(dates, V) 
plt.grid(True) 
plt.show() 

,其结果是 Plot

预先感谢您

编辑:

我已经加上几行的固定问题:

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y %H:%M:%S')) 

plt.gcf().autofmt_xdate() 

然而,现在我想把这个情节传递给一个web服务器[R使用mpld3插件:

mpld3.plugins.get_plugins(fig) 
mpld3.fig_to_html(fig) 
mpld3.show() 

虽然,没有插件,情节似乎只是罚款,与x轴的日期,用插件看起来它不能解析此行

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y %H:%M:%S')) 

进入html代码,结果x轴标签出现在unix时间。 任何人都知道插件有什么问题?

回答

0

问题是大量的点(每秒一个是捆绑!)。如果你试图将每个点绘制成一个圆圈,你将会遇到这些问题。 但它很容易被其更改为线图,改变解决:

ax.plot_date(dates, V, '-') # Where '-' means a line plot 

例如:

# some sample data 
x = np.linspace(0.1, np.pi, 86000) 
y = np.cos(x)**2 * np.log(x) 
plt.plot(x, y, 'o') 

enter image description here

plt.plot(x, y, '-') 

enter image description here

+0

谢谢你,但千万你知道一种解决x轴标签问题的方法吗?即使我尝试放大,小时也只会出现(不是日期),并且它们会相互重叠。我想要的是,尽可能以最好的方式呈现日期,即使对于这些大数据集也是如此,而不会重叠,当然,只保留其中的一部分。 – tzoukritzou