Comment définir une palette de couleur dynamique dans un graphique?
Objectif: Appliquer un code couleur sous forme d'Hexa à une label dans un graphique.
Je dispose d'un DataSet qui me renvoie deux colonnes avec le code couleur et le label associé. Dans mon graphique je souhaite appliquer une couleur en fonction de mon abscisse par exemple.
Etape n°1: Extraire cette donnée dans une variable persistante afin que celle soit accessible depuis mon graphique.
Pour cela au niveau de mon Dataset:
beforeOpen
mCode = new java.util.HashMap();
onFetch
1 2 3
| var label = row.colorlabel;
var code = row.colorcode;
mCode.put(label.toLowerCase(),code); |
afterClose
reportContext.setPersistentGlobalVariable("mCode", mCode);
Attention, si le DataSet n'est pas utilisé dans le rapport il ne sera pas joué et donc la Map sera vide, ne oubliez pas 
Etape n°2: Appliquer le code couleur à une barre d'un graphique.
Pour le nuage de point.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
/**
* Called before drawing each datapoint graphical representation or marker.
*
* @param dph
* DataPointHints
* @param fill
* Fill
* @param icsc
* IChartScriptContext
*/
function beforeDrawDataPoint( dph, fill, icsc )
{
Hex2RGB = icsc.getExternalContext().getScriptable().getPersistentGlobalVariable("Hex2RGB");
mColor = icsc.getExternalContext().getScriptable().getPersistentGlobalVariable("mCode");
value = dph.getBaseDisplayValue().toLowerCase();
if (mColor!=null && mColor.containsKey(value)){
rgb = Hex2RGB((String)(mColor.get(value)));
fill.set(rgb[0],rgb[1],rgb[2]);
}else{
fill.set(170,170,170);
}
} |
Pour la légende
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
/**
* Called before drawing the legend item.
*
* @param lerh
* LegendEntryRenderingHints
* @param bounds
* Bounds
* @param icsc
* IChartScriptContext
* @since Version 2.2.0
*/
function beforeDrawLegendItem( lerh, bounds, icsc )
{
Hex2RGB = icsc.getExternalContext().getScriptable().getPersistentGlobalVariable("Hex2RGB");
mColor = icsc.getExternalContext().getScriptable().getPersistentGlobalVariable("mCode");
value = lerh.getLabel().getCaption().getValue().toLowerCase();
if (mColor!=null && mColor.containsKey(value)){
rgb = Hex2RGB((String)(mColor.get(value)));
lerh.getFill().set(rgb[0],rgb[1],rgb[2]);
}
else{
lerh.getFill().set(170,170,170);
}
} |
Hex2RGB est fonction javascript définit dans la méthode beforeFactory.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| function Hex2RGB(val){
var tab = new Array();
val = val.toUpperCase();
for (k=1;k<7;k++) {
temp = val.charAt(k);
if ( temp == 'A' ) {
tab[k-1] = 10;
}else if ( temp == 'B' ) {
tab[k-1] = 11;
}else if ( temp == 'C' ) {
tab[k-1] = 12;
}else if ( temp == 'D' ) {
tab[k-1] = 13;
}else if ( temp == 'E' ) {
tab[k-1] = 14;
}else if ( temp == 'F' ) {
tab[k-1] = 15;
}else{
tab[k-1] = parseInt(temp);
}
}
var r = ((tab[0]* 16) + tab[1]);
var g = ((tab[2]* 16) + tab[3]);
var b = ((tab[4]* 16) + tab[5]);
var rgb = [r,g,b];
return rgb;
}
reportContext.setPersistentGlobalVariable("Hex2RGB", Hex2RGB); |
Partager