I think this topic has come up before, but i don't think anything has resulted
from it.
I'd like a way for saving a plot from from matplotlib, so that it can be
re-rendered later, possibly with a different backend, maybe to a different
size, and maybe with changes to the labels. This would save me having to rerun
the simulation that generated the plot.
Ideally this would work by having a save_plot() function, that would save all
state of the current plot into a file. This could then be loaded by a program
to regenerate that plot.
I have made a rough prototype to demonstrate. It is incomplete. It only
implements a very small subset of pylab.
I shall attach some files (if these get mangled, then i can upload them
somewhere).
example1 and example2 are what the plot files might look like.
plot.py renders the plot files.
eg.
plot.py example1
plot.py example2 example.png
fakepylab.py is a wrapper around pylab that record you plotting, and offers a
save_plot() function
test.py is script that uses fakepylab to create a plot file.
So does any of this look useful? What more might it need to be useful?
Any comments on the file format. Is there an existing standard that could be
used instead? Would XML be better than plain ascii?
Sam Tygier
title example plot
xlabel displacemnt / m
ylabel time / s
data x
1
2
3
4
5
6
7
8
9
10
enddata
data y
2.1
2.3
2.7
3.1
3.6
4.2
5.0
5.7
6.7
7.4
enddata
plot x y
data x
1
2
3
4
5
6
7
8
9
10
enddata
data y
2.1
2.3
2.7
3.1
3.6
4.2
5.0
5.7
6.7
7.4
enddata
data z
5.1
6.3
7.7
8.1
9.6
8.2
7.0
6.7
5.7
4.4
enddata
subplot 121
title example plot
xlabel displacemnt / m
ylabel time / s
plot x y
subplot 122
title second plot
xlabel displacemnt / m
ylabel time / s
plot x z
#!/usr/bin/env python
import pylab as _pylab
for pylab_item in dir(_pylab):
globals()[pylab_item] = eval("_pylab.%s"%pylab_item)
_output_buffer = []
def title(t):
_output_buffer.append("title %s"%t)
_pylab.title(t)
def xlabel(t):
_output_buffer.append("xlabel %s"%t)
_pylab.xlabel(t)
def ylabel(t):
_output_buffer.append("ylabel %s"%t)
_pylab.ylabel(t)
def subplot(t):
_output_buffer.append("subplot %s"%t)
_pylab.subplot(t)
def plot(x, y):
_output_buffer.append("data x")
for point in x:
_output_buffer.append(str(point))
_output_buffer.append("enddata")
_output_buffer.append("data y")
for point in y:
_output_buffer.append(str(point))
_output_buffer.append("enddata")
_output_buffer.append("plot x y")
_pylab.plot(x, y)
def save_plot(fname):
global _output_buffer
fh = open(fname,'w')
fh.write("\n".join(_output_buffer))
fh.write('\n')
fh.close()
_output_buffer = []
#!/usr/bin/env python
import sys
import numpy
infile = open(sys.argv[1])
try:
outfilename = sys.argv[2]
outmode = "file"
except IndexError:
outmode = "screen"
outfilename = None
if outmode == "file":
if outfilename.endswith('.ps') or outfilename.endswith('.eps'):
import matplotlib
matplotlib.use('ps')
if outfilename.endswith('.pdf'):
import matplotlib
matplotlib.use('pdf')
if outfilename.endswith('.png'):
import matplotlib
matplotlib.use('Agg')
import pylab
plot_param = dict(title='', xlabel='', ylabel='')
plot_data = dict()
infilei = (line.strip() for line in infile if line.strip() != '' and not line.startswith('#'))
for line in infilei:
keyword, dummy, args = line.partition(' ')
if keyword in ['title', 'xlabel', 'ylabel']:
plot_param[keyword] = args
continue
if keyword == "data":
data = []
dataname = args.split()[0]
for dataline in infilei:
if dataline == "enddata":
break
data.append(float(dataline))
plot_data[dataname] = numpy.array(data)
continue
if keyword == "subplot":
plot_param = dict(title='', xlabel='', ylabel='')
pylab.subplot(args)
if keyword == "plot":
x, y = args.split()
pylab.title(plot_param['title'])
pylab.xlabel(plot_param['xlabel'])
pylab.ylabel(plot_param['ylabel'])
pylab.plot(plot_data[x], plot_data[y])
continue
print "unhandled line:", line
if outmode == "screen":
pylab.show()
else:
pylab.savefig(outfilename)
#!/usr/bin/env python
import fakepylab as p
p.title("hello")
p.plot([1,2,3,4],[2,3,2,1])
p.show()
p.save_plot("test")
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Matplotlib-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel