【问题标题】:How to change the color of multiple ellipses using a loop (JFreeChart)如何使用循环更改多个椭圆的颜色(JFreeChart)
【发布时间】:2016-02-04 14:43:36
【问题描述】:

我使用如下所示的循环绘制了多个椭圆,并且为所有椭圆使用一种颜色的结果非常完美,但我的目标是为每个椭圆着色不同的颜色。有没有办法让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);
}

【问题讨论】:

  • 为什么不为example 创建多个XYShapeAnnotation 实例?
  • 谢谢.......我上面说明的代码只是我原始代码的一个例子,其中将创建数十个XYShapeAnnotations,每个椭圆的参数来自特定的计算过程。因此,创建多个 XYShapeAnnotation 实例对我的目的不起作用。我只需要一种使用上述循环更改颜色的方法。

标签: jfreechart


【解决方案1】:

将创建数十个 XYShapeAnnotations...因此创建多个 XYShapeAnnotation 实例对我的目的不起作用。

幸运的是,XYShapeAnnotation 的实例很小——在下面的示例中,每个实例只有 48 个字节。您一定要profile

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;
    }
}

【讨论】:

  • 感谢您的宝贵帮助......我使用了示例中提供的方法 getHSBColor(),它非常适合我的目的......非常感谢
  • Color.getHSBColor((float) i / N, 1, 1);线帮助了我
  • @SatyaRajC:更多例子见here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多