2017-05-04 73 views
1

我想使用JFreeChart繪製一條線,該線的顏色在閾值之上變化。它應該看起來像這樣,但不平滑:https://www.amcharts.com/demos/smoothed-line-chart/。 這是我走到這一步:使用jfreechart將線條顏色改變到閾值以上

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

image

+1

謝謝trashgod。這兩個項目的工作,但如預期項目1改變了整個部分的顏色,這不完全是我想要的,但我想我會去與項目2 – corneliu

+0

也參見'ValueMarker';或者,考慮根據需要調用「Graphics :: setClip」的自定義渲染器。 – trashgod