Nous avons configuré iReport pour générer le graphique suivant:analyse des tendances par incréments de valeur itérative
Les points de données réels sont en bleu, la ligne de tendance est verte. Les problèmes comprennent:
- Trop de points de données pour la ligne de tendance
- Ligne de tendance ne suit pas une courbe de Bézier (spline)
La source du problème est avec la classe incrémenteur. L'incrémenteur reçoit les points de données de manière itérative. Il ne semble pas y avoir de moyen d'obtenir l'ensemble des données. Le code qui calcule la ligne de tendance se présente comme suit:
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));
}
}
Comment décririez-vous créer une représentation plus lisse et plus précise de la ligne de tendance?