2012-04-21 146 views
0

我想編輯一個例子,我發現嵌入一個mataplot到一個wx框架。matplotlib x軸格式化

當我執行它的工作原理的代碼:在每一行中的數據 -reads從CSV含有日期,頻率(例如,「2009-01-10,100」) 正確-draws圖表中的WX幀。

但是,我想弄清楚如何使x軸顯示日期從csv數據不是1,2,4,5,6 ..我能夠在另一個python程序正確地做到這一點我有使用:

plt.xticks(range(len(dates)), (dates), rotation=45)

,但無法弄清楚如何在這裏做類似的東西..

#!/usr/bin/env python 
""" 
An example of how to use wx or wxagg in an application with the new 
toolbar - comment out the setA_toolbar line for no toolbar 
""" 

# Used to guarantee to use at least Wx2.8 
import wxversion 
wxversion.ensureMinimal('2.8') 
import csv 
from numpy import arange, sin, pi 

import matplotlib 

# uncomment the following to use wx rather than wxagg 
#matplotlib.use('WX') 
#from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas 

# comment out the following to use wx rather than wxagg 
matplotlib.use('WXAgg') 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 

from matplotlib.backends.backend_wx import NavigationToolbar2Wx 

from matplotlib.figure import Figure 

import wx 

class CanvasFrame(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self,None,-1, 
         'CanvasFrame',size=(550,350)) 

     self.SetBackgroundColour(wx.NamedColor("WHITE")) 

     self.figure = Figure() 

     with open('c:\\charts.csv', 'rb') as n: 
      reader = csv.reader(n) 
      dates = [] 
      freq = [] 
      for row in reader: 
       values = row[0].split(',') 
       dates.append(values[0]) 
       freq.append(values[1]) 

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



     false_x = [x for x in range(len(dates))] 
     self.axes.plot(false_x,freq, 'o-') 
     ##self.axes.plot(t,s) 
     # self.axes.plot.xticks(range(len(dates)), (dates), rotation=45) 
     self.canvas = FigureCanvas(self, -1, self.figure) 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) 
     self.SetSizer(self.sizer) 
     self.Fit() 

     self.add_toolbar() # comment this out for no toolbar 


    def add_toolbar(self): 
     self.toolbar = NavigationToolbar2Wx(self.canvas) 
     self.toolbar.Realize() 
     if wx.Platform == '__WXMAC__': 
      # Mac platform (OSX 10.3, MacPython) does not seem to cope with 
      # having a toolbar in a sizer. This work-around gets the buttons 
      # back, but at the expense of having the toolbar at the top 
      self.SetToolBar(self.toolbar) 
     else: 
      # On Windows platform, default window size is incorrect, so set 
      # toolbar width to figure width. 
      tw, th = self.toolbar.GetSizeTuple() 
      fw, fh = self.canvas.GetSizeTuple() 
      # By adding toolbar in sizer, we are able to put it at the bottom 
      # of the frame - so appearance is closer to GTK version. 
      # As noted above, doesn't work for Mac. 
      self.toolbar.SetSize(wx.Size(fw, th)) 
      self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND) 
     # update the axes menu on the toolbar 
     self.toolbar.update() 


    def OnPaint(self, event): 
     self.canvas.draw() 

class App(wx.App): 

    def OnInit(self): 
     'Create the main window and insert the custom frame' 
     frame = CanvasFrame() 
     frame.Show(True) 

     return True 

app = App(0) 
app.MainLoop() 

在此先感謝您的幫助!

+0

mataplot?那是什麼?一個錯字?請編輯。 – ravenspoint 2012-04-21 18:01:26

+0

固定matplotlib – user1314011 2012-04-21 19:08:47

回答

1

這裏是()xticks的代碼:

def xticks(*args, **kwargs): 
    ax = gca() 

    if len(args)==0: 
     locs = ax.get_xticks() 
     labels = ax.get_xticklabels() 
    elif len(args)==1: 
     locs = ax.set_xticks(args[0]) 
     labels = ax.get_xticklabels() 
    elif len(args)==2: 
     locs = ax.set_xticks(args[0]) 
     labels = ax.set_xticklabels(args[1], **kwargs) 
    else: raise TypeError('Illegal number of arguments to xticks') 
    if len(kwargs): 
     for l in labels: 
      l.update(kwargs) 

    draw_if_interactive() 
    return locs, silent_list('Text xticklabel', labels) 

,你把它叫做如下:

plt.xticks(range(len(dates)), (dates), rotation=45) 

,所以你可以使用xticks()的代碼,處理len(args)==2。在您的代碼中調用self.axes.plot(...)後添加以下兩行:

self.axes.set_xticks(range(len(dates))) 
self.axes.set_xticklabels(dates, rotation=45)