使用jfreechart

时间:2017-05-04 20:53:25

标签: java charts jfreechart

我想使用JFreeChart绘制一条线,将其颜色更改为高于阈值。它看起来应该是这样,但不能平滑:https://www.amcharts.com/demos/smoothed-line-chart/。 这是我到目前为止所得到的:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Paint;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;

public class Charty extends ApplicationFrame {

    public Charty(String applicationTitle, String chartTitle) {
        super(applicationTitle);
        JFreeChart lineChart = ChartFactory.createXYLineChart(chartTitle, "Years",
            "Number of Schools", createDataset(), PlotOrientation.VERTICAL,
            true, true, false);
        XYPlot plot = lineChart.getXYPlot();
        XYItemRenderer renderer = new StandardXYItemRenderer() {

            @Override
            public Paint getItemPaint(int series, int item) {
                int value = 0;
                // how do I get the value of the current point?
                return value > 50 ? Color.red : Color.yellow;
            }
        };
        plot.setRenderer(renderer);
        ChartPanel chartPanel = new ChartPanel(lineChart);
        chartPanel.setPreferredSize(new Dimension(560, 367));
        setContentPane(chartPanel);
    }

    private XYDataset createDataset() {
        int nPoints = 200;
        final double[][] data = new double[2][nPoints];
        for (int i = 0, j = 0; i < nPoints; i++, j++) {
            data[0][j] = i;
            data[1][j] = Math.random() * 10;
        }
        DefaultXYDataset dataset = new DefaultXYDataset();
        dataset.addSeries("points", data);
        return dataset;
    }

    public static void main(String[] args) {
        Charty chart = new Charty("School Vs Years", "Numer of Schools vs years");
        chart.pack();
        RefineryUtilities.centerFrameOnScreen(chart);
        chart.setVisible(true);
    }
}

这里有两个问题:

  1. 我不知道如何获取当前项目的值。

  2. 即使我得到了这个值,颜色也适用于顶点,但是一旦线越过阈值,我就需要改变颜色。

  3. 必须有某种方法来定义具有自己颜色的区域,但我找不到任何相关的区域。实现这一目标的最简单方法是什么? 如果这是不可能的,或者实现起来真的很复杂,那么如果线保持其颜色但高于阈值的背景颜色与低于阈值的背景颜色不同会更简单吗?

1 个答案:

答案 0 :(得分:1)

  1. 让渲染器访问有效的数据最终引用;您需要在阈值上插值,如here所示。

    XYDataset data = createDataset();
    XYItemRenderer renderer = new StandardXYItemRenderer() {
    
        @Override
        public Paint getItemPaint(int series, int item) {
            double value = data.getYValue(series, item);
            return …;
        }
    };
    
  2. 在范围内添加IntervalMarker,如图所示here

    IntervalMarker target = new IntervalMarker(7.0, 10.0, new Color(1, 0, 0, 1/2f));
    XYPlot plot = lineChart.getXYPlot();
    plot.addRangeMarker(target, Layer.BACKGROUND);
    
  3. image