Search code examples
javajfreechart

How to display percentage values of label JFreeChart?


I recently discovered JFreeChart for generating simple pie charts. Basically I want to display pies with values of label (in percent) but it only shows label name without value.

Here is my code:

package testPie;

// Import the Swing classes
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// Import the JFreeChart classes
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.data.*;
import org.jfree.data.general.*;

public class First extends JPanel
{
  // Holds the data
  private DefaultPieDataset dataset = new DefaultPieDataset();

  // Create a set of charts
  private JFreeChart chart1;
  private JFreeChart chart2;
  private JFreeChart chart3;
  private JFreeChart chart4;

  // Create a set of panels that can show charts
  private ChartPanel panel1;
  private ChartPanel panel2;
  private ChartPanel panel3;
  private ChartPanel panel4;

  public First()
  {
    // Initialize the dataset
    dataset.setValue( "California", new Double(10.0));
    dataset.setValue( "Arizona", new Double(8.0));
    dataset.setValue( "New Mexico", new Double(8.0));
    dataset.setValue( "Texas", new Double(40.0));
    dataset.setValue( "Louisiana", new Double(8.0) );
    dataset.setValue( "Mississippi", new Double(4.0));
    dataset.setValue( "Alabama", new Double(2.0));
    dataset.setValue( "Florida", new Double(20.0));

    // Create the charts
    chart1 = ChartFactory.createPieChart(
      "Driving Time Spent Per State (Flat Pie Chart)", // The chart title
      dataset,         // The dataset for the chart
      true,          // Is a legend required?
      true,          // Use tooltips
      false          // Configure chart to generate URLs?
    );
    chart2 = ChartFactory.createPieChart(
      "Driving Time Spent Per State (Exploded Pie Chart)", // The chart title
      dataset,         // The dataset for the chart
      true,          // Is a legend required?
      true,          // Use tooltips
      false          // Configure chart to generate URLs?
    );
    PiePlot plot = ( PiePlot )chart2.getPlot();
    plot.setExplodePercent( 3, 0.25 );

    chart3 = ChartFactory.createPieChart3D(
      "Driving Time Spent Per State (3D Pie Chart)", // The chart title
      dataset,         // The dataset for the chart
      true,          // Is a legend required?
      true,          // Use tooltips
      false          // Configure chart to generate URLs?
    );
    chart4 = ChartFactory.createPieChart3D(
      "Driving Time Spent Per State (3D with Transparency)", // The chart title
      dataset,         // The dataset for the chart
      true,          // Is a legend required?
      true,          // Use tooltips
      false          // Configure chart to generate URLs?
    );
    PiePlot3D plot4 = ( PiePlot3D )chart4.getPlot();
    plot4.setForegroundAlpha( 0.6f );

    // Create this panel
    this.setLayout( new GridLayout( 2, 2 ) );
    this.panel1 = new ChartPanel( chart1 );
    this.panel2 = new ChartPanel( chart2 );
    this.panel3 = new ChartPanel( chart3 );
    this.panel4 = new ChartPanel( chart4 );
    this.add( panel1 );
    this.add( panel2 );
    this.add( panel3 );
    this.add( panel4 );
  }

  public static void main( String[] args )
  {
    JFrame frame = new JFrame( "My Trip Driving From CA to FL..." );
    First chart = new First();
    frame.getContentPane().add( chart, BorderLayout.CENTER );
    frame.setSize( 640, 480 );
    frame.setVisible( true );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  }
} 

I simply followed this tutorial, but I can't display values of each labels.


Solution

  • The easy way is using an old version of jfreechart, such as 1.0.1. Using this version I get this result:

    result with version 1.0.1

    The other way, using a recent version of jfreechart such as 1.0.19, is changing the PieSectionLabelGenerator. The default includes only the key of the data set.

    To do this you need to create a custom label format to the standard label generator, like this:

    PieSectionLabelGenerator labelGenerator = new StandardPieSectionLabelGenerator("{0} = {1}");
    

    And change label generator for all plots, like this:

    plot.setLabelGenerator(labelGenerator);
    

    With this I get this result:

    result with version 1.0.19

    If you need the %, use in label format {0} = {2} instead of {0} = {1} and will be displayed California = 10%.

    This is the full example:

    public class First extends JPanel {
    
        private static final long serialVersionUID = 4400735172378226919L;
    
        public First() {
            final DefaultPieDataset dataset = new DefaultPieDataset();
    
            dataset.setValue("California", new Double(10.0));
            dataset.setValue("Arizona", new Double(8.0));
            dataset.setValue("New Mexico", new Double(8.0));
            dataset.setValue("Texas", new Double(40.0));
            dataset.setValue("Louisiana", new Double(8.0));
            dataset.setValue("Mississippi", new Double(4.0));
            dataset.setValue("Alabama", new Double(2.0));
            dataset.setValue("Florida", new Double(20.0));
    
            // Create the custom label generator
            final PieSectionLabelGenerator labelGenerator = new StandardPieSectionLabelGenerator("{0} = {1}");
    
            // Create the charts
            final JFreeChart chart1 = ChartFactory.createPieChart("Driving Time Spent Per State (Flat Pie Chart)", dataset, true, true, false);
            final PiePlot plot1 = (PiePlot) chart1.getPlot();
            plot1.setLabelGenerator(labelGenerator);
    
            final JFreeChart chart2 = ChartFactory.createPieChart("Driving Time Spent Per State (Exploded Pie Chart)", dataset, true, true, false);
            final PiePlot plot2 = (PiePlot) chart2.getPlot();
            plot2.setExplodePercent("3", 0.25);
            plot2.setLabelGenerator(labelGenerator);
    
            final JFreeChart chart3 = ChartFactory.createPieChart3D("Driving Time Spent Per State (3D Pie Chart)", dataset, true, true, false);
            final PiePlot3D plot3 = (PiePlot3D) chart3.getPlot();
            plot3.setLabelGenerator(labelGenerator);
    
            final JFreeChart chart4 = ChartFactory.createPieChart3D("Driving Time Spent Per State (3D with Transparency)", dataset, true, true, false);
            final PiePlot3D plot4 = (PiePlot3D) chart4.getPlot();
            plot4.setForegroundAlpha(0.6f);
            plot4.setLabelGenerator(labelGenerator);
    
            // Create this panel
            this.setLayout(new GridLayout(2, 2));
            final ChartPanel panel1 = new ChartPanel(chart1);
            final ChartPanel panel2 = new ChartPanel(chart2);
            final ChartPanel panel3 = new ChartPanel(chart3);
            final ChartPanel panel4 = new ChartPanel(chart4);
            this.add(panel1);
            this.add(panel2);
            this.add(panel3);
            this.add(panel4);
        }
    
        public static void main(final String[] args) {
            final JFrame frame = new JFrame("My Trip Driving From CA to FL...");
            final First chart = new First();
            frame.getContentPane().add(chart, BorderLayout.CENTER);
            frame.setSize(640, 480);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
    }