使用 jfreechart 更改高于阈值的线条颜色

Change line color above a threshold with 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. 即使我得到了值,颜色也会应用于顶点,但我需要在线条越过阈值时立即更改颜色。

一定有某种方法可以定义具有自己颜色的区域,但我找不到任何相关内容。实现这一目标的最简单方法是什么? 如果这不可能或者实现起来真的很复杂,如果线条保持其颜色但阈值以上的背景颜色与阈值以下的背景颜色不同,是否会更简单?

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

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