2017-06-22 17 views
1

私はXYBoxAnnotationを使用して、JFreeChart上の矩形領域を区切ります。箱の片側を「開いている」、つまり無限に出て行きたいと思います。私はDouble.POSITIVE_INFINITYに値を設定しようとしましたが、これは動作していないようです。私もDouble.MAX_VALUEに設定しようとしましたが、運もありません。このような場合、アノテーションはプロット上にまったく表示されません。例外も例外ではありません。JFreeChart with XYBoxAnnotation片側に開く

以下は、XYBoxAnnotationを生成してプロットに追加する非常に簡単なコードです。

XYBoxAnnotation _axisMarker = new XYBoxAnnotation(xLow, yLow, Double.POSITIVE_INFINITY, yHigh, new BasicStroke(0.5F), Color.WHITE, Color.WHITE); 
_plot.getRenderer().addAnnotation(_axisMarker, Layer.BACKGROUND); 

EDIT:

私は、注釈のためのxの値は、軸のスケールよりはるかに大きかったので、注釈が表示されないた理由があったことを考え出し

。何らかの理由で、十分にズームアウトしないと注釈が表示されなくなります。

下記の@ trashgodの回答により、私は解決策を考え出しました。彼の答えは、私のプロットがズームを許可しているので、私のためにはうまくいかなかったし、ズームアウトするとボックスの端を見ることができた。

まず、私はプロットがズームされたときのために待機するようにPlotChangeListenerを追加しました:

// function to re-draw the annotation 
private void updateAxisMarkers() { 
    _plot.removeChangeListener(_zoomListener); // remove to prevent triggering infinite loop 

    // define xLow, yLow and yHigh... 

    double xHigh = _plot.getDomainAxis().getUpperBound() * 1.1; 
    XYBoxAnnotation _axisMarker = new = new XYBoxAnnotation(xLow, yLow, xHigh, yHigh, new BasicStroke(0.5F), Color.WHITE, Color.WHITE); 
    _plot.getRenderer().addAnnotation(annotation); 

    _plot.addChangeListener(_zoomListener); // add back 
} 

答えて

1

その後
// define PlotChangeListener to update the annotation when the plot is zoomed 
private PlotChangeListener _zoomListener = new PlotChangeListener() { 
    @Override 
    public void plotChanged(PlotChangeEvent plotChangeEvent) { 
    if (_basisIsotope != null) { 
     updateAxisMarkers(); 
    } 
    } 
}; 

は、私は新しいプロットの境界に基づいて注釈を再描画する機能を作成しました

Double.MAX_VALUEは、関連する軸に合わせて縮尺するには大きすぎますが、Double.MAX_VALUE/2は軸の上限より大きな任意の値と同様に機能します。より良い選択肢は、ドメインの最大値をある程度上回る値です。以下の部分は、XYBoxAnnotationを持ついくつかのガウスデータのプロットを陰影付け、42から最大ドメイン値+ 10%までのドメイン境界を持っています。範囲の境界は±1σです。答えを

XYSeriesCollection dataset = createDataset(); 
JFreeChart chart = createChart(dataset); 
Color color = new Color(0, 0, 255, 63); 
double max = dataset.getSeries(0).getMaxX() * 1.1; 
XYBoxAnnotation annotation = new XYBoxAnnotation(
    42, -1, max, 1, new BasicStroke(1f), color, color); 
chart.getXYPlot().getRenderer().addAnnotation(annotation); 

image

+1

感謝。それは私のプロットがズームアウトを許可するので、私にとってはうまくいきませんでした。ズームすると、ボックスの端を見ることができます。しかし、それは私を私の解決に導いてくれました。チャートをズームしたときに待ち受けを聞くために 'PlotChangeListener'を追加し、ボックスの境界を新しいプロット範囲にリセットしました。 – sorayadragon

関連する問題