Still trying to draw histograms in VisAD...


I must say, I'm feeling pretty dense about this, but I just can't see how to do this. At the bottom of this message is a Jython program (based on Java code by Ugo Taddei) that attempts to plot a bar chart of some synthetic data (random numbers mostly between 0 and 0.1, but with a '0' and a '1' thrown in for good measure), where the height of each bar represents the data. Of course, it's not much good without a scale, so I've added a set of dummy variables to generate that (everything with a '2' at the end is related to this). (Bill recommended this as the way to go.)

Now, as you can see, I do indeed have bars whose height seems roughly proportional to the data, and I do have a scale. But for some reason that I absolutely can't fathom, the bars start in the middle of the graph. In other words, I have no idea how to make it so that the bars start down on the horizontal axis. In other words, how do I impose the same scale on the two sets of data? Using setRange on the pBar maps does change the display, but nothing seems to be able to affect where the zero is.

I'm pretty much at my wit's end here. I can't use or, because I need a stand-alone application (I have one - I'm just trying to get this last thing to work in order to make it usable!) I've had a look through the developer's guide, and I didn't see anything that seemed relevant. I really could use more examples - I'd have given up long ago without Ugo's Java examples. Have I overlooked something? Perhaps there is more documentation out there that I've missed. Somebody else must have done this kind of thing before!

I really need help with this one. Thanks in advance.

Frank Gibbons

PhD, Computational Biologist,
Harvard Medical School BCMP/SGM-322, 250 Longwood Ave, Boston MA 02115, USA.
Tel: 617-432-3555 Fax: 617-432-3557
#!/usr/bin/env jython

import java
from visad import *
from visad.python.JPythonMethods import *
from visad.java2d import DisplayImplJ2D
from javax.swing import *
from java.awt import Toolkit

def make_pBars():
    """Make a vertical bar, to be used by a ScalarMap."""
    # initialize pBars: 2 vertex (with (x,y,z), where z is ignored)
    # and coordinates: draw some "arbitrary" line; it will be scaled according
    # to values of RealType intensity
    pBars = VisADLineArray()
    pBars.vertexCount = 2
    x = 1.0
    pBars.coordinates = [0.0, 0.0, 0.0, # bottom
                         0.0, x, 0.0]   # top
    return pBars

def main():
    day = getRealType("day")
    precip = getRealType("Precipitation")
    precip2 = getRealType("Precipitation2")
    func_Prec = FunctionType(day, precip)  # precip = f( days )
    func_Prec2 = FunctionType(day, precip2)  # precip = f( days )

    index = RealType("index")
    d_p_tuple = RealTupleType(day, precip)
    d_p_tuple2 = RealTupleType(day, precip2)
    func_i_tuple = FunctionType(index, d_p_tuple)
    func_i_tuple2 = FunctionType(index, d_p_tuple2)

    Ndays = 30
    firstDay, lastDay = 0, Ndays
    daySet = Linear1DSet(day, firstDay, lastDay, Ndays)
    ff_Prec = FlatField(func_Prec, daySet)
    ff_Prec2 = FlatField(func_Prec2, daySet)

    index_set = Integer1DSet(index, Ndays)

    xMap = ScalarMap(day, Display.XAxis)
    yMap = ScalarMap(precip2, Display.YAxis)
    pBarMap = ScalarMap(precip, Display.Shape)
    pBarScaleMap = ScalarMap(precip, Display.ShapeScale)

    display = DisplayImplJ2D("display")
    GMC = display.getGraphicsModeControl()

    for map in (xMap, yMap, pBarMap, pBarScaleMap): #

    yMap.setRange(0, 1.0)
    pBarMap.setRange(0, 1.0)
    pBarScaleMap.setRange(0, 1.0)

    pBars = make_pBars()
    scontrol = pBarMap.getControl()
    scontrol.setShapeSet(Integer1DSet(1)) # only one value

    samples_Precip = [] #zeros(Ndays).astype(Float) # precipitation values:
    point_vals =  []#arange(Ndays).astype(Float)
    from random import *
    for i in range(0, Ndays):
        samples_Precip.append( 0.1*random() )
    samples_Precip[0], samples_Precip[1] = 0.0, 1.0

    points_ff = FlatField(func_i_tuple, index_set)
    data = [ list(point_vals), list(samples_Precip) ]

    PointMap = [ConstantMap(0.0, Display.Red),
                ConstantMap(1.0, Display.Green),
                ConstantMap(0.0, Display.Blue),
                ConstantMap(0.5, Display.PointSize)]

    refer_Pt = DataReferenceImpl("refer_Pt")
    display.addReference(refer_Pt, PointMap)

    f = JFrame("Bars")
    location = [300, 400] # of top left-hand corner
    f.setSize(location[0], location[1])
    screenSize = Toolkit.getDefaultToolkit().getScreenSize()
    f.setLocation(screenSize.width/2 - location[0]/2,
                     screenSize.height/2 - location[1]/2)

if __name__ == "__main__":