2016-12-30 9 views
1

Ich habe eine große Datenbank mit etwa 1 Million Einträge. In einer Spalte gibt es Daten in dieser Form: '% Y-% m-% d% H:% M:% S. Es gibt einen Eintrag jede Sekunde.Plot große Datenmenge mit Daten in X-Achse

ich die Zeit wählen kann ich aus der Datenbank darstellen möchten, zB

date1 = '2015.04.22 20.28.50'

date2 = ‚2015.04.23 21: 42:09 '

und die andere Spalte möchte ich in der Y-Achse zeichnen. Wie Sie in dem konkreten Beispiel sehen können, sind von Datum1 bis Datum2 etwa 86000 Einträge - oder - Punkte zu plotten.

Gibt es eine Möglichkeit, diese Daten effizient mit matplotlib zu plotten, wobei die Daten in der x-Achse angezeigt werden? Natürlich können nicht alle Daten angezeigt werden, aber da der Plotzeitraum dynamisch ist (ich füge in ein Webformular die Daten ein, die ich möchte), gibt es eine Möglichkeit, es so zu programmieren, dass die Handlung jedes Mal die bestmögliche ist?

Bisher kann ich alle Daten in einer Liste und alle Y-Daten in einer anderen Liste.

Unten ist mein Code so weit, der die Daten darstellt, aber die X-Achsenbeschriftungen sind nichts in der Nähe, was ich will.

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() 

Und das Ergebnis ist Plot

Vielen Dank im Voraus

Edit:

ich das Problem behoben haben diese Zeilen durch Zugabe:

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

plt.gcf().autofmt_xdate() 

jedoch Jetzt möchte ich die Handlung zu einem Web-Serve übergeben r mit der mpld3 Plugin:

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

Während ohne das Plugin, erscheint die Handlung ganz gut, mit den Daten in der x-Achse, mit dem Plugin scheint es, wie es diese Zeile nicht analysieren kann

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

in den HTML-Code und als Ergebnis wird die X-Achsenbezeichnung in Unix-Zeit angezeigt. Wer weiß, was mit dem Plugin los ist?

Antwort

0

Das Problem ist die große Anzahl von Punkten (eine jede Sekunde ist ein Bündel!). Wenn Sie versuchen, jeden Punkt als einen Kreis darzustellen, haben Sie diese Probleme. Aber es durch Ändern es zu einem Liniendiagramm leicht zu lösen ist, zu ändern:

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

Zum Beispiel:

# 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

Danke, aber tun Sie wissen, wie Sie das Problem mit der X-Achsenbeschriftung lösen können?Auch wenn ich versuche zu zoomen, erscheinen nur die Stunden (nicht die Daten) und sie überlappen sich. Was ich möchte, ist, die Daten auch für diese großen Datensätze bestmöglich zu rendern, ohne natürlich zu überlappen, indem nur einige von ihnen beibehalten werden. – tzoukritzou

Verwandte Themen