【问题标题】:How to set stacked bar chart series color dynamically?如何动态设置堆叠条形图系列颜色?
【发布时间】:2023-03-23 11:44:01
【问题描述】:

我在 Eclipse 中的 JasperSoft 6.3.1 中有一个堆积条形图,我正在尝试根据该系列显示颜色。该图表显示随机颜色,而不是为特定系列分配单一颜色。

jrxml

<categorySeries>
    <seriesExpression><![CDATA[$F{name}]]></seriesExpression>
    <categoryExpression><![CDATA[$F{time}]]></categoryExpression>
    <valueExpression><![CDATA[$F{value}]]></valueExpression>
</categorySeries>
</categoryDataset>
    <barPlot>
        <plot>
            <seriesColor $F{name}.equals("JANUARY")?color="#756D72":color="" seriesOrder="0" />
            <seriesColor $F{name}.equals("MARCH")?color="#4B5154":color="" seriesOrder="1" />
            <seriesColor $F{name}.equals("JUNE")?color="#090A09":color="" seriesOrder="2"/>
        </plot>
    <itemLabel/>
    <categoryAxisFormat>
    ....

我正在尝试使用 if 语句将图表系列颜色分配给特定系列名称。我如何在碧玉报告中实现这一目标?

如果系列名称是 JANUARY,则颜色应为黑色,如果没有 JANUARY 的数据,则不应使用黑色。

【问题讨论】:

    标签: java jasper-reports jfreechart


    【解决方案1】:

    我猜你已经注意到了,你可以在 xml 标记中执行 if 语句,jrxml 将简单地无法编译,因为它不再是有效的 xml。

    解决办法是实现自己的JRChartCustomizer

    示例

    java

    找到不同的系列名称并根据名称将Paint设置为渲染器

    public class BarColorCustomizer implements JRChartCustomizer {
    
        @Override
        public void customize(JFreeChart jfchart, JRChart jrchart) {
            //Get the plot
            CategoryPlot  plot = jfchart.getCategoryPlot();
            //Get the dataset
            CategoryDataset dataSet = plot.getDataset();
            //Loop the row count (our series)
            int rowCount = dataSet.getRowCount();
            for (int i = 0; i < rowCount; i++) {
                Comparable<?> rowKey = dataSet.getRowKey(i);
                //Get a custom paint for our series key
                Paint p = getCustomPaint(rowKey);
                if (p!=null){
                    //set the new paint to the renderer
                    plot.getRenderer().setSeriesPaint(i, p);
                }
            }
    
        }
    
        //Example of simple implementation returning Color on basis of value
        private Paint getCustomPaint(Comparable<?> rowKey) {
            if ("JANUARY".equals(rowKey)){
                return Color.BLACK;
            }
            return null;
        }
    }
    

    jrxml

    在图表标签上设置带有完整包名的customizerClass属性

    <barChart>
        <chart evaluationTime="Report" customizerClass="my.custom.BarColorCustomizer">
        ....
    </barChart>
    

    【讨论】:

    • 哇,完美。你拯救了我的一天。我浏览了很多链接,但找不到解决方案。不好意思再问一下,如果是空的,可以隐藏类别颜色栏吗?
    • @joseph 隐藏类别颜色栏?,类别是一组系列?,我不太明白你的意思,反正你可以设置你喜欢的颜色栏和轮廓,甚至在价值上,因此将其设置为背景,您将看不到它;)
    • @Petter Friberg 非常感谢。你回答正确,我想将空类别设置为背景。
    • 很好的解决方案...如果您想从 RGB 字符串设置颜色,请参阅 java2s.com/Tutorial/Java/0261__2D-Graphics/…
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 2023-04-09
    • 2021-03-06
    • 1970-01-01
    • 2021-02-25
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多