Mercurial > repos > xuebing > sharplabtool
diff tools/plotting/bar_chart.py @ 0:9071e359b9a3
Uploaded
author | xuebing |
---|---|
date | Fri, 09 Mar 2012 19:37:19 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/plotting/bar_chart.py Fri Mar 09 19:37:19 2012 -0500 @@ -0,0 +1,144 @@ +#!/usr/bin/env python + + +""" +histogram_gnuplot.py <datafile> <xtic column> <column_list> <title> <ylabel> <yrange_min> <yrange_max> <grath_file> +a generic histogram builder based on gnuplot backend + + data_file - tab delimited file with data + xtic_column - column containing labels for x ticks [integer, 0 means no ticks] + column_list - comma separated list of columns to plot + title - title for the entire histrogram + ylabel - y axis label + yrange_max - minimal value at the y axis (integer) + yrange_max - maximal value at the y_axis (integer) + to set yrange to autoscaling assign 0 to yrange_min and yrange_max + graph_file - file to write histogram image to + img_size - as X,Y pair in pixels (e.g., 800,600 or 600,800 etc.) + + + This tool required gnuplot and gnuplot.py + +anton nekrutenko | anton@bx.psu.edu + +""" + +import Gnuplot, Gnuplot.funcutils +import sys, string, tempfile, os + +assert sys.version_info[:2] >= ( 2, 4 ) + +def stop_err(msg): + sys.stderr.write(msg) + sys.exit() + +def main(tmpFileName): + skipped_lines_count = 0 + skipped_lines_index = [] + gf = open(tmpFileName, 'w') + + + try: + in_file = open( sys.argv[1], 'r' ) + xtic = int( sys.argv[2] ) + col_list = string.split( sys.argv[3],"," ) + title = 'set title "' + sys.argv[4] + '"' + ylabel = 'set ylabel "' + sys.argv[5] + '"' + ymin = sys.argv[6] + ymax = sys.argv[7] + img_file = sys.argv[8] + img_size = sys.argv[9] + except: + stop_err("Check arguments\n") + + try: + int( col_list[0] ) + except: + stop_err('You forgot to set columns for plotting\n') + + + for i, line in enumerate( in_file ): + valid = True + line = line.rstrip('\r\n') + if line and not line.startswith( '#' ): + row = [] + try: + fields = line.split( '\t' ) + for col in col_list: + row.append( str( float( fields[int( col )-1] ) ) ) + + except: + valid = False + skipped_lines_count += 1 + skipped_lines_index.append(i) + + else: + valid = False + skipped_lines_count += 1 + skipped_lines_index.append(i) + + if valid and xtic > 0: + row.append( fields[xtic-1] ) + elif valid and xtic == 0: + row.append( str( i ) ) + + if valid: + gf.write( '\t'.join( row ) ) + gf.write( '\n' ) + + if skipped_lines_count < i: + + #prepare 'using' clause of plot statement + + g_plot_command = ' '; + + #set the first column + if xtic > 0: + g_plot_command = "'%s' using 1:xticlabels(%s) ti 'Column %s', " % ( tmpFileName, str( len( row ) ), col_list[0] ) + else: + g_plot_command = "'%s' using 1 ti 'Column %s', " % ( tmpFileName, col_list[0] ) + + #set subsequent columns + + for i in range(1,len(col_list)): + g_plot_command += "'%s' using %s t 'Column %s', " % ( tmpFileName, str( i+1 ), col_list[i] ) + + g_plot_command = g_plot_command.rstrip( ', ' ) + + yrange = 'set yrange [' + ymin + ":" + ymax + ']' + + try: + g = Gnuplot.Gnuplot() + g('reset') + g('set boxwidth 0.9 absolute') + g('set style fill solid 1.00 border -1') + g('set style histogram clustered gap 5 title offset character 0, 0, 0') + g('set xtics border in scale 1,0.5 nomirror rotate by 90 offset character 0, 0, 0') + g('set key invert reverse Left outside') + if xtic == 0: g('unset xtics') + g(title) + g(ylabel) + g_term = 'set terminal png tiny size ' + img_size + g(g_term) + g_out = 'set output "' + img_file + '"' + if ymin != ymax: + g(yrange) + g(g_out) + g('set style data histograms') + g.plot(g_plot_command) + except: + stop_err("Gnuplot error: Data cannot be plotted") + else: + sys.stderr.write('Column(s) %s of your dataset do not contain valid numeric data' %sys.argv[3] ) + + if skipped_lines_count > 0: + sys.stdout.write('\nWARNING. You dataset contain(s) %d invalid lines starting with line #%d. These lines were skipped while building the graph.\n' % ( skipped_lines_count, skipped_lines_index[0]+1 ) ) + + +if __name__ == "__main__": + # The tempfile initialization is here because while inside the main() it seems to create a condition + # when the file is removed before gnuplot has a chance of accessing it + gp_data_file = tempfile.NamedTemporaryFile('w') + Gnuplot.gp.GnuplotOpts.default_term = 'png' + main(gp_data_file.name) +