如何根据数据集中的值设置 JasperStudio 条形图中条形图的颜色?
How to set color of bar in barChart in JasperStudio based on value in dataset?
我正在子报表中创建条形图。我传递了完全通过代码 (nodeJS) 构建的数据集,它工作得很好。
现在我必须始终为同一元素赋予相同的颜色(barChart 中的条形)。 barChart 中的元素数量是动态的,所以我不能做静态的(我以前是这样做的)。
例如:
- 项目 1 始终为黑色;
- 项目 2 始终为蓝色;
- 项目 3 总是粉红色。
等等。当然,有时只有项目 3,因此通常会为其分配标准系列“0”颜色。但是我需要那个 Item 总是粉红色的,不管它是第一个,第三个等等。
我来到了这里,但我不知道如何走得更远。我找到了一些答案,但它们没有达到我想要的效果
package com.efarmgroup.sina.sios4.jasper;
import java.awt.Color;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.*;
import org.jfree.chart.renderer.category.*;
import java.util.HashMap;
public class customColorSeries implements JRChartCustomizer {
@Override
public void customize(JFreeChart chart, JRChart jasperChart) {
//This is the list of the object. Each of them should have a standard color
Object[] objectList = {"BULLONERIA", "FONDAZIONE o BASAMENTO", "SPALLE", "PILE", "PULVINI", "TRAVI",
"TRAVERSI", "IMPALCATI", "CORDOLI", "ARCHI", "APPARECCHI SPECIALI", "SISTEMAZIONE IDRAULICA",
"MURO", "APPOGGI", "BARRIERA", "GIUNTI", "Portale", "Piedritto sinistro", "Paramento sinistro",
"Volta", "Paramento destro", "Piedritto destro", "Sovrastruttura stradale",
"By Pass / Nicchia", "Elementi accessori"};
// Category Plot: most commonly used to display bar chart
// BarRenderer: create bar charts from data in a category dataset
BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();
// Method required for reading the dataset.
// Table of values that can be accessed using row and column keys.
CategoryDataset cd = chart.getCategoryPlot().getDataset();
// Row gives the series expression
int rc = cd.getRowCount();
for (int i = 0; i < rc; i++) {
//Here I should retrieve the the value of the dataset to perform a simple if
}
}
}
这是子数据集的一个简单例子
evolution_data:
[
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 50,
Object_Name: 'APPOGGI',
Span_Code: 1,
seriesOrder: 0,
color: '#FC6D79' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 8,
Object_Name: 'BARRIERA',
Span_Code: 1,
seriesOrder: 0,
color: '#FC6D79' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 5,
Object_Name: 'APPOGGI',
Span_Code: 2,
seriesOrder: 1,
color: '#A64186' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 3,
Object_Name: 'BARRIERA',
Span_Code: 2,
seriesOrder: 1,
color: '#A64186' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 0,
Object_Name: 'APPOGGI',
Span_Code: 3,
seriesOrder: 2,
color: '#9758C4' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 0,
Object_Name: 'BARRIERA',
Span_Code: 3,
seriesOrder: 2,
color: '#9758C4' }]
颜色应基于数据集中的 "Object_Name" 字段。
我的问题已解决,这是我的解决方案:
public class customColorSeries extends JRAbstractChartCustomizer {
@Override
public void customize(JFreeChart chart, JRChart jasperChart) {
BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();
CategoryDataset catDS = chart.getCategoryPlot().getDataset();
com.fasterxml.jackson.databind.node.ArrayNode seriesColor = (ArrayNode) getParameterValue("seriesColor_P");
HashMap<String, String> customMap = new HashMap<>();
for (int z = 0; z < seriesColor.size(); z++) {
customMap.put(seriesColor.get(z).get("Object_Name").textValue(), seriesColor.get(z).get("Color").textValue());
}
for (int i = 0; i < catDS.getRowCount(); i++) {
if(customMap.containsKey(catDS.getRowKey(i).toString())) {
renderer.setSeriesPaint(i, Color.decode(customMap.get(catDS.getRowKey(i).toString())));
}
}
}
}
我发送一个对象数组,其中每个对象都是这样构建的
{Object_Name: 'APPOGGI', Color: '#ff0000'}
{Object_Name: 'SPALLE', Color: '#f2ca79'}
等等....
作为子报告的参数。然后我使用数据绑定和 HashMap 来处理它并在最后渲染它。
我正在子报表中创建条形图。我传递了完全通过代码 (nodeJS) 构建的数据集,它工作得很好。
现在我必须始终为同一元素赋予相同的颜色(barChart 中的条形)。 barChart 中的元素数量是动态的,所以我不能做静态的(我以前是这样做的)。
例如:
- 项目 1 始终为黑色;
- 项目 2 始终为蓝色;
- 项目 3 总是粉红色。
等等。当然,有时只有项目 3,因此通常会为其分配标准系列“0”颜色。但是我需要那个 Item 总是粉红色的,不管它是第一个,第三个等等。
我来到了这里,但我不知道如何走得更远。我找到了一些答案,但它们没有达到我想要的效果
package com.efarmgroup.sina.sios4.jasper;
import java.awt.Color;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.*;
import org.jfree.chart.renderer.category.*;
import java.util.HashMap;
public class customColorSeries implements JRChartCustomizer {
@Override
public void customize(JFreeChart chart, JRChart jasperChart) {
//This is the list of the object. Each of them should have a standard color
Object[] objectList = {"BULLONERIA", "FONDAZIONE o BASAMENTO", "SPALLE", "PILE", "PULVINI", "TRAVI",
"TRAVERSI", "IMPALCATI", "CORDOLI", "ARCHI", "APPARECCHI SPECIALI", "SISTEMAZIONE IDRAULICA",
"MURO", "APPOGGI", "BARRIERA", "GIUNTI", "Portale", "Piedritto sinistro", "Paramento sinistro",
"Volta", "Paramento destro", "Piedritto destro", "Sovrastruttura stradale",
"By Pass / Nicchia", "Elementi accessori"};
// Category Plot: most commonly used to display bar chart
// BarRenderer: create bar charts from data in a category dataset
BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();
// Method required for reading the dataset.
// Table of values that can be accessed using row and column keys.
CategoryDataset cd = chart.getCategoryPlot().getDataset();
// Row gives the series expression
int rc = cd.getRowCount();
for (int i = 0; i < rc; i++) {
//Here I should retrieve the the value of the dataset to perform a simple if
}
}
}
这是子数据集的一个简单例子
evolution_data:
[
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 50,
Object_Name: 'APPOGGI',
Span_Code: 1,
seriesOrder: 0,
color: '#FC6D79' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 8,
Object_Name: 'BARRIERA',
Span_Code: 1,
seriesOrder: 0,
color: '#FC6D79' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 5,
Object_Name: 'APPOGGI',
Span_Code: 2,
seriesOrder: 1,
color: '#A64186' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 3,
Object_Name: 'BARRIERA',
Span_Code: 2,
seriesOrder: 1,
color: '#A64186' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 0,
Object_Name: 'APPOGGI',
Span_Code: 3,
seriesOrder: 2,
color: '#9758C4' },
{ Building_ID: 1,
Building_Code: 'F010',
Building_Name: 'Quiliano',
Evaluation: 0,
Object_Name: 'BARRIERA',
Span_Code: 3,
seriesOrder: 2,
color: '#9758C4' }]
颜色应基于数据集中的 "Object_Name" 字段。
我的问题已解决,这是我的解决方案:
public class customColorSeries extends JRAbstractChartCustomizer {
@Override
public void customize(JFreeChart chart, JRChart jasperChart) {
BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();
CategoryDataset catDS = chart.getCategoryPlot().getDataset();
com.fasterxml.jackson.databind.node.ArrayNode seriesColor = (ArrayNode) getParameterValue("seriesColor_P");
HashMap<String, String> customMap = new HashMap<>();
for (int z = 0; z < seriesColor.size(); z++) {
customMap.put(seriesColor.get(z).get("Object_Name").textValue(), seriesColor.get(z).get("Color").textValue());
}
for (int i = 0; i < catDS.getRowCount(); i++) {
if(customMap.containsKey(catDS.getRowKey(i).toString())) {
renderer.setSeriesPaint(i, Color.decode(customMap.get(catDS.getRowKey(i).toString())));
}
}
}
}
我发送一个对象数组,其中每个对象都是这样构建的
{Object_Name: 'APPOGGI', Color: '#ff0000'}
{Object_Name: 'SPALLE', Color: '#f2ca79'}
等等....
作为子报告的参数。然后我使用数据绑定和 HashMap 来处理它并在最后渲染它。