2013-02-13 93 views
1

我有一个程序可以处理不同种类的数据。有些数据很大,有些非常小。 因为某些原因我只能用matplotlib绘制图如下:自动格式化x轴

 TimeDelta=FF.index[-1]-FF.index[0]   
     ax = fig.add_subplot(111) 
     if TimeDelta>timedelta(days=6): 
      intr=int(TimeDelta.days/6) 
     else: 
      intr=2 
    #ax.xaxis.set_minor_locator(dates.WeekdayLocator(byweekday=(1),interval=intr)) 
     ax.xaxis.set_minor_locator(dates.DayLocator(interval=intr)) 
     ax.xaxis.set_minor_formatter(dates.DateFormatter('%b%d')) 
     years= matplotlib.dates.YearLocator() # every year 
     yearsFmt = matplotlib.dates.DateFormatter('') 
     ax.xaxis.set_major_locator(years) 
     ax.xaxis.set_major_formatter(yearsFmt) 

我觉得这个方法太复杂,不要某人有其他简单的方法来处理这种情况呢?

+0

为什么你认为它太复杂了? – tacaswell 2013-02-13 23:47:41

+0

我不知道是否有像'ax.xautofomat'或我不知道可以自动格式化x轴的方法。 – wuwucat 2013-02-14 03:33:07

+0

@ user1843099 - 看看'fig.autofmt_xdate()'。 (尽管它基本上只是旋转日期标签。)另外,你可能已经在做这个了,但是调用'ax.xaxis_date()'(或者使用'plot_date')将会为你设置基本的格式化程序。当然,你正在做的是稍微调整一下,而自动格式化器的当前状态远非完美。 – 2013-02-14 03:47:01

回答

1

dates中有Auto*类,它们有一些可以调节的旋钮,但您似乎想要一个非常特定的格式。我只想做一个函数:

def my_x_axis_format(ax, dt): 
    if dt>timedelta(days=6): 
     intr=int(dt.days/6) 
    else: 
     intr=2 
    #ax.xaxis.set_minor_locator(dates.WeekdayLocator(byweekday=(1),interval=intr)) 
    ax.xaxis.set_minor_locator(dates.DayLocator(interval=intr)) 
    ax.xaxis.set_minor_formatter(dates.DateFormatter('%b%d')) 
    years= matplotlib.dates.YearLocator() # every year 
    yearsFmt = matplotlib.dates.DateFormatter('') 
    ax.xaxis.set_major_locator(years) 
    ax.xaxis.set_major_formatter(yearsFmt) 

,然后你可以让你的数字,因为

TimeDelta=FF.index[-1]-FF.index[0]   
ax = fig.add_subplot(111) 
my_x_axis_format(ax, TimeDelta) 
+0

谢谢,这是一个好主意:) – wuwucat 2013-02-14 14:40:57