Hi Jen,
> Hi. I am new to VisAD but it seems really great. Problem is, it's so
> powerful that I'm having trouble figuring out the simple stuff. I've
> been looking at the (very helpful) tutorial at:
>
> http://www.ssec.wisc.edu/~billh/tutorial/s2/Section2.html
>
> I want to do a plot similar to the one in example P2_03 or P2_04, but
> insead of points to represent the data I would like bars. I want to make
> a bar graph, where the bottom of each bar is at a certain point on the x
> axis (in this example, maybe the midpoint of each bar would be at its
> corresponding x value) and the top of each bar is at the height of the
> corresponding y value. Do I have to make a VisADQuadArray for every bar
> I want or is there a simpler solution? Does anybody have/know of a
> simple Bar Chart example in 2d or 3d using VisAD?
You can probably do this using ScalarMaps to Display.Shape.
Say you have a FlatField 'field' with MathType
(index -> (mid, top)) and you want the midpoint of bars at
mid values and tops of bars at top values.
You can probably do this using ScalarMaps to Display.Shape.
Say you have a FlatField 'field' with MathType
(index -> (mid, top)) and you want the midpoint of bars at
mid values and tops of bars at top values. Then do
something like:
// create new_field with (top - mid) values
RealType dif = new RealType("dif");
RealTupleType range = new RealTupleType(mid, top, dif);
FunctionType new_func = new FunctionType(index, range);
Set set = field.getDomainSet();
int length = set.getLength();
float[][] old_values = field.getFloats();
float[][] new_values = new float[3][length];
new_values[0] = old_values[0];
new_values[1] = old_values[1];
float min_mid = Float.MAXIMUM_VALUE;
float max_mid = Float.MINIMUM_VALUE;
float max_dif = Float.MINIMUM_VALUE;
for (int i=0; i<length; i++) {
if (new_values[0][i] < min_mid) min_mid = new_values[0][i];
if (new_values[0][i] > max_mid) max_mid = new_values[0][i];
new_values[2][i] = new_values[1][i] - new_values[0][i];
if (new_values[2][i] > max_mid) max_mid = new_values[2][i];
}
FlatField new_field = new FlatField(new_func, set);
new_field.setSamples(new_values);
// some tuning values for display
float dif_resolution = ...; // desired resolution of dif values
int ndifs = 1 + (int) (max_dif / dif_resolution); // # of dif samples
float width = ...; // width of bar (e.g., 0.02f)
// set up Scalarmaps for display
display.addMap(new ScalarMap(index, Display.XAxis));
ScalarMap mid_map = new ScalarMap(mid, Display.YAxis);
display.addMap(mid_map);
mid_map.setRange(min_mid, max_mid);
display.addMap(new ScalarMap(mid, Display.YAxis));
ScalarMap dif_map = new ScalarMap(dif, Display.Shape);
display.addMap(dif_map);
// set up shapes
ShapeControl control = (ShapeControl) dif_map.getControl();
Linear1DSet dif_set = new Linear1DSet(dif, 0.0, max_dif, ndifs);
float[][] difs = dif_set.getSamples();
VisADQuadArray[] dif_shapes = new VisADQuadArray[ndifs];
for (int i=0; i<ndifs; i++) {
dif_shapes[i] = new VisADQuadArray();
dif_shapes[i].vertexCount = 4;
float hw = 0.5f * width;
float hh = 0.5f * difs[0][i] * (2.0f / (max_mid - min_mid));
dif_shapes[i].coordinates = new float[]
{hw, hh, 0.0f, -hw, hh, 0.0f, -hw, -hh, 0.0f, hw, -hh, 0.0f};
}
control.setShapeSet(dif_set);
control.setShapes(dif_shapes);
I haven't tested this, so it may have bugs, but its the general
idea.
Cheers,
Bill
----------------------------------------------------------
Bill Hibbard, SSEC, 1225 W. Dayton St., Madison, WI 53706
hibbard@xxxxxxxxxxxxxxxxx 608-263-4427 fax: 608-263-6738
http://www.ssec.wisc.edu/~billh/vis.html