次のグラフを生成するように iReport を構成しました。
実際のデータ ポイントは青で、トレンド ラインは緑です。問題は次のとおりです。
- 傾向線のデータ ポイントが多すぎます
- トレンド ラインがベジエ曲線 (スプライン) に従っていない
問題の原因はインクリメンタ クラスにあります。インクリメンタにはデータ ポイントが繰り返し提供されます。データのセットを取得する方法はないようです。傾向線を計算するコードは次のようになります。
import java.math.BigDecimal;
import net.sf.jasperreports.engine.fill.*;
/**
* Used by an iReport variable to increment its average.
*/
public class MovingAverageIncrementer
implements JRIncrementer {
private BigDecimal average;
private int incr = 0;
/**
* Instantiated by the MovingAverageIncrementerFactory class.
*/
public MovingAverageIncrementer() {
}
/**
* Returns the newly incremented value, which is calculated by averaging
* the previous value from the previous call to this method.
*
* @param jrFillVariable Unused.
* @param object New data point to average.
* @param abstractValueProvider Unused.
* @return The newly incremented value.
*/
public Object increment( JRFillVariable jrFillVariable, Object object,
AbstractValueProvider abstractValueProvider ) {
BigDecimal value = new BigDecimal( ( ( Number )object ).doubleValue() );
// Average every 10 data points
//
if( incr % 10 == 0 ) {
setAverage( ( value.add( getAverage() ).doubleValue() / 2.0 ) );
}
incr++;
return getAverage();
}
/**
* Changes the value that is the moving average.
* @param average The new moving average value.
*/
private void setAverage( BigDecimal average ) {
this.average = average;
}
/**
* Returns the current moving average average.
* @return Value used for plotting on a report.
*/
protected BigDecimal getAverage() {
if( this.average == null ) {
this.average = new BigDecimal( 0 );
}
return this.average;
}
/** Helper method. */
private void setAverage( double d ) {
setAverage( new BigDecimal( d ) );
}
}
トレンド ラインをより滑らかで正確に表現するにはどうすればよいでしょうか?