2017-05-25 11 views
0

私はmatplotlibの新バージョンです。私はそれを使って.csvファイルのデータを表示しました。コードは以下の通りです。 (リンクされたコードfuncは以下の通りです: "onMotion")は私が望むものではありません(オリジナルの.csvファイルからHH:MM:SSとして適切な文字列を表示します)、私はそれを浮動小数点数と見なしますが、それは時間に、それはまだ私が期待したものではありません。私はそれを正しくするために何をすべきですか?どんな提案も事前に大いに評価されています。matplotlib + wxpythonはx-ax時間文字列データを表示しません

CSV file data is below: 
Time CPU MEMEMORY FLOW 
21:41:45 7 2.065984885 0 
21:41:49 24 2.143804486 207.1622516 
21:41:53 18 2.099176758 254.0634666 
21:41:57 16 2.148127797 546.959479 
21:42:01 25 2.120096005 837.3973892 
21:42:05 14 2.123164162 865.6367548 
21:42:09 19 2.126511241 894.4122738 
21:42:13 16 2.090111751 924.6048394 
21:42:17 16 2.088717134 953.8266646 
21:42:21 18 2.090948521 985.3669382 

uが見ることができるように、このファイル内の時刻の形式はHH:MM:SSが、matplotlibのは、以下の画像のように、それを示しています。 this

import matplotlib.pyplot as plt 
import pandas as pd 
import wx 
class CanvasFrame(wx.Frame): 
    orgData= None 
    def __init__(self): 

     self.pro = None 
     wx.Frame.__init__(self,None,-1, 'App Detection',size=(800,350)) 
     self.orgData =pd.read_csv('data.csv') 
     self.orgData["Time"] = pd.to_datetime(self.orgData["Time"]) 
     self.SetBackgroundColour("WHITE") 

     self.figure = plt.figure() 
     self.axes = self.figure.add_subplot(111) 

     self.CPU, = self.axes.plot(self.orgData["Time"], self.orgData["CPU"]) 
     self.MEMEMORY, = self.axes.plot(self.orgData["Time"], self.orgData["MEMEMORY"], "m") 

     plt.xlabel("Time") 
     plt.ylabel("Usage(%)") 
     plt.title("Usage of App") 

     self.axes2 = self.axes.twinx() 
     self.FLOW, = self.axes2.plot(self.orgData["Time"], self.orgData["FLOW"], "r") 
     self.axes2.set_ylabel("FLOW(kb)") 

     self.ins = (self.CPU,)+(self.MEMEMORY,)+(self.FLOW,) 
     self.labs = [l.get_label() for l in self.ins] 
     self.axes.legend(self.ins, self.labs, loc=2) 

     self.canvas = FigureCanvas(self, -1, self.figure) 

     self.statusbar = self.CreateStatusBar() 
     self.mouseMoveID = self.canvas.mpl_connect('motion_notify_event',self.onMotion) 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.btnStart = wx.Button(self, -1, "Start") 
     self.Bind(wx.EVT_BUTTON, self.getData, self.btnStart) 

     self.btnGen = wx.Button(self, -1, "Gen Chart") 
     self.Bind(wx.EVT_BUTTON, self.genFigure, self.btnGen) 

     self.btnSave = wx.Button(self, -1, "Save") 
     self.Bind(wx.EVT_BUTTON, self.savePic, self.btnSave) 

     self.tip = wx.StaticText(self, -1, u"Tip: Tip string!") 
     self.tip.SetForegroundColour("red") 
     self.sizerH = wx.GridSizer(1,0) 
     self.sizerH.Add(self.btnStart,10, wx.ALL, 10) 
     self.sizerH.Add(self.btnGen,10, wx.ALL, 10) 
     self.sizerH.Add(self.btnSave,10, wx.ALL, 10) 
     self.sizer.Add(self.sizerH) 
     self.sizer.Add(self.tip) 
     self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) 
     self.SetSizer(self.sizer) 
     self.Fit() 

    def onMotion(self, evt): 
     x = evt.x 
     y = evt.y 
     inaxes = evt.inaxes 
     xdata = evt.xdata 
     ydata = evt.ydata 
     self.statusbar.SetStatusText("%s, %s, %s, %s, %s" % (
     x, y, inaxes, xdata, ydata)) 
+0

FigureCanvas()クラスとは何ですか?私はあなたのコードをデバッグしようとしましたが、 'name 'としてエラーを出しています.CancelCanvasは定義されていません。 FigureCanvasのコードを追加してください。 –

+0

@Amey 'from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas'。 'createStatusbar'も欠けています。しかし、完全な問題は実際にはwxの実装には依存しません。したがって、その部分を無視することができます。 @RealLau次回の質問には、[mcve]を入力してください。 – ImportanceOfBeingErnest

答えて

0

日付や時刻の書式を設定するには、例えば示さmatplotlib.dates.DateFormatterとして使用することができますthis example。それぞれの時刻でこのdateformatterを呼び出すと、目的の書式設定された文字列が生成されます。

dateformatter = mdates.DateFormatter('%H:%M:%S') 
dateformatter(xdata) 

フォーマットされた時間を表示するという問題は、実際にはGUIの実装に依存しません。だから私はこれを残して、軸の中でフォーマットされた時間を示すソリューションを提供するだけです。質問から、フォーマットされた文字列をGUIのステータスバーに提供する方法が明確になっています。

u = u"""Time CPU MEMEMORY FLOW 
21:41:45 7 2.065984885 0 
21:41:49 24 2.143804486 207.1622516 
21:41:53 18 2.099176758 254.0634666 
21:41:57 16 2.148127797 546.959479 
21:42:01 25 2.120096005 837.3973892 
21:42:05 14 2.123164162 865.6367548 
21:42:09 19 2.126511241 894.4122738 
21:42:13 16 2.090111751 924.6048394 
21:42:17 16 2.088717134 953.8266646 
21:42:21 18 2.090948521 985.3669382""" 

import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import io 

df = pd.read_csv(io.StringIO(u), delim_whitespace=True) 

df["Time"] = pd.to_datetime(df["Time"]) 

fig, ax = plt.subplots() 

ax.plot(df["Time"], df["CPU"]) 
ax.plot(df["Time"], df["MEMEMORY"]) 

text = ax.text(0.02,0.98, "", transform=ax.transAxes, va="top") 
dateformatter = mdates.DateFormatter('%H:%M:%S') 

def onmousemove(evt): 
    if evt.inaxes: 
     xdata = evt.xdata 
     xtime = dateformatter(xdata) 
     string = "%s" % (xtime) 
     text.set_text(string) 
     fig.canvas.draw_idle() 

cid = fig.canvas.mpl_connect("motion_notify_event",onmousemove) 

plt.show() 

enter image description here

+0

私はこれを "xdata = plt.gca()。get_xaxis()。get_major_formatter()(evt.xdata)"で解決しましたが、助言をいただきありがとうございます。 –

関連する問題