我正在尝试创建一个条形图,该条形图需要为 N 个类别使用特定的系列颜色,并为其他 1 个类别使用单独的颜色。这是一个例子:
在样机中,类别 1-3 使用 5 种颜色的集合来呈现其系列,而类别 4 使用单一灰色。我的第一种方法是使用定制器类覆盖 getItemPaint() 方法,但我只能弄清楚如何在类别级别而不是系列级别上定义颜色。是否可以在类别和/或系列级别上定义颜色?就像是,
If category != "Category4"
Use colors A, B, C, D, and E in category's series
Else
Use color F in category's series
我的另一个想法是结合 iReport 的系列颜色条形图属性和 getItemPaint() 覆盖;这样我就可以定义要在 iReport 中使用的 5 种颜色,并仅在类别等于“类别 4”的情况下使用 getItemPaint() 覆盖。到目前为止,我没有运气将两者结合起来。如果定义了覆盖,它将覆盖 iReport 的系列颜色属性。
用代码更新:
import java.awt.Color;
import java.awt.Paint;
import net.sf.jasperreports.engine.JRAbstractChartCustomizer;
import net.sf.jasperreports.engine.JRChart;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
public class CustomSeriesColors extends JRAbstractChartCustomizer {
static class CustomRenderer extends BarRenderer {
private final Paint[] colors1;
private final Paint[] colors2;
public CustomRenderer(Paint[] colors1, Paint[] colors2) {
this.colors1 = colors1;
this.colors2 = colors2;
}
//Set custom colors for series according to category
@Override
public Paint getItemPaint(int row, int column) {
CategoryDataset l_jfcDataset = getPlot().getDataset();
String l_rowKey = (String)l_jfcDataset.getRowKey(row);
String l_colKey = (String)l_jfcDataset.getColumnKey(column);
if ("Insufficient Data".equalsIgnoreCase(l_colKey)) {
return this.colors2[row % this.colors1.length];
} else {
return this.colors1[row % this.colors1.length];
}
}
}
public void customize(JFreeChart chart, JRChart jasperChart) {
// Get plot data.
CategoryPlot categoryPlot = chart.getCategoryPlot();
// Define colors to be used by series.
Color[] color1 = new Color[]{new Color(238,0,0), new Color(255,153,0), new Color(211,190,91), new Color(153,204,102), new Color(0,170,0)};
Color[] color2 = new Color[]{new Color(200,200,200)};
// Call CustomRenderer using defined color sets.
categoryPlot.setRenderer(new CustomRenderer(color1,color2));
}
}