|
@@ -0,0 +1,69 @@
|
|
|
|
+#!/usr/bin/env python
|
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
|
+
|
|
|
|
+from __future__ import print_function
|
|
|
|
+import shutil
|
|
|
|
+import fileinput
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def main(filename, bins, maximum):
|
|
|
|
+ with open(filename) as f:
|
|
|
|
+ content = f.read().split("\n")
|
|
|
|
+ numbers = []
|
|
|
|
+ for line in content:
|
|
|
|
+ line = line.strip()
|
|
|
|
+ if line != "":
|
|
|
|
+ numbers.append(float(line))
|
|
|
|
+ numbers = sorted(numbers)
|
|
|
|
+ minimum = min(numbers)
|
|
|
|
+ bin_counter = [0 for i in range(bins+1)]
|
|
|
|
+ borders = []
|
|
|
|
+ for i, number in enumerate(numbers):
|
|
|
|
+ if number >= minimum + (maximum - minimum)/bins*(bins+1):
|
|
|
|
+ bin_counter[bins] += 1
|
|
|
|
+ elif number < minimum:
|
|
|
|
+ bin_counter[0] += 1
|
|
|
|
+ else:
|
|
|
|
+ for b in range(bins):
|
|
|
|
+ lower = minimum + (maximum - minimum)/bins*b
|
|
|
|
+ upper = minimum + (maximum - minimum)/bins*(b+1)
|
|
|
|
+ if lower <= number < upper:
|
|
|
|
+ bin_counter[b] += 1
|
|
|
|
+ break
|
|
|
|
+ for b in range(bins):
|
|
|
|
+ lower = minimum + (maximum - minimum)/bins*b
|
|
|
|
+ borders.append(str(lower))
|
|
|
|
+ borders.append("\infty")
|
|
|
|
+ return bin_counter, borders
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def modify_template(bin_counter, borders):
|
|
|
|
+ shutil.copyfile("histogram-large-1d-dataset.template.tex",
|
|
|
|
+ "histogram-large-1d-dataset.tex")
|
|
|
|
+ xticklabels = ", ".join(map(lambda n: "$%s$" % n, borders))
|
|
|
|
+ coordinates = ""
|
|
|
|
+ for i, value in enumerate(bin_counter):
|
|
|
|
+ coordinates += "(%i, %i) " % (i, value)
|
|
|
|
+ for line in fileinput.input("histogram-large-1d-dataset.tex",
|
|
|
|
+ inplace=True):
|
|
|
|
+ line = line.replace("{{xticklabels}}", xticklabels)
|
|
|
|
+ line = line.replace("{{coordinates}}", coordinates)
|
|
|
|
+ print(line, end='')
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+if __name__ == '__main__':
|
|
|
|
+ from argparse import ArgumentParser
|
|
|
|
+ parser = ArgumentParser()
|
|
|
|
+ parser.add_argument("-f", "--file", dest="filename",
|
|
|
|
+ default="1ddata.txt",
|
|
|
|
+ help="use FILE as input data", metavar="FILE")
|
|
|
|
+ parser.add_argument("-b", "--bins", dest="bins", type=int,
|
|
|
|
+ default=15,
|
|
|
|
+ help="how many bins should be used")
|
|
|
|
+ parser.add_argument("-m", "--max", dest="max", type=float,
|
|
|
|
+ default=15000,
|
|
|
|
+ help=("what is the maximum number "
|
|
|
|
+ "that should get binned?"))
|
|
|
|
+ args = parser.parse_args()
|
|
|
|
+ bin_counter, borders = main(args.filename, args.bins, args.max)
|
|
|
|
+ modify_template(bin_counter, borders)
|