From: Andrea R. <ari...@pi...> - 2004-09-23 16:12:12
|
How can I get a box around the plot keys or around a piece of text that I write onto a plot? h = pyx.graph.graphxy(..., key = pyx.graph.graphxy.key.key(??)) h.plot(...) h.text(x,y,mystring,[??]) I've tried but I've not been able to find the right attribute. Looking at your examples page I've seen the "connect.py" example, but it works with canvas and I'm not sure how it can be translated in a graph. The manual hasn't helped me very much, sorry. Thanks in advance, Andrea. |
From: Michael S. <m-s...@us...> - 2004-09-24 07:15:58
|
Hello, On 23.09.04, Andrea Riciputi wrote: > How can I get a box around the plot keys or around a piece of text that > I write onto a plot? The second task is easy, because the text is a canvas itself and provides you with a bbox() method. The first one is not easy, because the key is no canvas and the information about its position is only known to the method graph.graphxy.dokey(). Maybe that is an issue for Andre: Wouldn't it be reasonable to let the key be a canvas that is first transformed and afterwards inserted into the graph? The following example will do. (Note that you can enlarge the bboxes if you wish to) -------------------------------------------------- from pyx import * from pyx.graph import axis,data,key # first define your own class to overwrite graph.graphxy.dokey() class mygraphxy(graph.graphxy): def dokey(self): self.dolayout() if not self.removedomethod(self.dokey): return if self.key is not None: c = self.key.paint(self.plotitems) bbox = c.bbox() def parentchildalign(pmin, pmax, cmin, cmax, pos, dist, inside): ppos = pmin+0.5*(cmax-cmin)+dist+pos*(pmax-pmin-cmax+cmin-2*dist) cpos = 0.5*(cmin+cmax)+(1-inside)*(1-2*pos)*(cmax-cmin+2*dist) return ppos-cpos x = parentchildalign(self.xpos_pt, self.xpos_pt+self.width_pt, bbox.llx_pt, bbox.urx_pt, self.key.hpos, unit.topt(self.key.hdist), self.key.hinside) y = parentchildalign(self.ypos_pt, self.ypos_pt+self.height_pt, bbox.lly_pt, bbox.ury_pt, self.key.vpos, unit.topt(self.key.vdist), self.key.vinside) self.insert(c, [trafo.translate_pt(x, y)]) # ONLY THIS LINE IS DIFFERENT: self.stroke(c.bbox().rect(), [trafo.translate_pt(x, y)]) h = mygraphxy(width=10, key=graph.key.key(pos="tr")) h.plot(data.function("y=sin(x)", min=0, max=5)) h.finish() t = h.text(5, 5, r"hello") h.stroke(t.bbox().enlarged(0.2).rect()) h.writetofile("foo.eps", paperformat="a4") -------------------------------------------------- Michael. -- "A mathematician is a device for turning coffee into theorems" Paul Erdös. |
From: Andre W. <wo...@us...> - 2004-09-24 07:34:25
|
Hi, On 24.09.04, Michael Schindler wrote: > Maybe that is an issue for Andre: Wouldn't it be reasonable to let the > key be a canvas that is first transformed and afterwards inserted into > the graph? I think, it all can be handled within the graph key. And thus it should be handled completely within the graph key. I'll try to write it down later today ... (Beside that I like the generally idea of making the graph key a box. Once we make operations like drawing background and border a generic box feature, we do not even have to handle that in the graph key anymore. Also remember the "enlarging a box"-idea. With circles at the corners or sharp edges ... that would be nice! Sure, Michaels smoothed deformer on sharp edges is even better. But we have to work hard to get all these nice pieces in place and make them play together smoothly ...) 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: Andrea R. <ari...@pi...> - 2004-09-24 08:02:17
|
I'm very sorry, but I'm not able to get the box around my text yet. Here it is a minimal example. h = pyx.graph.graphxy(...) mytext = h.text(x_pos, y_pos, mystring) mytext.bbox() h.writeEPSfile("filename.eps") And the resulting plot has not any bounding box around "mystring". Clearly I'm missing something... Could you explain my fault? Thanks again, Andrea. On 24 Sep 2004, at 09:15, Michael Schindler wrote: > Hello, > > On 23.09.04, Andrea Riciputi wrote: >> How can I get a box around the plot keys or around a piece of text >> that >> I write onto a plot? > > The second task is easy, because the text is a canvas itself and > provides you with a bbox() method. |
From: Michael S. <m-s...@us...> - 2004-09-24 08:17:47
|
On 24.09.04, Andrea Riciputi wrote: > I'm very sorry, but I'm not able to get the box around my text yet. > Here it is a minimal example. > > h = pyx.graph.graphxy(...) > mytext = h.text(x_pos, y_pos, mystring) > mytext.bbox() > h.writeEPSfile("filename.eps") > > And the resulting plot has not any bounding box around "mystring". > Clearly I'm missing something... Could you explain my fault? mytext.bbox() only returns the bbox and does not do anything to h. You _have_ to stroke the rectangle of the bbox in order to see something ;-) h.stroke(mytext.bbox().rect()) will do Michael. -- "A mathematician is a device for turning coffee into theorems" Paul Erdös. |
From: Andrea R. <ari...@pi...> - 2004-09-24 08:40:30
|
Many thanks to all of you! At last I got it. Sorry for my silly=20 questions. Cheers, Andrea. On 24 Sep 2004, at 10:17, Michael Schindler wrote: > On 24.09.04, Andrea Riciputi wrote: >> I'm very sorry, but I'm not able to get the box around my text yet. >> Here it is a minimal example. >> >> h =3D pyx.graph.graphxy(...) >> mytext =3D h.text(x_pos, y_pos, mystring) >> mytext.bbox() >> h.writeEPSfile("filename.eps") >> >> And the resulting plot has not any bounding box around "mystring". >> Clearly I'm missing something... Could you explain my fault? > > mytext.bbox() only returns the bbox and does not do anything to h. > You _have_ to stroke the rectangle of the bbox in order to see > something ;-) > > h.stroke(mytext.bbox().rect()) > > will do > > Michael. > > --=20 > "A mathematician is a device for turning coffee into theorems" > Paul Erd=F6s. > > > ------------------------------------------------------- > This SF.Net email is sponsored by: YOU BE THE JUDGE. Be one of 170 > Project Admins to receive an Apple iPod Mini FREE for your judgement = on > who ports your project to Linux PPC the best. Sponsored by IBM. > Deadline: Sept. 24. Go here: http://sf.net/ppc_contest.php > _______________________________________________ > PyX-user mailing list > PyX...@li... > https://lists.sourceforge.net/lists/listinfo/pyx-user > |
From: Joerg L. <jo...@us...> - 2004-09-24 08:20:19
|
On 24.09.04, Andrea Riciputi wrote: > I'm very sorry, but I'm not able to get the box around my text yet. > Here it is a minimal example. > > h = pyx.graph.graphxy(...) > mytext = h.text(x_pos, y_pos, mystring) > mytext.bbox() > h.writeEPSfile("filename.eps") > > And the resulting plot has not any bounding box around "mystring". > Clearly I'm missing something... Could you explain my fault? You still have to draw the bbox. Before doing so, you might want to enlarge it little bit, as pointed out by Michael: h.stroke(mytext.bbox().enlarged(0.1).path()) Jörg |
From: Andre W. <wo...@us...> - 2004-09-24 08:31:31
|
Hi, so lets make it complete, i.e. draw a border around the graph key. I started from the piaxis example: from math import pi from pyx import * from pyx.graph import axis class mykey(graph.key.key): def paint(self, plotitems): c = canvas.canvas() ci = graph.key.key.paint(self, plotitems) c.stroke(ci.bbox().enlarged(0.2).path(), [deco.filled([color.gray.white])]) c.insert(ci) return c g = graph.graphxy(width=8, key=mykey(pos="bl"), x=axis.linear(min=0, max=2*pi, title="$x$", divisor=pi, texter=axis.texter.rational(suffix=r"\pi")), y=axis.linear(title="$y$")) g.plot(graph.data.function("y=sin(x)", title=r"$\sin(x)$")) g.plot(graph.data.function("y=cos(x)", title=r"$\cos(x)$")) g.finish() g.stroke(g.ygridpath(0)) g.writeEPSfile("piaxis") Here I also filled the graph key area with white color. Currently it would be a bit difficult to make it really "transparent". However, I not sure whether this would be wanted for this case at all ... André PS: I don't understand why there is a path and a rect method in bbox. Jörg, Michael, any ideas? -- by _ _ _ Dr. André Wobst / \ \ / ) wo...@us..., http://www.wobsta.de/ / _ \ \/\/ / PyX - High quality PostScript figures with Python & TeX (_/ \_)_/\_/ visit http://pyx.sourceforge.net/ |
From: Michael S. <m-s...@us...> - 2004-09-24 08:57:12
|
On 24.09.04, Andre Wobst wrote: > class mykey(graph.key.key): > > def paint(self, plotitems): > c = canvas.canvas() > ci = graph.key.key.paint(self, plotitems) > c.stroke(ci.bbox().enlarged(0.2).path(), [deco.filled([color.gray.white])]) > c.insert(ci) > return c > PS: I don't understand why there is a path and a rect method in bbox. > Jörg, Michael, any ideas? Yes. Maybe, someone thought that a bbox is something like a box where a path method is provided. -- just an idea. Of course, it is always a rectangle. Besides, I do not understand why a method that returns a canvas is called graph.key.key.paint :-) Michael. -- "A mathematician is a device for turning coffee into theorems" Paul Erdös. |
From: Andre W. <wo...@us...> - 2004-09-24 09:34:50
|
Hi Michael, On 24.09.04, Michael Schindler wrote: > Besides, I do not understand why a method that returns a canvas is > called graph.key.key.paint :-) That's what a painter always does. You're right, the name isn't perfect. And BWT in the old days it really was the other way around, i.e. a painter got a canvas to paint on. But later on I decided to really paint several choices for an axis partitioning on a canvas. Thus the meaning of what a painter is, changed. Before that there were two distinct methods in an axis painter: a layout and a paint method and only the layout method was needed to rate an axis partitioning. But the whole process was *much* more difficult to handle (storing the state of the painter for the various partitions). And the overhead was very small (doing a layout+paint compared to just a layout). And when you called the layout method, you had to store everything. Hence you can just paint it on a canvas and skip the paint method completely. In that sense the former layout method of an axis is now its paint method. This change was done two years ago ... or so. I don't know, but its a long time ago already. Nevertheless, you can always wrap a painter into another. It doesn't matter whether you provide a canvas to the painter or a painter creates its own canvas. You can finally always insert canvases into each other. It doesn't matter ... 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: Michael J G. <mic...@fa...> - 2004-09-24 08:29:01
|
Andrea Riciputi venit, vidit, dixit 2004-09-24 10:02: > I'm very sorry, but I'm not able to get the box around my text yet. Here > it is a minimal example. > > h = pyx.graph.graphxy(...) > mytext = h.text(x_pos, y_pos, mystring) > mytext.bbox() > h.writeEPSfile("filename.eps") > > And the resulting plot has not any bounding box around "mystring". > Clearly I'm missing something... Could you explain my fault? The bbox() gives you the PostScript bounding box, that is a "set of 4 numbers" describing a minimal rectangle containing the canvas. It doesn't draw anything. mytext.bbox().path() converts this bbox into a path which you can stroke/draw/fill/whatever. So, what you really want is h.stroke(mytext.bbox().path()) Note that you get the bbox from mytext, but you stroke onto the graph canvas h. You will notice that the bbox is very tight. If you want some padding (space between the rectangular frame and its content) you can enlarge the bbox before converting it into a path, like so: h.stroke(mytext.bbox().enlarged(0.1).path()) This is taken from the "connect" example on the pyx webpage. There you can also see how to fill the frame, for example. Cheers, Michael |