Reputation: 73
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.
Upvotes: 3
Views: 6006
Reputation: 6197
The easy way is using an old version of jfreechart
, such as 1.0.1
. Using this version I get this result:
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:
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);
}
}
Upvotes: 8