tags:

views:

530

answers:

1

I've currently got prefuse to plot a scatter graph, where the X axis is the computer name and the Y axis is its temperature. How do I get it to draw bars showing the values instead of discrete points?

I'm currently using the following code to render the points:

ShapeAction shape = new ShapeAction(group, Constants.SHAPE_RECTANGLE);
ColorAction strokeColor = new DataColorAction(group, dataType, Constants.NUMERICAL, VisualItem.STROKECOLOR, colorPalette);

ActionList draw = new ActionList();
draw.add(shape);
draw.add(strokeColor);
draw.add(new ColorAction(group, VisualItem.FILLCOLOR, 0));
draw.add(new RepaintAction());
m_vis.putAction("draw", draw);

How would I adapt this code to get, instead of a small square at each point, a thick bar going from th bottom of the graph to the point?

Thanks.

A: 

I think I should probably point out how I did this - Stack Overflow is supposed to be a repository too, after all. Earlier in the code was the following:

m_vis.setRendererFactory(new RendererFactory() {
 Renderer yAxisRenderer = new AxisRenderer(Constants.LEFT, Constants.TOP);
 Renderer xAxisRenderer = new AxisRenderer(Constants.CENTER, Constants.FAR_BOTTOM);
 Renderer barRenderer = new ShapeRenderer();

 public Renderer getRenderer(VisualItem item) {
  return item.isInGroup("yAxis") ? yAxisRenderer :
         item.isInGroup("xAxis") ? xAxisRenderer :
         barRenderer;
 }
});

I extended the shape renderer to always return a rectangle of the correct width and height, and positioned it half a bar to the left of where it was supposed to be. If you want to position your bars in the centre, you need to do that yourself - prefuse won't help you.

m_vis.setRendererFactory(new RendererFactory() {
 Renderer yAxisRenderer = new AxisRenderer(Constants.LEFT, Constants.TOP);
 Renderer xAxisRenderer = new AxisRenderer(Constants.CENTER, Constants.FAR_BOTTOM);
 Renderer barRenderer = new ShapeRenderer() {
  protected Shape getRawShape(VisualItem item) {
   double x = item.getX();
   double y = item.getY();
   if (Double.isNaN(x) || Double.isInfinite(x))
    x = getInsets().left + axisWidth + totalBarWidth / 2;
   if (Double.isNaN(y) || Double.isInfinite(y))
    y = 0;

   double width = totalBarWidth / (barCount + 1) - barGap;
   double height = getHeight() - getInsets().bottom - axisHeight - y;
   x -= width / 2;

   return rectangle(x, y, width, height);
  }
 };

 public Renderer getRenderer(VisualItem item) {
  return item.isInGroup("yAxis") ? yAxisRenderer :
         item.isInGroup("xAxis") ? xAxisRenderer :
         barRenderer;
 }
});
Samir Talwar
Could you please have a look at one more prefuse question at http://stackoverflow.com/questions/2273068/how-to-display-3-nodes-with-3-diff-shapes-in-prefuse-library-for-java
Yatendra Goel
I'm afraid I haven't used prefuse in months, and have no idea how to tackle this one. I never really messed with different shapes. Sorry.
Samir Talwar