Hi
I have composed a simple code (see below) to do 2D scatter, but I see no data
points on the screen marked by the defined shape square. Can anyone tell me
what I did wrong in the folowing code?
Thanks a lot. /Helen
------------- code follows -------------
import visad.*;
import visad.java2d.DisplayImplJ2D;
import java.rmi.RemoteException;
import java.awt.*;
import javax.swing.*;
public class ScatterPlot2D {
private RealType time, height, mark, scale, index;
private RealTupleType t_h_tuple;
private FunctionType func_i_tuple;
private Set index_set;
private FlatField vals_ff;
private DataReferenceImpl data_ref;
private DisplayImpl display;
private ScalarMap timeMap, heightMap, markMap, scaleMap;
/** Creates a new instance of ScatterPlot2D */
public ScatterPlot2D() throws RemoteException, VisADException {
time = RealType.getRealType("time");
height = RealType.getRealType("height");
mark = RealType.getRealType("mark");
scale = RealType.getRealType("scale");
t_h_tuple = new RealTupleType( time, height, mark, scale);
index = RealType.getRealType("index");
func_i_tuple = new FunctionType( index, t_h_tuple);
index_set = new Integer1DSet(index, 5);
display = new DisplayImplJ2D("display1");
GraphicsModeControl dispGMC = (GraphicsModeControl)
display.getGraphicsModeControl();
dispGMC.setScaleEnable(true);
timeMap = new ScalarMap( time, Display.XAxis );
heightMap = new ScalarMap( height, Display.YAxis );
markMap = new ScalarMap(mark, Display.Shape);
scaleMap = new ScalarMap(scale, Display.ShapeScale);
timeMap.setRange( -4.0, 4.0);
heightMap.setRange( -10.0, 50.0);
scaleMap.setRange(0.01, 10.0);
// Add maps to display
display.addMap( timeMap );
display.addMap( heightMap );
display.addMap( markMap );
display.addMap( scaleMap );
VisADQuadArray square = new VisADQuadArray();
square.coordinates = new float[]
{0.1f, 0.1f, 0.0f, 0.1f, -0.1f, 0.0f,
-0.1f, -0.1f, 0.0f, -0.1f, 0.1f, 0.0f};
square.vertexCount = square.coordinates.length / 3;
float[][] counts = {{0.0f,1.0f,2.0f, 3.0f,4.0f}};
Gridded1DSet count_set = new Gridded1DSet(mark, counts,
counts[0].length);
VisADGeometryArray[] shapes = {square,square,square,square,square};
ShapeControl shape_control = (ShapeControl) markMap.getControl();
shape_control.setShapes(shapes);
shape_control.setShapeSet(count_set);
float[][] point_vals = new float[][]{{-3.0f, -1.5f, 0.0f, 1.5f,
3.0f,},
{0.0f, 33.75f, 45.0f, 33.75f, 0.0f,},
{0.0f, 1.0f, 2.0f, 3.0f,
4.0f,},
{1.0f, 2.0f, 3.0f, 4.0f,
5.0f,}};
vals_ff = new FlatField( func_i_tuple, index_set);
vals_ff.setSamples( point_vals );
// Create a data reference and set the FlatField as our data
data_ref = new DataReferenceImpl("data_ref");
data_ref.setData( vals_ff );
display.addReference( data_ref);
// Create application window, put display into it
JFrame jframe = new JFrame("VisAD Tutorial example 2_03");
jframe.getContentPane().add(display.getComponent());
// Set window size and make it visible
jframe.setSize(300, 300);
jframe.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws RemoteException,
VisADException {
new ScatterPlot2D();
}
}
Bill Hibbard wrote:
> Hi Helen,
>
> > I like to draw a 2D scatter plot. Following the example P2_04 in
> > tutorial, it is easy to create a 2D scatter plot with certain size
> > points. But how can I change those points to the shapes, such as filled
> > triangle or dimond, with changable ShapeScale?
>
> P2_04 has a Field with MathType ( index -> (time, height) ) and
> ScalarMaps time -> XAxis and height -> YAxis. To use Shape you
> can add ScalarMaps of time or height to Shape and ShapeScale, or
> better yet use shapes to add some new information. For this,
> expand your Field to include other variables, such as:
>
> ( index -> (time, height, u, v) )
>
> and Display with ScalarMaps:
>
> time -> XAxis
> height -> YAxis
> u -> Shape
> v -> ShapeScale
>
> See Test46.java and Test47.java in visad/examples for examples
> of how to use Shape and ShapeScale.
>
> Good luck,
> Bill