2012-08-22 5 views
9

Un nuovo giorno ha portato nuovo problema con Python, purtroppo:/AssertionError: formati incompatibili: argomento 'altezza' deve essere di lunghezza 2 o scalare (Matplotlib, Python 2.7, i grafici di disegno)

ho un file generato dal mio altra app scritta in Java. Questa app genera file con alcuni dati, è gentile a caso, perché non sono in grado di dire quante righe avrebbe ogni file. file di esempio si presenta così:

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 

e voglio disegnare un grafico con l'utilizzo di questi dati. Sull'asse X mi piacerebbe avere date formattate e numeri di asse Y dalla prima colonna del mio file. Heres il mio codice python bella:

# -*- 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") 

tutto va bene, se file.txt avuto uno, singola riga. Quando ha più righe, il codice Python mi dà un errore:

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 

E non so davvero come risolverlo. La sua multa, se file.txt aveva una riga ma come ho scritto in precedenza: non sono in grado di dire quante righe avrebbero file.txt (dipende dalla mia app Java).

Chiunque? Io uso Python 2.7 e Matplotlib su Kubuntu 12.04.

+0

cosa la variabile 'valori' contiene? – Sheena

+0

@Sheena: contiene un elenco di numeri dalla prima colonna del mio file – Katie

risposta

12

È perché le date hanno solo 2 valori. La lunghezza delle date e la lunghezza dei valori devono essere uguali per matplotlib per sapere cosa fare. Se i valori era uno scalare poi tutti i bar avrebbero la stessa altezza

1

Grazie Penso ho capito - il problema era con la funzione readFile (arg), dovrebbe assomigliare a questo:

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) 
Problemi correlati