By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
439,957 Members | 2,038 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 439,957 IT Pros & Developers. It's quick & easy.

Reading data from a txt file and making a graph with the given data

P: 32
I'm trying to make a bar graph with the histogram data I get from the histogram.txt file after I run the scripts. How would I go about doing this?

File 1:
Expand|Select|Wrap|Line Numbers
  1. class TallySheet:
  2.   """Manage tallies for a collection of values.
  3.  
  4.   Values can either be from a consecutive range of integers, or a
  5.   consecutive sequence of characters from the alphabet.
  6.   """
  7.   def __init__(self, minVal, maxVal):
  8.     """Create an initially empty tally sheet.
  9.  
  10.     minVal    the minimum acceptable value for later insertion
  11.     maxVal    the minimum acceptable value for later insertion
  12.     """
  13.     self._minV = minVal
  14.     self._maxV = maxVal
  15.     maxIndex = self._toIndex(maxVal)
  16.     self._tallies = [0] * (maxIndex + 1)   # a list of counters, each initially zero
  17.  
  18.   def increment(self, val):
  19.     """Increment the tally for the respective value.
  20.  
  21.     raise a TypeError if the given value is not of the proper type
  22.     raise a ValueError if the given value is not within proper range
  23.     """
  24.     ind = self._toIndex(val)
  25.     if not 0 <= ind < len(self._tallies):
  26.       raise ValueError('parameter '+str(val)+' out of range')
  27.     self._tallies[ind] += 1
  28.  
  29.   def getCount(self, val):
  30.     """Return the total number of current tallies for the given value.
  31.  
  32.     raise a TypeError if the given value is not of the proper type
  33.     raise a ValueError if the given value is not within proper range
  34.     """
  35.     ind = self._toIndex(val)
  36.     if not 0 <= ind < len(self._tallies):
  37.       raise ValueError('parameter '+str(val)+' out of range')
  38.     return self._tallies[ind]
  39.  
  40.   def getTotalCount(self):
  41.     """Return the total number of current tallies."""
  42.     return sum(self._tallies)
  43.  
  44.   def _toIndex(self, val):
  45.     """Convert from a native value to a legitimate index.
  46.  
  47.     Return the resulting index (such that _minV is mapped to 0)
  48.     """
  49.     try:
  50.       if isinstance(self._minV, str):
  51.         i = ord(val) - ord(self._minV)
  52.       else:
  53.         i = int( val - self._minV )
  54.     except TypeError:
  55.       raise TypeError('parameter '+str(val)+' of incorrect type')
  56.     return i
  57.  
  58.   def writeTable(self, outfile):
  59.     """Write a comprehensive table of results.
  60.  
  61.     Report each value, the count for that value, and the percentage usage.
  62.  
  63.     outfile   an already open file with write access.
  64.     """
  65.     outfile.write('Value  Count Percent \n----- ------ -------\n')
  66.     total = max(self.getTotalCount(), 1)  # avoid division by zero
  67.     for ind in range(len(self._tallies)):
  68.       label = self._makeLabel(ind)
  69.       count = self._tallies[ind]
  70.       pct = 100.0 * count / total
  71.       outfile.write('%s %6d %6.2f%%\n' % (label, count, pct))
  72.  
  73.   def _makeLabel(self, ind):
  74.     """Convert index to a string in native range."""
  75.     if isinstance(self._minV, int):
  76.       return '%5d' % (ind + self._minV)
  77.     else:
  78.       return '  %s  ' % chr(ind + ord(self._minV))
  79.  
  80.   def writeHistogram(self, output, source):
  81.       '''Using the information created within writeTable,
  82.       create a histogram that compiles the data from the source file
  83.       into groups of consecutive values.'''
  84.       histo = list()
  85.       text = source.read()         # read the contents of the source file which in this case is tally.txt
  86.       text = text.split('\n')          # split each line in the text
  87.       histo.append(text[0] + '\n')
  88.       histo.append(text[1] + '\n')
  89.       for line in text:                   # if there's a blank line, or a \n at the end of the file, delete it
  90.           if line == '':
  91.             text.remove(line)
  92.  
  93.       numLines = len(text)         # this will help set up how long the loops need to be that are upcoming
  94.  
  95.       if numLines % 2 == 1:      # if the number of lines is odd then the last line needs to be duplicated
  96.           text.append(text[numLines - 1])
  97.       for x in range(2, numLines, 2):       # this loop splits each line into individual pieces then adds the parts together
  98.         j = text[x].split()                          # split the first line
  99.         k = text[x+1].split()                    # split the second line
  100.         label = j[0] + '-' + k[0]               # the label is the first parts added together ie. 'a-b'
  101.         count = int(j[1]) + int(k[1])         # add the counts together
  102.         pct = float(j[2][:-1]) + float(k[2][:-1])       # add the percentages together
  103.         histo.append('%5s %6d %6.2f%%\n' % (label, count, pct))  # create the lines to be written and add them to histo list
  104.  
  105.       for line in histo:
  106.         output.write(line)      # as in writeTable, write a line to the output file
  107.  
  108.  
  109. if __name__ == '__main__':
  110.   t = TallySheet('a', 'e')
  111.  
  112.   for i in range(10):
  113.     t.increment('a')
  114.  
  115.   if t.getCount('a') == 10:
  116.     print 'Test1: Success'
  117.   else:
  118.     print 'Test1: Failure'
  119.  
  120.   for i in range(5):
  121.     t.increment('b')
  122.  
  123.   if t.getCount('b') == 5:
  124.     print 'Test2: Success'
  125.   else:
  126.     print 'Test2: Failure'
  127.  
  128.   for i in range(10):
  129.     t.increment('c')
  130.  
  131.   if t.getCount('c') == 10:
  132.     print 'Test3: Success'
  133.   else:
  134.     print 'Test3: Failure'
  135.  
  136.   for i in range(5):
  137.     t.increment('d')
  138.  
  139.   if t.getCount('d') == 5:
  140.     print 'Test4: Success'
  141.   else:
  142.     print 'Test4: Failure'
  143.  
  144.   if t.getTotalCount() == 30:
  145.     print 'Test5: Success'
  146.   else:
  147.     print 'Test5: Failure'
  148.  
  149.   f = file('tally.txt', 'w')
  150.   t.writeTable(f)
  151.   f.close()
  152.   print "Please open and check tally.txt."
  153.  
  154.   f2 = file('histogram.txt', 'w')
  155.   f = file('tally.txt', 'r')
  156.   t.writeHistogram(f2, f)
  157.   f2.close()
  158.   f.close()
  159.   print "Please open and check histogram.txt."
  160.  
  161.   raw_input("Press the ENTER key to continue...")
  162.  
