【问题标题】:Change line color above a threshold with jfreechart使用 jfreechart 将线条颜色更改为阈值以上
【发布时间】:2017-05-04 20:53:25
【问题描述】:

我想使用 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. 即使我得到了值,颜色也会应用于顶点,但我需要在线条越过阈值时立即改变颜色。

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

【问题讨论】:

    标签: java charts jfreechart


    【解决方案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);
      

    【讨论】:

    • 谢谢垃圾神。这两个项目都有效,但正如预期的那样,项目 1 改变了整个段的颜色,这不是我想要的,但我想我会选择项目 2。
    • 另见ValueMarker;或者,考虑一个根据需要调用Graphics::setClip 的自定义渲染器。
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2011-06-24
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2011-07-07
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多