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?