2017-05-04 6 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); 
    } 
} 

2つの問題:

  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. ドメインのhereに示すように、範囲にIntervalMarkerを加えます。

    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

関連する問題