-
-
Save smutao/a3541eeafa7582cd726e334b9c14e540 to your computer and use it in GitHub Desktop.
Draw histogram in command line with Python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# draw histogram in command line with Python | |
# smutao@github, July 30, 2022 | |
# | |
# usage: $ cat datafile.txt | python draw_hist_ascii.py [nbins] [nscale] | |
# The input should be one column of numbers to be piped in. | |
# | |
# forked from https://gist.github.com/bgbg | |
from __future__ import print_function | |
import sys | |
import numpy as np | |
def asciihist(it, bins=10, minmax=None, str_tag='', | |
scale_output=30, generate_only=False, print_function=print): | |
"""Create an ASCII histogram from an interable of numbers. | |
Author: Boris Gorelik boris@gorelik.net. based on http://econpy.googlecode.com/svn/trunk/pytrix/pytrix.py | |
License: MIT | |
""" | |
ret = [] | |
itarray = np.asanyarray(it) | |
if minmax == 'auto': | |
minmax = np.percentile(it, [5, 95]) | |
if minmax[0] == minmax[1]: | |
# for very ugly distributions | |
minmax = None | |
if minmax is not None: | |
# discard values that are outside minmax range | |
mn = minmax[0] | |
mx = minmax[1] | |
itarray = itarray[itarray >= mn] | |
itarray = itarray[itarray <= mx] | |
if itarray.size: | |
total = len(itarray) | |
counts, cutoffs = np.histogram(itarray, bins=bins) | |
cutoffs = cutoffs[1:] | |
if str_tag: | |
str_tag = '%s ' % str_tag | |
else: | |
str_tag = '' | |
if scale_output is not None: | |
scaled_counts = counts.astype(float) / counts.sum() * scale_output | |
else: | |
scaled_counts = counts | |
if minmax is not None: | |
ret.append('Trimmed to range (%s - %s)' % (str(minmax[0]), str(minmax[1]))) | |
for cutoff, original_count, scaled_count in zip(cutoffs, counts, scaled_counts): | |
ret.append("{:s}{:>8.2f} |{:<7,d} | {:s}".format( | |
str_tag, | |
cutoff, | |
original_count, | |
"*" * int(scaled_count)) | |
) | |
ret.append( | |
"{:s}{:s} |{:s} | {:s}".format( | |
str_tag, | |
'-' * 8, | |
'-' * 7, | |
'-' * 7 | |
) | |
) | |
ret.append( | |
"{:s}{:>8s} |{:<7,d}".format( | |
str_tag, | |
'N=', | |
total | |
) | |
) | |
else: | |
ret = [] | |
if not generate_only: | |
for line in ret: | |
print_function(line) | |
ret = '\n'.join(ret) | |
return ret | |
if __name__ == '__main__': | |
nbins=30 | |
if len(sys.argv) >= 2: | |
nbins = int(sys.argv[1]) | |
nscale=400 | |
if len(sys.argv) == 3: | |
nscale = int(sys.argv[2]) | |
dataIn =[] | |
for line in sys.stdin: | |
if line.strip() != '': | |
dataIn.append( float(line)) | |
asciihist(dataIn, bins=nbins, scale_output=nscale, minmax=None, str_tag='BIN'); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment