2012-01-14 26 views
1

私は先週、JFreeChartに以下のような画像を表示させる方法を見つけることを試みてきました。基本的には、3つのシリーズ(上、中、下)と塗りつぶしがあります。そして、その下に(明るい緑色の)塗りつぶしの色があります。あるいは、おそらく外観というだけの意味では、おそらくそれを呼び出すようなエリア・チャートがあります。XYDifference(レンダラー)グラフの下に領域グラフを作成する

enter image description here

本当に私が出ているものから、不足している唯一のことは、最後の部分である:塗りつぶしの下に/エリアチャート:

enter image description here

私もXYDifferenceRendererをサブクラス化して組み合わせてみましたそれはAreachartのレンダラーと一緒ですが、私はアーチャートの高さをコントロールすることができませんでした。だからそれは無事だった。以前は丸みを帯びた棒グラフを作成する単純なレンダラーとして作成していたので、私はXYDifferenceRendererのコードを変更できるかもしれないと考えました。しかし、XYDifferenceRendererのコードは、JFreeチャートの幾何学的構造や内部動作のほんの一握りであり、タスクは圧倒的でした。だから、どのように "JFreeChartの内部の仕組みをハックすることを含まない"任意の "通常"の方法でこの効果を達成するためのヒント?

答えて

2

古いポストdescribing how to use two renderers in the same plotが見つかりましたが、これはちょうどこの場合のものでした。あなたは

  1. に必要なの下に
    • 一方が他方の下部での値である差プロット
    • の下限である二つの新しいシリーズを作成して塗りつぶしを取得するには

      プロット - しばしばゼロ。簡単に新しいデータセットに追加して、私はプロットは、いくつかのデータセットを持っている可能性があることを知らなかったプロット にこれを追加し

  2. plot.getRangeAxis().getLowerBound()を呼び出すことによって得ました。インデックスにアクセスするだけでアクセスできます。
  3. 新しいレンダラ
  4. を作成してデータセットを「埋める」
    • のための新しいレンダラを作成するには、右のフィルが
    • が新しいレンダラ
  5. する新しいデータセットのrenderererを設定ペイントセット

コードは、塗りつぶしペイントはあなた次第です。

static void addFill(Plot plot) { 

    XYSeries lowerLimitSeries = ((XYSeriesCollection) (plot.getDataset())).getSeries(1); 
    XYSeriesCollection fillSet = new XYSeriesCollection(); 
    double lowerBound = plot.getRangeAxis().getLowerBound(); 
    fillSet.addSeries(lowerLimitSeries); 
    fillSet.addSeries(createLowerFillSeries(lowerLimitSeries, lowerBound)); 
    plot.setDataset(1, fillSet); 
    Paint fillPaint = Color.GREEN; 
    XYDifferenceRenderer fillRenderer = new XYDifferenceRenderer(fillPaint, fillPaint, false); 
    fillRenderer.setSeriesStroke(0, new BasicStroke(0)); //do not show 
    fillRenderer.setSeriesStroke(1, new BasicStroke(0)); //do not show 
    plot.setRenderer(1, fillRenderer); 
    ... 
} 

static XYSeries createLowerFillSeries(XYSeries lowerLimitSeries, double lowerLimit) { 
    int size = lowerLimitSeries.getItems().size(); 
    XYSeries res = new XYSeries("lowerFillSeries"); 
    for (int i = 0; i < size; i++) res.add(new XYDataItem(lowerLimitSeries.getX(i), lowerLimit)); 
    return res; 
} 
+0

ドキュメントから2つのレンダラーを使用する別の例:http://www.java2s.com/Code/Java/Chart/JFreeChartOverlaidBarChartDemo.htm – oligofren