File 2:
Expand|Select|Wrap|Line Numbers
  1. from TallySheet import *
  2.  
  3. class TallySheetWithHist(TallySheet):
  4.     '''A modified TallySheet Class'''
  5.     def writeHistogram(self, output, source):
  6.       '''Using the information created within writeTable,
  7.       create a histogram that compiles the data from the source file
  8.       into groups of consecutive values.'''
  9.       histo = list()
  10.       text = source.read()         # read the contents of the source file which in this case is tally.txt
  11.       text = text.split('\n')          # split each line in the text
  12.       histo.append(text[0] + '\n')
  13.       histo.append(text[1] + '\n')
  14.       for line in text:                   # if there's a blank line, or a \n at the end of the file, delete it
  15.           if line == '':
  16.             text.remove(line)
  17.  
  18.       numLines = len(text)         # this will help set up how long the loops need to be that are upcoming
  19.  
  20.       if numLines % 2 == 1:      # if the number of lines is odd then the last line needs to be duplicated
  21.           text.append(text[numLines - 1])
  22.       for x in range(2, numLines, 2):       # this loop splits each line into individual pieces then adds the parts together
  23.         j = text[x].split()                          # split the first line
  24.         k = text[x+1].split()                    # split the second line
  25.         label = j[0] + '-' + k[0]               # the label is the first parts added together ie. 'a-b'
  26.         count = int(j[1]) + int(k[1])         # add the counts together
  27.         pct = float(j[2][:-1]) + float(k[2][:-1])       # add the percentages together
  28.         histo.append('%5s %6d %6.2f%%\n' % (label, count, pct))  # create the lines to be written and add them to histo list
  29.  
  30.       for line in histo:
  31.         output.write(line)      # as in writeTable, write a line to the output file
  32.  
  33. if __name__ == '__main__':
  34.   t = TallySheetWithHist('a', 'e')
  35.  
  36.   for i in range(10):
  37.     t.increment('a')
  38.  
  39.   if t.getCount('a') == 10:
  40.     print 'Test1: Success'
  41.   else:
  42.     print 'Test1: Failure'
  43.  
  44.   for i in range(5):
  45.     t.increment('b')
  46.  
  47.   if t.getCount('b') == 5:
  48.     print 'Test2: Success'
  49.   else:
  50.     print 'Test2: Failure'
  51.  
  52.   for i in range(10):
  53.     t.increment('c')
  54.  
  55.   if t.getCount('c') == 10:
  56.     print 'Test3: Success'
  57.   else:
  58.     print 'Test3: Failure'
  59.  
  60.   for i in range(5):
  61.     t.increment('d')
  62.  
  63.   if t.getCount('d') == 5:
  64.     print 'Test4: Success'
  65.   else:
  66.     print 'Test4: Failure'
  67.  
  68.   if t.getTotalCount() == 30:
  69.     print 'Test5: Success'
  70.   else:
  71.     print 'Test5: Failure'
  72.  
  73.   f = file('tally.txt', 'w')
  74.   t.writeTable(f)
  75.   f.close()
  76.   print "Please open and check tally.txt."
  77.  
  78.   f2 = file('histogram.txt', 'w')
  79.   f = file('tally.txt', 'r')
  80.   t.writeHistogram(f2, f)
  81.   f2.close()
  82.   f.close()
  83.   print "Please open and check histogram.txt."
  84.  
  85.   raw_input("Press the ENTER key to continue...")
  86.  
  87.  
Nov 21 '10 #1
Share this Question
Share on Google+
2 Replies


bvdet
Expert Mod 2.5K+
P: 2,851
I have never done a bar chart, but I would use matplotlib if I needed to.
Nov 22 '10 #2

Expert 100+
P: 621
Sorry for the late reply, but I stumbled across some links using Tkinter or matplot (which is usually the best way to go).
http://www.scipy.org/Cookbook/Matplotlib/BarCharts
http://www.koders.com/python/fidDE71...aspx?s=tkinter
http://osgeo-org.1803224.n2.nabble.c...td1922503.html
Nov 24 '10 #3

Post your reply

Sign in to post your reply or Sign up for a free account.