Hi Will,
On Fri, Dec 03, 2010 at 11:49:20AM -0600, William Henney wrote:
> Hi list
> 
> I am trying to produce a vector plot with pyx.graph.style.arrow() in
> which the arrow heads do not appear.
> 
> The only working solution I have found is to put
> 
> pyx.graph.style.arrow(arrowattrs=[pyx.color.transparency(1.0)])
> 
> but this does not seem like a "clean" solution.
> 
> The following two attempted solutions did not work:
> 
> 1. pyx.graph.style.arrow(arrowattrs=[attr.clear])
> 
> File 
> "/Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/site-packages/pyx/deco.py",
> line 240, in processPDF
>     raise RuntimeError("Path neither to be stroked nor filled nor
> decorated in another way")
> 
> 2. pyx.graph.style.arrow(arrowsize=0)
> 
> File 
> "/Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/site-packages/pyx/normpath.py",
> line 957, in close
>     raise NormpathException("Normsubpath too short, cannot be closed")
> 
> Is there a better way than transparency to achieve this? The reason I
> don't want arrow heads is that the field I am plotting is of
> polarization "vectors", for which there is no distinction between the
> angle theta and the angle (theta + 180 deg).

Well, the cleanest way I see would be to clone the
graph.style.arrow-class and create a new plot-style which does not plot
an arrow (I call it "arrow_line"). By deriving it from the class
"graph.style.arrow", it behaces exactly as that class. So I only
overwrite one function: the one, which draws the lines+arrows. This
function is a copy from the original function where I just removed the
arrow ;-)

from pyx import *
import math
# derive the class from graph.style.arrow
class arrow_line(graph.style.arrow):
  # overload only the plot-function
  def drawpoint(self, privatedata, sharedata, graph, point):
      if privatedata.lineattrs is not None and privatedata.arrowattrs is not 
None and sharedata.vposvalid:
          linelength_pt = unit.topt(self.linelength)
          x_pt, y_pt = graph.vpos_pt(*sharedata.vpos)
          try:
              angle = point["angle"] + 0.0
              size = point["size"] + 0.0
          except:
              pass
          else:
              if point["size"] > self.epsilon:
                  dx = math.cos(angle*math.pi/180)
                  dy = math.sin(angle*math.pi/180)
                  x1 = x_pt-self.arrowpos*dx*linelength_pt*size
                  y1 = y_pt-self.arrowpos*dy*linelength_pt*size
                  x2 = x_pt+(1-self.arrowpos)*dx*linelength_pt*size
                  y2 = y_pt+(1-self.arrowpos)*dy*linelength_pt*size
                  privatedata.arrowcanvas.stroke(path.line_pt(x1, y1,x2, y2), 
privatedata.lineattrs)
# test & use ist:
# just some data to plot
d = [ [i,j,(i+j)/10.,2*math.pi/10.*i] for i in range(10) for j in range(10)]
# the graph...
g = graph.graphxy(width=10)
g.plot(graph.data.points(d,x=1,y=2,size=3,angle=4),[arrow_line()])
g.writePDFfile("p")


(Of course this code is not 100% clean: You can pass the argument
"arrowsize" to my new class "arrow_line", which is quite stupid... From
that point of view, it would be cleaner to rewrite the complete class.

And the most powerfull solution would be a new arrow-class in pyx, where
the arrow can be passed as parameter ;-))

Axel


------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
PyX-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pyx-user

Reply via email to