2012-08-22 20 views
9

新的一天帶來了新的問題與Python,不幸的是:我已經生成/Asse田:不兼容大小:參數「高度」必須是長度爲2或標量(Matplotlib,Python 2.7版,繪製圖表)

文件我用Java編寫的其他應用程序。這個應用程序生成一些數據的文件,這是一個隨機的東西,因爲我無法說出每個文件有多少行。示例文件如下所示:

3 Sat Jan 21 00:00:00 2012 
7 Sun Mar 11 00:00:00 2012 
5 Fri Jan 1 00:00:00 2010 
4 Sat Feb 5 00:00:00 2011 
8 Sun Apr 11 00:00:00 2010 
4 Wed Aug 24 00:00:00 2011 
8 Sat Feb 20 00:00:00 2010 
3 Thu Oct 13 00:00:00 2011 
9 Fri Dec 17 00:00:00 2010 
4 Tue Jul 20 00:00:00 2010 
8 Fri Dec 2 00:00:00 2011 
6 Mon May 31 00:00:00 2010 
5 Mon May 16 00:00:00 2011 
8 Mon Apr 30 00:00:00 2012 
3 Thu Oct 28 00:00:00 2010 
1 Tue Jun 19 00:00:00 2012 
7 Wed Sep 8 00:00:00 2010 

我想用此數據繪製圖表。在X軸上,我想要格式化日期,並在我的文件的第一列中輸入Y軸編號。繼承人我可愛的Python代碼:

# -*- coding: utf-8 -*- 
#!/usr/bin/env python 
import wx 
import matplotlib 
matplotlib.use("TkAgg") 
import matplotlib.pyplot as pl 
import datetime 

def monthNum(month) : 
     if month == "Jan" : 
      return 1 
     elif month == "Feb" : 
      return 2 
     elif month == "Mar" : 
      return 3 
     elif month == "Apr" : 
      return 4 
     elif month == "May" : 
      return 5 
     elif month == "Jun" : 
      return 6 
     elif month == "Jul" : 
      return 7 
     elif month == "Aug" : 
      return 8 
     elif month == "Sep" : 
      return 9 
     elif month == "Oct" : 
      return 10 
     elif month == "Nov" : 
      return 11 
     elif month == "Dec" : 
      return 12 

def convertDate(dateTime) : 
     line = dateTime.split(' ') 
     date = (str(line[2]) + "-" + str(monthNum(line[1])) + "-" + str(line[4])) 
     return date 

def readFile(filename) : 
     values = [] 
     dates = [] 
     try : 
       with open(filename, "r") as openedFile: 
         for line in openedFile : 
           line = line.strip() 
           data = line.split("\t") 
           values.append(int(data[0])) 
           newDate = convertDate(data[1]) 
           dates.append(datetime.datetime.strptime(newDate, "%d-%m-%Y").date()) 
     except IOError : 
       print("IOERROR") 
     except ValueError : 
       print("VALUE ERROR") 
     if len(values) != 0 and len(dates) != 0 : 
       drawChart(values, dates, filename) 

def drawChart(values, dates, filename): 
     fig = pl.figure(dpi=60,figsize=(18, 10)) 
     ax = fig.add_subplot(1,1,1) 
     fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.2) 
     ax.bar(range(len(dates)), values, facecolor='#777777', align='center', width=0.5, ecolor='black') 
     pl.axis('tight') 
     ax.set_xticks(range(len(dates))) 
     pl.yticks(values) 
     ax.set_xticklabels(dates, rotation = 90) 
     pl.savefig(filename + ".png") 
     pl.show() 
     pl.close() 

readFile("file.txt") 

一切都很好,如果file.txt有一個單列。當它有更多的行,Python代碼給我一個錯誤:

VALUE ERROR 
Traceback (most recent call last): 
    File "test.py", line 71, in <module> 
    readFile("file.txt") 
    File "test.py", line 56, in readFile 
    drawChart(values, dates, filename) 
    File "test.py", line 62, in drawChart 
    ax.bar(range(len(dates)), values, facecolor='#777777', align='center', width=0.5, ecolor='black') 
    File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 4733, in bar 
    nbars) 
AssertionError: incompatible sizes: argument 'height' must be length 2 or scalar 

而我真的不知道如何解決它。它很好,如果file.txt有一行,但正如我前面寫道:我不能說多少行file.txt(它取決於我的Java應用程序)。

有人嗎?我在Kubuntu 12.04上使用Python 2.7和Matplotlib。

+0

什麼變量「值」是否包含? – Sheena

+0

@Sheena:它包含我的文件第一列中的數字列表 – Katie

回答

12

這是因爲日期只有2個值。日期的長度和值的長度必須相同,以便matplotlib知道該怎麼做。如果值是一個標量,那麼所有的酒吧將具有相同的高度

1

謝謝,我想我想通了 - 問題是與READFILE(ARG)功能,它應該是這樣的:

def readFile(filename) : 
    values = [] 
    dates = [] 
    openedFile = open(filename, "r") 
    content = openedFile.readlines() 
    openedFile.close() 
    for line in content : 
     line = line.strip() 
     data = line.split("\t") 
     values.append(int(data[0])) 
     newDate = self.convertDate(data[1]) 
     dates.append(newDate) 
    print(values) 
    print(dates) 
相關問題