Re: newbie- can I make a bar graph?

Hi Stewart and hi all,

I've got some code to draw a 2D display with "bars". I've used
VisADLineArray rather than VisADQuadArray, because I've got a display
showing some 365 bars, which are packed up together so closely that one
don't want them thick. (Thickness is nevertheless controlled with
constant maps; see code below).

The idea here is to plot daily precipitation values as "bars" (i.e.
thick lines).

So here we go:

day =   new RealType( "day", null, null );
precip  =  new RealType( "Precipitation", null, null );

// the function precip = f( days )
FunctionType func_Prec = new FunctionType( day , precip );  

// here the day values, as a set, we'll have 365 values
daySet = (Set) new Linear1DSet(  day  , (float) firstDay, (float)
lastDay, 365);

// the flat field
ff_Prec = new FlatField( func_Prec, daySet ); 

// the line array
 pBars = new VisADLineArray();

// scalar maps
xMap    = new  ScalarMap( day, Display.XAxis );
yMap    = new  ScalarMap( precip, Display.YAxis);
      

// more scalar maps: 1st for shaps, and 2nd for shape scale, i.e,
responsible for sacling the shape according to RealType precip

pBarMap = new ScalarMap(precip, Display.Shape);
pBarScaleMap = new ScalarMap(precip, Display.ShapeScale);

// create a dispay...
display1 = new DisplayImplJ2D("display1");
    
// initalize pBars: 2 vertex (with (x,y,z), where z is ignored)
pBars.vertexCount=2;
// and coordinates: draw some "arbitrary" line; it's be scaled according
to values of RealType precip

pBars.coordinates = new float[] {0.0f,  0.0f, 0.0f,    0.0f, -0.10f,
0.0f};
     
// let samples_precip be you precipitatios values:

float[][] samples_Precip = new float[ 1 ][ 365 ];

// fill array with values...
// code to fill array...

// set samples:
 
ff_Prec.setSamples(samples_Precip);

// adda maps to display:

display1.addMap( xMap );
display1.addMap( yMap1);
display1.addMap(pBarMap);
display1.addMap(pBarScaleMap);         

// get shapes control:

ShapeControl scontrol = (ShapeControl) pBarMap.getControl();
scontrol.setShapeSet(new Integer1DSet(1));  // only one value
scontrol.setShapes(new VisADGeometryArray[] {pBars});

// constant map to set bar color and thickness

        ConstantMap[] PrecMaps = {new ConstantMap(0.20f, Display.Red),
                           new ConstantMap(0.50f, Display.Green),
                           new ConstantMap(1.0f, Display.Blue),
                           new ConstantMap(01.50f, Display.LineWidth)};

// set reference's data
refer_Pre = new ReferenceImpl("refer_Pre" );

refer_Pre.setData( ff_Prec  );

// add reference to display, using the constant maps

display1.addReference( refer_Pre, PrecMaps); 
        
// show display...

I hope it works, because I cut and pasted the code above from a more
complex application. You can see the resulting display at:

http://www.geogr.uni-jena.de/~p6taug/demviewer/more/modv.jpg

You could also use a Gridded2D (?) set (actually, and array of those),
which is by far simpler (as Bill said, VisAD sahpes are rather complex:
some of the credits for code above goes to Bill, anyway; especially the
magic parts ;-)

hope it has helped clear up a bit.

Cheers,

Ugo