Plot points instead of lines? JFreeChart PolarChart
Asked Answered
J

4

6

Currently, the PolarChart joins all the coordinates with lines creating a polygon. I just want it to plot each point with a dot and NOT join them together. Is this possible?

I have tried using translateValueThetaRadiusToJava2D() and Graphics2D to draw circles but it's very clunky and contrived.

Any suggestions welcome!

Jampacked answered 12/3, 2010 at 16:7 Comment(0)
J
6

So the DefaultPolarItemRenderer takes in all the polar points, converts the polar points to regular Java2D coordinates, makes a Polygon with those points and then draws it. Here's how I got it to draw dots instead of a polygon:

public class MyDefaultPolarItemRenderer extends DefaultPolarItemRenderer {

    @Override
    public void drawSeries(java.awt.Graphics2D g2, java.awt.geom.Rectangle2D dataArea, PlotRenderingInfo info, PolarPlot plot, XYDataset dataset, int seriesIndex) {


        int numPoints = dataset.getItemCount(seriesIndex);
        for (int i = 0; i < numPoints; i++) {

            double theta = dataset.getXValue(seriesIndex, i);
            double radius = dataset.getYValue(seriesIndex, i);
            Point p = plot.translateValueThetaRadiusToJava2D(theta, radius,
                    dataArea);
            Ellipse2D el = new Ellipse2D.Double(p.x, p.y, 5, 5);
            g2.fill(el);
            g2.draw(el);
        }
    }
}

and then instantiated this class elsewhere:

    MyDefaultPolarItemRenderer dpir = new MyDefaultPolarItemRenderer();
    dpir.setPlot(plot);
    plot.setRenderer(dpir);
Jampacked answered 17/3, 2010 at 18:12 Comment(0)
P
2

This one's a little harder. Given a PolarPlot, you can obtain its AbstractRenderer and set the shape. For example,

PolarPlot plot = (PolarPlot) chart.getPlot();
AbstractRenderer ar = (AbstractRenderer) plot.getRenderer();
ar.setSeriesShape(0, ShapeUtilities.createDiamond(5), true);

The diamond will appear in the legend, but the DefaultPolarItemRenderer neither renders shapes, nor provides line control. You'd have to extend the default renderer and override drawSeries(). XYLineAndShapeRenderer is good example for study; you can see how it's used in TimeSeriesChartDemo1.

If this is terra incognita to you, I'd recommend The JFreeChart Developer Guide.

Disclaimer: Not affiliated with Object Refinery Limited; I'm a satisfied customer and very minor contributor.

Pyrotechnic answered 12/3, 2010 at 20:43 Comment(0)
S
1

This is an excellent discussion, in case you want the function to pick up the color assigned by user to the series

add ...

Color c =(Color)this.lookupSeriesPaint(seriesIndex);
g2.setColor(c);

before ...

g.draw(e1);

there are other functions... use code completion to see what else functions are available against series rendereing with name starting from lookupSeries........(int seriesindex)

Sapro answered 5/5, 2011 at 10:23 Comment(0)
F
1

I found a rather strange way to get the points without any lines connecting them.

I set the Stroke of the renderer to be a thin line, with a dash phase of 0, and length of 1e10:

Stroke dashedStroke = new BasicStroke(
                          0.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                          0.0f, new float[] {0.0f, 1e10f}, 1.0f );
renderer.setSeriesStroke(0, dashedStroke);
Frankhouse answered 27/6, 2017 at 11:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.