【问题标题】:Is it possible to add Legend to the plot in JFreeChart?是否可以将 Legend 添加到 JFreeChart 中的绘图中?
【发布时间】:2010-06-30 06:04:50
【问题描述】:

我正在尝试在散点图中的绘图下添加一个图例,如下所示。有人知道这是否可能吗?

之前:

之后:

【问题讨论】:

    标签: java charts jfreechart


    【解决方案1】:

    这是我创建的自定义标签生成器:

    public class LegendXYItemLabelGenerator extends StandardXYItemLabelGenerator
            implements XYItemLabelGenerator, Cloneable, PublicCloneable,
            Serializable {
        private LegendItemCollection legendItems;
    
        public LegendXYItemLabelGenerator(LegendItemCollection legendItems) {
            super();
            this.legendItems = legendItems;
        }
    
        @Override
        public String generateLabel(XYDataset dataset, int series, int item) {
            LegendItem legendItem = legendItems.get(series);
            return legendItem.getLabel();
        }
    }
    

    然后我在@Guilaume 的代码之外添加了这段代码:

    renderer.setBaseItemLabelsVisible(true);
    renderer.setBaseItemLabelGenerator(new LegendXYItemLabelGenerator(plot.getLegendItems()));
    

    结果如下:

    【讨论】:

    • +1 就是一个很好的例子。我在另一个答案中建议了另一种方法。
    【解决方案2】:

    扩展StandardXYItemLabelGenerator 通常是一种有用的方法,但提供的constructors 可能就足够了。对于此生成器,MessageFormat ArgumentIndex 值对应于系列名称范围

    NumberFormat format = NumberFormat.getNumberInstance();
    format.setMaximumFractionDigits(2); // etc.
    XYItemLabelGenerator generator =
        new StandardXYItemLabelGenerator("{0} {1} {2}", format, format);
    renderer.setBaseItemLabelGenerator(generator);
    renderer.setBaseItemLabelsVisible(true);
    

    此外,您可以使用

    控制单个系列的标签
    renderer.setSeriesItemLabelsVisible(true);
    

    【讨论】:

    • 对于StandardCategoryToolTipGenerator,另请参见example
    【解决方案3】:

    这是在渲染器上控制的:

    XYPlot plot = (XYPlot) chart.getPlot();
    XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
    renderer.setBaseItemLabelsVisible(true);
    

    【讨论】:

    • 感谢您的回答。我试过这个,但它现在仍然出现。还有什么我可能需要做的吗?也许为每个情节分配标签?
    • 我想我现在明白了。我创建了我自己的名为“LegendXYItemLabelGenerator(..)”的项目标签生成器并让它工作。除了“renderer.setBaseItemLabelsVisible(true);”之外,我还添加了“renderer.setBaseItemLabelGenerator(new LegendXYItemLabelGenerator(plot.getLegendItems()));”
    • 这可能在XYAreaRenderer 上吗?我正在努力让它工作,我可以为XYLineAndShapeRenderer 工作,但相同的代码对XYAreaRenderer 不起作用。'
    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多