1

私は先週、JFreeChart に下の画像のようなものを表示させる方法を見つけようと試みてきました。基本的に、3 つのシリーズ (上、中、下) を見ており、間に塗りつぶしがあります。そして、その下には (明るい緑の) 塗りつぶしの色、または面グラフと呼ぶ人もいるかもしれませんが、見た目だけで意味はありません。

ここに画像の説明を入力

私が思いついたものから実際に欠けている唯一のものは、最後の部分です: 下の塗りつぶし/面グラフ:

ここに画像の説明を入力

XYDifferenceRenderer をサブクラス化し、それを Areachart のレンダラーと組み合わせることさえ試みましたが、Areachart の高さを制御できず、基本的にプロットを一番上まで埋めてしまいました。それは仕方のないことでした。先ほど丸棒グラフを作成する簡易レンダラーを作成したので、XYDifferenceRenderer のコードを変更できるのではないかと考えました。しかし、XYDifferenceRenderer のコードは、JFree チャートのジオメトリと内部動作のほんの一握りであり、その作業は少し圧倒されました。では、この効果を「通常の」方法で実現する方法に関するヒントはありますか (JFreeChart の内部動作をハッキングする必要はありません)。

4

1 に答える 1

2

同じプロットで 2 つのレンダラーを使用する方法を説明している古い投稿を見つけました。

下に塗りつぶすには、次のことが必要です

  1. 2 つの新しいシリーズを作成する
    • 1 つは差分プロットの下限です
    • もう 1 つは、プロットの下部にある値です。多くの場合、ゼロです。電話で簡単に取得plot.getRangeAxis().getLowerBound()
  2. それらを新しいデータセットに追加し、これをプロット に追加します。プロットに複数のデータセットが含まれる可能性があることを知りませんでした。インデックスを使用してそれらにアクセスできることがわかりました。
  3. 「塗りつぶし」データセット用の新しいレンダラーを作成する
    • 新しいレンダラーを作成する
    • 適切な塗りつぶしペイントを設定する
    • 新しいデータセットのレンダラーを新しいレンダラーに設定します

コードは次のようなもので、塗りつぶしペイントは明らかにあなた次第です。

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;
}
于 2012-01-16T12:27:30.993 に答える