Is it possible to add Legend to the plot in JFreeChart?

后端 未结 3 1031
北海茫月
北海茫月 2020-11-27 22:19

I\'m trying to add a legend under the plot in scattered chart as shown below. Anyone knows if this is possible?

Before:

相关标签:
3条回答
  • 2020-11-27 22:36

    This is controlled on the renderer:

    XYPlot plot = (XYPlot) chart.getPlot();
    XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
    renderer.setBaseItemLabelsVisible(true);
    
    0 讨论(0)
  • 2020-11-27 22:38

    Extending StandardXYItemLabelGenerator is often a useful approach, but the supplied constructors may suffice. For this generator, the MessageFormat ArgumentIndex values correspond to the series name, domain and range.

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

    In addition, you can control individual series labeling with

    renderer.setSeriesItemLabelsVisible(true);
    
    0 讨论(0)
  • 2020-11-27 22:43

    Here's the custom label generator that I created:

    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();
        }
    }
    

    and then I added this code in addition to @Guilaume's code:

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

    and here's the result:

    alt text

    0 讨论(0)
提交回复
热议问题