0

in the gnuplot command line you can, for instance, do

gnuplot> plot "fileA.dat" using 1:2 title 'data A', \ "fileB.dat" using 1:3 title 'data B'

using python gnuplot.py, the following function works fine:

def create_plot():
   ...
   for target in TARGET_LIST:
        for protocol in PROTOCOL_LIST:

            input_file_name = "%s/%s.db" % (DATA_DIR, target)
            shortname = input_file_name.split('/')[-1]
            shortname = shortname.rstrip('.db')

            input_list = read_lines(input_file_name)

            write_plot_file_name = '%s/%s.%s.write.out' % (DATA_DIR, shortname, protocol)
            write_plot_file = open(write_plot_file_name, 'w')

            read_plot_file_name = '%s/%s.%s.read.out' % (DATA_DIR, shortname, protocol)
            read_plot_file = open(read_plot_file_name, 'w')

            ping_plot_file_name = '%s/%s.ping.out' % (DATA_DIR, shortname)
            ping_plot_file = open(ping_plot_file_name, 'w')

            for line in input_list[ limit: ]:

                line = line.rstrip("\n")
                line_protocol, line_verb, delta, timestamp = line.split('|')

                if line_protocol == protocol:
                    if line_verb == 'write':
                        write_plot_file.write("%s,%s\n" % (timestamp, delta))
                    else:
                        read_plot_file.write("%s,%s\n" % (timestamp, delta))
                elif line_protocol == 'ping':
                    ping_plot_file.write("%s,%s\n" % (timestamp, delta))

            #gnuplot stuff

            png_file = "%s/%s.%s.png" % (PLOT_DIR, shortname, protocol)

            title = '%s history for %s ' % (protocol, shortname)

            gnuplot = Gnuplot.Gnuplot()
            gnuplot.title(title)
            gnuplot('set style data linespoints')
            gnuplot('set ylabel "seconds"')
            gnuplot('set xlabel "month:day:hour:minute:seconds:millisecond"')
            gnuplot('set xdata time')
            gnuplot('set timefmt "%s"')
            gnuplot('set format x "%m:%d:%H:%M:%S:%MS"')
            gnuplot('set xtics nomirror rotate by -90')
            gnuplot('set datafile separator ","')
            gnuplot('set autoscale')
            gnuplot('set grid xtics ytics')
            gnuplot('set terminal png size 900,899')
            gnuplot('set output "%s"' % (png_file))

            cmd = ' "%s"  using 1:2 axes x1y1 title "write" with lines, \
                   "%s"  using 1:2 axes x1y1 title "read" with lines, \
                   "%s"  using 1:2 axes x1y2 title "ping" with lines' % \
                   (write_plot_file_name, read_plot_file_name, ping_plot_file_name)

            try:
                gnuplot.plot(cmd)
            except Error as why:
                print "gnuplot choked: %s" % (why)

HOWEVER, when I do the pythonic thing and break this into two functions:


def read_data(): #do the same file/data munging above

png_file = "%s/%s.%s.png" % (PLOT_DIR, shortname, protocol)

title = '%s history for %s ' % (protocol, shortname)

cmd = ' "%s"  using 1:2 axes x1y1 title "write" with lines, \
    "%s"  using 1:2 axes x1y1 title "read" with lines, \
    "%s"  using 1:2 axes x1y2 title "ping" with lines' % \
    (write_plot_file_name, read_plot_file_name, ping_plot_file_name)

def create_plot(png_file, title, cmd):
#call the gnuplot 'set' strings as above 
gnuplot = Gnuplot.Gnuplot()
gnuplot.title(title)
gnuplot('set style data linespoints')
gnuplot('set ylabel "seconds"')
gnuplot('set xlabel "month:day:hour:minute:seconds:millisecond"')
gnuplot('set xdata time')
gnuplot('set timefmt "%s"')
gnuplot('set format x "%m:%d:%H:%M:%S:%MS"')
gnuplot('set xtics nomirror rotate by -90')
gnuplot('set datafile separator ","')
gnuplot('set autoscale')
gnuplot('set grid xtics ytics')
gnuplot('set terminal png size 900,899')
gnuplot('set output "%s"' % (png_file))`) 

gnuplot.plot(cmd) this fails in any number of interesting ways, apparently because gnuplot is trying to plot the string itself rather than interpret it as it does in the first case.

what's going on here? is there any way around this?

user498844
  • 31
  • 1
  • 4
  • Can you put here the exact error message? Probably all you need to do is cast to the appropriate datatype. – Navi Jan 05 '11 at 21:11
  • the failure is in gnuplot. as coded above: line 0: warning: Skipping data file with no valid points ...or: line 0: all points y value undefined! ... if you format the cmd string: gnuplot.plot('%s' % (cmd)) yields: line 0: all points y value undefined! ... or ... line 0: x range is invalid ... or line 0: all points y value undefined! – user498844 Jan 06 '11 at 00:09
  • I would say something has gone wrong with your set commands when you move them. Can you post the "set stings as above" The error messages suggest that gnuplot is opening the file but cannot read it - as with http://stackoverflow.com/questions/4164052/gnuplot-v4-4-problem-plotting-using-timeseries-x-axis/4164684#4164684 – Tom Jan 06 '11 at 10:52
  • aarrghg. no formatting in comments. I added it into the example above – user498844 Jan 06 '11 at 18:28

1 Answers1

0

got it:

neither function does a file.close (bad! bad!), which is OK within the scope of a single function- the file descriptor is still valid.

when

write_plot_file.close()
read_plot_file.close()
ping_plot_file.close()

is included in read_data() everything is better.

user498844
  • 31
  • 1
  • 4