AssertionError: incompatible sizes: argument 'height' must be length 2 or scalar (Matplotlib, Python 2.7, drawing charts)

匿名 (未验证) 提交于 2019-12-03 02:30:02

问题:

A new day brought new problem with Python, unfortunately :/

I have a file generated by my other app written in Java. This app generates files with some data, it's kind a random stuff 'cause I'm not able to say how many rows each file would have. Example file looks like this:

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 

And I want to draw a chart with use of this data. On X axis I would like to have formatted dates, and on Y axis numbers from the first column of my file. Heres my lovely python code:

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

Everything is fine, if file.txt had a one, single row. When it has more rows, python code gives me an error:

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 

And I don't really know how to fix it. Its fine, if file.txt had one row but as I wrote earlier: I'm not able to say how many rows would file.txt have (it depends on my Java app).

Anybody? I use Python 2.7 and Matplotlib on Kubuntu 12.04.

回答1:

It's because dates only has 2 values. The length of dates and the length of values must be the same for matplotlib to know what to do. If values was a scalar then all the bars would have the same height



回答2:

Thanks I think I figured it out - the problem was with the readFile(arg) function, it should look like this:

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) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!