First, I should apologize for being a troll on this list, I post
questions but no answers. Sorry. I'm still learning and thus am not
really qualified to help in answering any questions yet. Thanks for your
patience and help.

Some time back I asked about plotting bar graphs with different colours.
I managed to adapt the code and it is working nicely for me. 

I have two issues. Right now, my chart is being produced in a horizontal
format and I'm using \rotatebox in LaTeX to orient it the way I want. I
would prefer to produce with horizontal bars.

Second, is that the number of bars on different graphs changes, and
there are subtle variations in the size of the horizontal bars. This
code is being used to produce a book in which some graphs will have only
2 or 3 bars and others will have 10 or 12. I need the bars and font
sizes to remain constant. Any suggestions?

This is my current code:

    # import data
    d = graph.data.list(habdata, title="habitat data", lineno=0,
habitat=1, use=2, C=3, M=4, Y=5, K=6)  
  
    # determine number of bars
    barcount=len(d.columns["C"])
    
    barmax = max(d.columns["use"])*1.2
    
    barwidth = barcount
    barheight = 5
    
    # create data list tailored to meet this data set
    datalist = [(d.columns["habitat"][x],d.columns["use"][x],True,
graph.style.bar([color.cmyk(d.columns["C"][x],d.columns["M"][x],
d.columns["Y"][x],          
d.columns["K"][x]),]),barmax, '%d\%%' %
(d.columns["use"][x])) for x in range(0, barcount)]    
    # NOTE: must use escape character to keep percent sign 
    # from being interpreted as a format string
    
    # prepare the graphbarcount*1.1
    g = graph.graphxy(width=barwidth, height=barheight, 
        x=graph.axis.bar(painter=graph.axis.painter.bar(
        nameattrs=[trafo.rotate(90),text.halign.right,text.size.Large],
basepathattrs=None)),         y=graph.axis.linear(painter=None),
y2=None, x2=None)    
    # plot it
    g.plot(graph.data.list(datalist,
xname=1,y=2,multistyle=3,barstyle=4,        stack=5,stacktext=6), 
        [multistylebar(),
        graph.style.stackedbarpos("stack"),
        graph.style.bar([color.cmyk(0.0, 0.0, 0.0,
0.0),deco.stroked.clear]),       
graph.style.text("stacktext",textattrs=[trafo.rotate(90),text.halign.bo
xright,text.size.Large])])    
    # write to a file   
    outfile = string.join([graphdir,
"/",string.lower(speciescode),"_habitats.eps"],'')   
g.writeEPSfile(outfile)


FYI my multibar() class is as follows:
from pyx import *

# Define class that allows for bars with individual styles

class multistylebar(graph.style.bar):

    defaultmultistylebarattrs = [color.palette.ReverseRainbow,
deco.stroked([color.grey.black, style.linewidth.THICK])]

    def __init__(self, multistylebarattrs=[], **args):
        self.multistylebarattrs = multistylebarattrs
        graph.style.bar.__init__(self, **args)

    def columnnames(self, privatedata, sharedata, agraph, columnnames):
        if "multistyle" not in columnnames:
            raise ValueError("multistyle missing")
        if "barstyle" not in columnnames:
            raise ValueError("barstyle missing")
        return ["multistyle"] + ["barstyle"] +
graph.style.bar.columnnames(self, privatedata, sharedata, agraph,
columnnames)

    def selectstyle(self, privatedata, sharedata, agraph, selectindex,
selecttotal):        
        graph.style.bar.selectstyle(self, privatedata,
sharedata, agraph, selectindex, selecttotal)       
        privatedata.multistylebarattrs =
attr.selectattrs(self.defaultmultistylebarattrs +
self.multistylebarattrs, selectindex, selecttotal)

    def drawpoint(self, privatedata, sharedata, agraph, point):
        if point["multistyle"]:
            savebarattrs = privatedata.barattrs
            privatedata.barattrs = point["barstyle"].barattrs
        graph.style.bar.drawpoint(self, privatedata, sharedata, agraph,
point)        if point["multistyle"]:
            privatedata.barattrs = savebarattrs

-- 
Trevor Wiens


_______________________________________________
PyX-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pyx-user

Reply via email to