如何更改使用循环多个椭圆的颜色(的JFreeChart)

问题描述 投票:2回答:1

我一直在使用一个循环绘制多个椭圆,如下图所示,结果使用一种颜色对所有的省略号是完美的,但我的目标是颜色的每个椭圆用不同的颜色。有没有什么办法让物业Color.BLUE在每次迭代中改变它的价值呢?

for (int i = 0; i < 3; i++)
{
    XYShapeAnnotation unitCircle1 = new XYShapeAnnotation(
        new Ellipse2D.Double((FinalArayOfOptpar[s][i] - Math.abs(FinalArayOfOptpar[s][i + 2])),
            (FinalArayOfOptpar[s][i + 1] - Math.abs(FinalArayOfOptpar[s][i + 3])),
            Math.abs(FinalArayOfOptpar[s][i + 2] * 2.0), Math.abs(FinalArayOfOptpar[s][i + 3] * 2.0)),
        new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER,
            10.2f), Color.BLUE);
    xyPlot.addAnnotation(unitCircle1);
}
jfreechart
1个回答
3
投票

几十XYShapeAnnotations将被建立...所以创建XYShapeAnnotation的多个实例不会为我的目的工作。

令人高兴的是,一个实例是XYShapeAnnotation小只是48字节的每个在下面的例子。你要profile是肯定的。

shape annotation image

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.geom.Ellipse2D;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYShapeAnnotation;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/a/35236100/230513
 */
public class AnnotationTest {

    private static final BasicStroke stroke = new BasicStroke(2.0f);
    private static final int N = 16;
    private static final int S = 8;

    public static void main(String[] args) {
        EventQueue.invokeLater(new AnnotationTest()::display);
    }

    private void display() {
        XYDataset data = createDataset();
        JFreeChart chart = ChartFactory.createXYLineChart("ArcTest", "X", "Y",
            data, PlotOrientation.VERTICAL, true, true, false);
        XYPlot plot = chart.getXYPlot();
        XYLineAndShapeRenderer renderer
            = (XYLineAndShapeRenderer) plot.getRenderer();
        renderer.setBaseShapesVisible(true);
        for (int i = 0; i < N; i++) {
            double x = data.getXValue(0, i) - S / 2;
            double y = data.getYValue(0, i) - S / 2;
            Ellipse2D.Double ellipse = new Ellipse2D.Double(x, y, S, S);
            Color color = Color.getHSBColor((float) i / N, 1, 1);
            renderer.addAnnotation(new XYShapeAnnotation(ellipse, stroke, color));
        }
        ChartFrame frame = new ChartFrame("Test", chart);
        frame.pack();
        frame.setVisible(true);
    }

    private static XYDataset createDataset() {
        XYSeriesCollection result = new XYSeriesCollection();
        XYSeries series = new XYSeries("ArcTest");
        for (int i = 0; i < N; i++) {
            series.add(i * S, i * S);
        }
        result.addSeries(series);
        return result;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.