From: Markus M. <me...@me...> - 2004-05-06 15:42:07
|
Hi everyone, just for the record (and for the mailing list archive): The following code describes how to do optimized bitmap output within a PyX canvas. Note that the code below is not particularily well designed or generic, but it shows the idea. It outputs highly optimized postscript code (supports binary encoding, Ascii85 encoding, Hex encoding, and DCT, RLE and deflate (GZIP) filters). LZW is currently not supported (the patent on this will not expire before July 6 2004 in some countries). Disclaimer: This code uses source from the imgtops utility (http://imgtops.sourceforge.net/) and from the Python imaging library (http://www.pythonware.com/products/pil/). These are BSD-like licensed (with advertising clause), and may therefore be incompatible with the GPL in some circumstances. Use common sense. Using the Python code below, one can output a bitmap like this: from pyx import * c =3D canvas.canvas() c.insert(PostscriptImage(0, 0, 130, 80, "image.jpg") c.writeEPSfile("test.eps") Markus =AD--------------------------------- snip -------------------------------- # This is 'postscriptimage.py' import sys, os.path import Image import cStringIO import time import getopt from imgtopslib.dimensions import interpret_dimension import imgtopslib.psimage import pyx # # These are needed as hooks for imgtops compatibility # class PostscriptImageParameters: def __init__( self ): self.level =3D 2 self.force_hex =3D 0 self.skip_rle =3D 0 self.verbose =3D 10 self.strict_eps =3D 0 self.binary_output =3D 0 self.line_length =3D 75 class PostscriptImageLoadedImage: pass =20 # This class represents a bitmap which can be inserted into # a PyX canvas. class PostscriptImage(pyx.base.PSCmd): def __init__(self, posx, posy, width, height, filename): """Constructor""" self.posx =3D pyx.unit.topt(posx) self.posy =3D pyx.unit.topt(posy) self.width =3D pyx.unit.topt(width) self.height =3D pyx.unit.topt(height) self.filename =3D filename =20 def bbox(self): """bbox: Overloaded from pyx.base.PSCmd""" =20 return pyx.bbox._bbox( self.posx, self.posy, self.posx + self.width, self.posy + self.height) =20 def outputPS(self, file): """outputPS: Overloaded from pyx.base.PSCmd""" =20 # Align and scale picture file.write("gsave\n") file.write("%.2f %.2f translate\n" % (self.posx, self.posy)) file.write("%.2f %.2f scale\n" % (self.width, self.height)) # Set params params =3D PostscriptImageParameters() # FIXME: Allow setting of parameters here # (binary mode and postscript level come to mind) =20 # Load image # FIXME: Add proper exception handling here f =3D open(self.filename, 'rb') theBuffer =3D cStringIO.StringIO(f.read()) f.close() theImage =3D Image.open(theBuffer) lim =3D PostscriptImageLoadedImage() lim.buffer =3D theBuffer lim.im =3D theImage lim.size =3D theImage.size # Write picture data imbuffer =3D cStringIO.StringIO() level =3D imgtopslib.psimage.write_ps_image(imbuffer, lim, params) file.write(imbuffer.getvalue()) imbuffer.close() =20 =20 # Postscript footer file.write("grestore\n") |
From: Andre W. <wo...@us...> - 2004-05-26 13:58:55
|
Hi, On 06.05.04, Markus Meyer wrote: > just for the record (and for the mailing list archive): The following > code describes how to do optimized bitmap output within a PyX canvas. another mail for the record: Triggered by some further requests I developed a bitmap module for PyX. I've just uploaded it to the CVS head (see http://cvs.sourceforge.net/viewcvs.py/pyx/pyx/pyx/bitmap.py and http://cvs.sourceforge.net/viewcvs.py/pyx/pyx/manual/bitmap.tex). It works stand alone, but also allows for an easy usage together with the Python Image Library (PIL). In case you do not want to wait until PyX 0.7 (this will still take quite some time), you may fetch it and rename bbox_pt to _bbox to get it working with PyX 0.6.x. André -- by _ _ _ Dr. André Wobst / \ \ / ) wo...@us..., http://www.wobsta.de/ / _ \ \/\/ / PyX - High quality PostScript figures with Python & TeX (_/ \_)_/\_/ visit http://pyx.sourceforge.net/ |
From: Magnus L. H. <ma...@he...> - 2004-05-26 14:47:23
|
Andre Wobst <wo...@us...>: > > another mail for the record: Triggered by some further requests I > developed a bitmap module for PyX. I've just uploaded it to the CVS > head (see http://cvs.sourceforge.net/viewcvs.py/pyx/pyx/pyx/bitmap.py > and http://cvs.sourceforge.net/viewcvs.py/pyx/pyx/manual/bitmap.tex). > It works stand alone, but also allows for an easy usage together with > the Python Image Library (PIL). In case you do not want to wait until > PyX 0.7 (this will still take quite some time), you may fetch it and > rename bbox_pt to _bbox to get it working with PyX 0.6.x. How about putting a sample of it up on the example page, even though it's not part of the distro yet? > Andr=E9 --=20 Magnus Lie Hetland "Wake up!" - Rage Against The Machine http://hetland.org "Shut up!" - Linkin Park |
From: Andre W. <wo...@us...> - 2004-05-26 15:13:37
|
Hi Magnus, On 26.05.04, Magnus Lie Hetland wrote: > How about putting a sample of it up on the example page, even though > it's not part of the distro yet? I'm not sure whether we should add an example, which is not working on a "PyX 0.6.x example page". Anyhow. I would very much appriciate any ideas for a small, usefull, not to complicated but fancy bitmap examples for addition to the example page ... in case somebody has a nice idea in mind, feel free to post it or contact me directly. For 0.7 we *should* have one or several examples. An "ugly is better than nothing"-example could be derived from the manual/functional test. But eye-catching examples are very welcome. André -- by _ _ _ Dr. André Wobst / \ \ / ) wo...@us..., http://www.wobsta.de/ / _ \ \/\/ / PyX - High quality PostScript figures with Python & TeX (_/ \_)_/\_/ visit http://pyx.sourceforge.net/ |
From: Gary P. <pa...@in...> - 2004-06-14 02:58:19
|
How does one put a grid on a graphxy? If this is in the docs, point me to it and accept my apologies. I can find reference to a keyword "gridattrs", but I can't tell if this is what I want, nor what values that keyword can take. Regards, Gary Pajer |
From: Joerg L. <jo...@us...> - 2004-06-14 07:48:32
|
Hello Gary, On 13.06.04, Gary Pajer wrote: > How does one put a grid on a graphxy? The following code draws a grid with lines at the positions of all ticks and subticks. Basically, what you have to do is to create a new axis painter which enables stroking of the grid lines. In the example below, the linewidth is decreased, as well. Then, you can pass this painter to all axes of your graphxy. #!/usr/bin/env python from pyx import * from pyx.graph import axis gridpainter = axis.painter.regular(gridattrs=[deco.stroked, style.linewidth.thin]) g = graph.graphxy(width=10, x=axis.linear(min=0, max=7, painter=gridpainter), y=axis.linear(painter=gridpainter)) g.plot(graph.data.function("y=sin(x)")) g.writeEPSfile("test") > If this is in the docs, point me to it and accept my apologies. It is, but it's not always easy to interpret the meaning of the axis parameters. We should at least make an example along the lines of the one given above. But before doing so, I would be interested, how to achieve a grid only at the level of the ticks (and not the subticks). My obvious tries didn't work... Jörg |
From: Gary P. <pa...@in...> - 2004-06-14 15:00:34
|
Joerg Lehmann wrote: >Hello Gary, > >On 13.06.04, Gary Pajer wrote: > =20 > >>How does one put a grid on a graphxy? >> =20 >> > >The following code draws a grid with lines at the positions of all t= icks >and subticks. Basically, what you have to do is to create a new axis >painter which enables stroking of the grid lines. In the example bel= ow, >the linewidth is decreased, as well. Then, you can pass this painter= to >all axes of your graphxy. > >#!/usr/bin/env python > >from pyx import * >from pyx.graph import axis > >gridpainter =3D axis.painter.regular(gridattrs=3D[deco.stroked, > style.linewidth.thin]) > >g =3D graph.graphxy(width=3D10, > x=3Daxis.linear(min=3D0, max=3D7, painter=3Dgridpa= inter), > y=3Daxis.linear(painter=3Dgridpainter)) > >g.plot(graph.data.function("y=3Dsin(x)")) > >g.writeEPSfile("test") > > =20 > >>If this is in the docs, point me to it and accept my apologies. >> =20 >> > >It is, but it's not always easy to interpret the meaning of the axis >parameters. We should at least make an example along the lines of th= e >one given above. But before doing so, I would be interested, how to >achieve a grid only at the level of the ticks (and not the subticks)= . My >obvious tries didn't work... > =20 > Thank you, your example helps a great deal. I didn't understand wha= t=20 was meant in the docs by "stroke attributes". I'm guessing that the= =20 atrributes listed in the style module (Appendix D in the docs) are al= l=20 possible values for gridattrs. I do not understand deco.stroked. Again, I can't find any docs on= =20 this. help(deco) is too cryptic. If I simply leave deco.stroked out= =20 (i.e., gridattrs=3D[style.linewidth.thin] ) the resulting graph s= eems=20 to be no different. This discussion is probably intended for Section= =20 2.3 of the docs, Attributes and Decorations (currently empty). In the meantime, what you have already told me is sufficient for my= =20 needs (I think). Thanks again. -Gary > J=F6rg > > =20 > |
From: Gary <pa...@in...> - 2004-06-14 17:51:36
|
How can I suppress the printing of labels without turning off ticks or grids? -gary |
From: Joerg L. <jo...@us...> - 2004-06-15 07:36:56
|
Hi, On 14.06.04, Gary wrote: > How can I suppress the printing of labels without turning off ticks or grids? In order to suppress the labels you just have to set labelattrs to None in the axis painter. However, PyX currently isn't able to find a valid axis partitioning, at least in the example given below. To decide whether this is a bug or a feature, I'll leave up to you. Anyway, we can just specify a partitioning manually, as shown in the example. Jörg #!/usr/bin/env python from pyx import * from pyx.graph import axis gridpainter = axis.painter.regular(gridattrs=[style.linewidth.thin], labelattrs=None) g = graph.graphxy(width=10, x=axis.linear(min=0, max=7, painter=gridpainter, parter=axis.parter.linear(0.5)), y=axis.linear(painter=gridpainter, parter=axis.parter.linear(0.5))) g.plot(graph.data.function("y=sin(x)")) g.writeEPSfile("test") |
From: Andre W. <wo...@us...> - 2004-06-24 17:09:37
|
Hi, On 14.06.04, Joerg Lehmann wrote: > It is, but it's not always easy to interpret the meaning of the axis > parameters. We should at least make an example along the lines of the > one given above. But before doing so, I would be interested, how to > achieve a grid only at the level of the ticks (and not the subticks). My > obvious tries didn't work... I'm sorry I couldn't respond earlier. I was on vacation. That what changeable attributes are for. You could do the following: #!/usr/bin/env python from pyx import * from pyx.graph import axis gridpainter = axis.painter.regular(gridattrs=[deco.stroked, attr.changelist([style.linewidth.normal, style.linewidth.Thin])]) g = graph.graphxy(width=10, x=axis.linear(min=0, max=7, painter=gridpainter), y=axis.linear(painter=gridpainter)) g.plot(graph.data.function("y=sin(x)")) g.writeEPSfile("test") What happens is, that for ticks (vs. subticks) the first (vs. the second) of the changeable attributes will be selected. In case a None will be selected, the whole attribute list will be None, so changing style.linewidth.Thin to None in the example above will turn off grid lines for subticks. (Its kind of badly documented. Not even my companion got it ... ;-) But the documentation of the attribute system is already on the TODO list ...) André PS: You don't need deco.stroked since gridattrs are stroke attributes. -- by _ _ _ Dr. André Wobst / \ \ / ) wo...@us..., http://www.wobsta.de/ / _ \ \/\/ / PyX - High quality PostScript figures with Python & TeX (_/ \_)_/\_/ visit http://pyx.sourceforge.net/ |
From: Joerg L. <jo...@us...> - 2004-06-25 07:47:41
|
Hi, On 24.06.04, Andre Wobst wrote: > On 14.06.04, Joerg Lehmann wrote: > > It is, but it's not always easy to interpret the meaning of the axis > > parameters. We should at least make an example along the lines of the > > one given above. But before doing so, I would be interested, how to > > achieve a grid only at the level of the ticks (and not the subticks). My > > obvious tries didn't work... > > I'm sorry I couldn't respond earlier. I was on vacation. > > That what changeable attributes are for. You could do the following: I noticed this, but somehow I couldn't get it to work. [ ... grid example ... ] > What happens is, that for ticks (vs. subticks) the first (vs. the > second) of the changeable attributes will be selected. In case a None > will be selected, the whole attribute list will be None, so changing > style.linewidth.Thin to None in the example above will turn off grid > lines for subticks. > > (Its kind of badly documented. Not even my companion got it ... ;-) > But the documentation of the attribute system is already on the TODO > list ...) Probably, it's also worth an example or an FAQ entry. Jörg |