Re: Still trying to draw histograms in VisAD...

Hi Frank,

For some reason I can't run your program, but I suspect
that you can correctly position your bars by adding:

  ConstantMap(-1.0, Display.YAxis)

to your PointMap array. Since none of the RealTypes in
points_ff's MathType (index -> (day, precip)), the default
YAxis of your bars will be 0.0, the middle of the "box".
The ConstantMap should position them at the bottom of the
box. Please let us know if this doesn't help.

Cheers,
Bill

On Thu, 10 Oct 2002, Frank Gibbons wrote:

> Hi,
>
> 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 graph.py or subs.py,
> 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       http://llama.med.harvard.edu/~fgibbons
> #!/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()
>      GMC.setScaleEnable(1)
>
>      for map in (xMap, yMap, pBarMap, pBarScaleMap): #
>          display.addMap(map)
>          map.setScaleEnable(1)
>
>      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
>      scontrol.setShapes([pBars])
>
>      samples_Precip = [] #zeros(Ndays).astype(Float) # precipitation values:
>      point_vals =  []#arange(Ndays).astype(Float)
>      from random import *
>      for i in range(0, Ndays):
>          point_vals.append(i)
>          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) ]
>      points_ff.setSamples(data)
>      ff_Prec.setSamples([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")
>      refer_Pt.setData(points_ff)
>      display.addReference(refer_Pt, PointMap)
>
>      f = JFrame("Bars")
>      f.getContentPane().add(display.getComponent())
>      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)
>      f.setVisible(1)
>
>
> if __name__ == "__main__":
>      main()
>
>
>