0

現在の日付と時刻をリアルタイム プロットの x 軸に追加したいと考えています。カスタムティックからカスタム軸までほとんどすべてを試しましたが、追加できないようです。どうすればいいですか?

import sys
import pylab
from pylab import *
from PyQt4 import QtGui,QtCore
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg \
import FigureCanvasQTAgg as FigureCanvas
import MySQLdb as mdb

class CPUMonitor(FigureCanvas):
    def __init__(self):
        self.date = []
        conn = mdb.connect("serv","user","pass","db")
        self.cur = conn.cursor()
        self.before = self.prepare_cpu_usage()
        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        FigureCanvas.__init__(self, self.fig)
        self.ax.set_title("Pong | CPU Utilization")
        self.ax.set_xlabel("Datetime")
        self.ax.set_ylabel("CPU %")
        self.ax.set_autoscale_on(False)
        self.user =[]
        self.l_user, = self.ax.plot([],self.user, label='Total %')
        self.ax.legend()
        self.fig.canvas.draw()
        self.cnt = 0
        self.timerEvent(None)
        self.timer1 = QtCore.QTimer()
        self.timer1.timeout.connect(self.get_database_data)
        self.timer1.start(5)
        self.timer = self.startTimer(5000)

    def get_database_data(self):
        self.cur.execute("SELECT cpu,date FROM status WHERE date = (SELECT MAX(date) FROM status);")
        self.data_db = self.cur.fetchone()
        return self.data_db
    def prepare_cpu_usage(self):
        t = self.get_database_data()
        return [t[0],t[1]]
    def get_cpu_usage(self): 
        now = self.prepare_cpu_usage()
        self.before = now
        print self.before
        return self.before
    def datetime(self):
        self.dates = self.get_cpu_usage()
        self.dates = self.dates[1]
        self.date.append(self.dates)
        return str(self.dates)
    def timerEvent(self, evt):
        result = self.get_cpu_usage()
        self.user.append(result[0])
        self.l_user.set_data(range(len(self.user)), self.user)
        self.fig.canvas.draw()
        CurrentXAxis=pylab.arange(len(self.user)-1000,len(self.user),1)
        self.ax.axis([CurrentXAxis.min(),CurrentXAxis.max(),0,100])


        self.cnt += 1
app = QtGui.QApplication(sys.argv)
widget = CPUMonitor()
widget.setWindowTitle("Pong: CPU Usage")
widget.show()
sys.exit(app.exec_())
4

1 に答える 1

1

最初に簡単な例をチェックして、日付マーカーを機能させる方法を理解することができます: http://matplotlib.sourceforge.net/examples/pylab_examples/finance_demo.html

まず、日付プロット クラスをインポートする必要があります。次に例を示します。

from matplotlib.dates import DateFormatter, WeekdayLocator, MONDAY

ドキュメントはhttp://matplotlib.sourceforge.net/api/dates_api.htmlで入手できます。

次に、Figure の定義で、ロケーター (目盛り用) とフォーマッター (目盛りラベル用) を設定します。以下のコードは、毎週月曜日に目盛りを設定します。

    self.ax.xaxis.set_major_locator(WeekdayLocator(MONDAY))
    self.ax.xaxis.set_major_formatter(DateFormatter('%b %d'))
    self.ax.xaxis_date()

datetime.datetime整数の代わりに X 軸の値と範囲に使用する必要があります。MySQLdb がdatetime.datetimeオブジェクトを返すことを期待しています。それ以外の場合は、タイムスタンプを変換する必要があります。

空のグラフをプロットしようとすると、日付フォーマッタが文句を言います。合理的な初期制限を設定することを忘れないでください。

以下はコードの例です。ここでは、データベース コード (およびその他のコード) を削除し、生成された値に置き換えました。

import sys
from pylab import *
from PyQt4 import QtGui
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.dates import DateFormatter, WeekdayLocator, MONDAY
import datetime
import random

class CPUMonitor(FigureCanvas):
    def __init__(self):
        # Dummy variable to simulate time.
        self.delay = 0

        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        FigureCanvas.__init__(self, self.fig)
        self.ax.set_title("Pong | CPU Utilization")
        self.ax.set_xlabel("Datetime")
        self.ax.set_ylabel("CPU %")
        self.ax.xaxis.set_major_locator(WeekdayLocator(MONDAY))
        self.ax.xaxis.set_major_formatter(DateFormatter('%b %d'))
        self.ax.xaxis_date()

        # Set resonable initial limits.
        td = datetime.timedelta(1)
        self.ax.set_xlim(datetime.datetime.now(), datetime.datetime.now() + td)

        self.dates = []
        self.user =[]
        self.l_user, = self.ax.plot([],self.user, label='Total %')
        self.ax.legend()

        self.timer = self.startTimer(5000)

    def get_database_data(self):
        self.delay += 1
        td = datetime.timedelta(0, self.delay * 5)
        return [random.random(), datetime.datetime.now() + td]

    def prepare_cpu_usage(self):
        t = self.get_database_data()
        return [t[0],t[1]]

    def get_cpu_usage(self):
        return self.prepare_cpu_usage()

    def timerEvent(self, evt):
        result = self.get_cpu_usage()
        self.user.append(result[0])
        self.dates.append(result[1])
        self.l_user.set_data(self.dates, self.user)
        if len(self.dates) >= 2:
            self.ax.set_xlim(self.dates[0], self.dates[-1])
        self.draw()

app = QtGui.QApplication(sys.argv)
widget = CPUMonitor()
widget.setWindowTitle("Pong: CPU Usage")
widget.show()
sys.exit(app.exec_())
于 2012-08-15T20:58:58.227 に答える