1import random 2from pyx import * 3 4# introduce a new symbol style where size and color are given by some data 5class changesymbol(graph.style.symbol): 6 7 def __init__(self, sizecolumnname="size", colorcolumnname="color", 8 gradient=color.gradient.Rainbow, 9 symbol=graph.style.symbol.circle, 10 symbolattrs=[deco.filled, deco.stroked([color.gray.black])], 11 **kwargs): 12 # add some configuration parameters and modify some other 13 self.sizecolumnname = sizecolumnname 14 self.colorcolumnname = colorcolumnname 15 self.gradient = gradient 16 graph.style.symbol.__init__(self, symbol=symbol, symbolattrs=symbolattrs, **kwargs) 17 18 def columnnames(self, privatedata, sharedata, agraph, columnnames, dataaxisnames): 19 # register the new column names 20 if self.sizecolumnname not in columnnames: 21 raise ValueError("column '%s' missing" % self.sizecolumnname) 22 if self.colorcolumnname not in columnnames: 23 raise ValueError("column '%s' missing" % self.colorcolumnname) 24 return ([self.sizecolumnname, self.colorcolumnname] + 25 graph.style.symbol.columnnames(self, privatedata, sharedata, agraph, 26 columnnames, dataaxisnames)) 27 28 def drawpoint(self, privatedata, sharedata, graph, point): 29 # replace the original drawpoint method by a slightly revised one 30 if sharedata.vposvalid and privatedata.symbolattrs is not None: 31 x_pt, y_pt = graph.vpos_pt(*sharedata.vpos) 32 color = self.gradient.getcolor(point[self.colorcolumnname]) 33 privatedata.symbol(privatedata.symbolcanvas, x_pt, y_pt, 34 privatedata.size_pt*point[self.sizecolumnname], 35 privatedata.symbolattrs + [color]) 36 37g = graph.graphxy(width=10) 38g.plot(graph.data.points([[random.random() for i in range(4)] 39 for i in range(1000)], 40 x=1, y=2, size=3, color=4), 41 [changesymbol()]) 42g.writeEPSfile("changesymbol") 43g.writePDFfile("changesymbol") 44g.writeSVGfile("changesymbol") 45