This tutorial shows you how to draw XY line charts using JFreechart - the most popular chart generation framework in Java. An XY line chart is suitable for representing dataset in form of series of (x, y) points, such as mathematical graphs, coordinate-based objects, etc. Finally, you will able to create a chart looks like the following:
NOTE: To use JFreechart in your project, add the following JAR files to the project’s classpath:
Here is the skeleton of a Swing program that demonstrates how to draw an XY line chart:
/** * This program demonstrates how to draw XY line chart with XYDataset * using JFreechart library. * @author www.codejava.net * */ public class XYLineChartExample extends JFrame { public XYLineChartExample() { super("XY Line Chart Example with JFreechart"); JPanel chartPanel = createChartPanel(); add(chartPanel, BorderLayout.CENTER); setSize(640, 480); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } private JPanel createChartPanel() { // creates a line chart object // returns the chart panel } private XYDataset createDataset() { // creates an XY dataset... // returns the dataset } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new XYLineChartExample().setVisible(true); } }); } }
This program displays a window that contains a chart panel generated by JFreechart. Now, we are going to see the detailed implementations of the createChartPanel() and createDataset() methods.
Write code for the createDataset() method as follows:
private XYDataset createDataset() { XYSeriesCollection dataset = new XYSeriesCollection(); XYSeries series1 = new XYSeries("Object 1"); XYSeries series2 = new XYSeries("Object 2"); XYSeries series3 = new XYSeries("Object 3"); series1.add(1.0, 2.0); series1.add(2.0, 3.0); series1.add(3.0, 2.5); series1.add(3.5, 2.8); series1.add(4.2, 6.0); series2.add(2.0, 1.0); series2.add(2.5, 2.4); series2.add(3.2, 1.2); series2.add(3.9, 2.8); series2.add(4.6, 3.0); series3.add(1.2, 4.0); series3.add(2.5, 4.4); series3.add(3.8, 4.2); series3.add(4.3, 3.8); series3.add(4.5, 4.0); dataset.addSeries(series1); dataset.addSeries(series2); dataset.addSeries(series3); return dataset; }
This creates some dummy data for an XYDataset which is required by the ChartFactory.createXYLineChart() method. The XYSeriesCollection class is an XYDataset’s implementation which holds a collection of XYSeries. The usage is pretty straightforward. Here are the steps to add (x, y) data for a series:
XYSeriesCollection dataset = new XYSeriesCollection(); XYSeries series1 = new XYSeries("Series Name"); series1.add(x1, y1); series1.add(x2, y2); // ... series1.add(xN, yN); dataset.addSeries(series1);
Note that, by default, the XYSeries class will sort the added items into ascending order by x-values, and duplicate x-values are permitted. If you want to change the defaults, use the appropriate constructors as follows:
boolean autoSort = false; XYSeries series = new XYSeries("Object 1", autoSort);
Or:
boolean autoSort = false; boolean allowDuplicateXValues = false; XYSeries series = new XYSeries("Object 1", autoSort, allowDuplicateXValues);
In reality, the data can be loaded from database, text files, CSV files, Excel files, etc.
Write code for the createChartPanel() method as follows:
private JPanel createChartPanel() { String chartTitle = "Objects Movement Chart"; String xAxisLabel = "X"; String yAxisLabel = "Y"; XYDataset dataset = createDataset(); JFreeChart chart = ChartFactory.createXYLineChart(chartTitle, xAxisLabel, yAxisLabel, dataset); return new ChartPanel(chart); }
The ChartFactory class provides two methods for creating an XY line chart as follows:
The following screenshot is taken when running the above Swing program that creates the line chart using the first method:
The second variant of the createXYLineChart() method allows us to specify the plot orientation, show/hide the legend box… Here’s an example:
boolean showLegend = false; boolean createURL = false; boolean createTooltip = false; JFreeChart chart = ChartFactory.createXYLineChart(chartTitle, xAxisLabel, yAxisLabel, dataset, PlotOrientation.HORIZONTAL, showLegend, createTooltip, createURL);
Here’s the result (the orientation is reversed and there is no legend):
Here are some examples of chart customization provided for your references, in case the default look and feel doesn’t suite your needs.
Basically, we get a reference of the plot from the chart to do the customizations on the plot instance:
XYPlot plot = chart.getXYPlot();
Setting custom renderer for the series lines:
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(); plot.setRenderer(renderer);
Output:
Setting custom paint color and stroke for each series line:
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(); // sets paint color for each series renderer.setSeriesPaint(0, Color.RED); renderer.setSeriesPaint(1, Color.GREEN); renderer.setSeriesPaint(2, Color.YELLOW); // sets thickness for series (using strokes) renderer.setSeriesStroke(0, new BasicStroke(4.0f)); renderer.setSeriesStroke(1, new BasicStroke(3.0f)); renderer.setSeriesStroke(2, new BasicStroke(2.0f)); plot.setRenderer(renderer);
Output:
Setting custom paint color and stroke for the plot’s outlines (chart borders):
plot.setOutlinePaint(Color.BLUE); plot.setOutlineStroke(new BasicStroke(2.0f));
Setting background color for the plot:
plot.setBackgroundPaint(Color.DARK_GRAY);
Setting visibility and paint color for the grid lines:
plot.setRangeGridlinesVisible(true); plot.setRangeGridlinePaint(Color.BLACK); plot.setDomainGridlinesVisible(true); plot.setDomainGridlinePaint(Color.BLACK);
And here is the result of all the customizations above:
The ChartUtilities class provides some methods which we can use to export the chart graphics to an image file. For example, the following code snippet saves the chart to a PNG image file:
File imageFile = new File("XYLineChart.png"); int width = 640; int height = 480; try { ChartUtilities.saveChartAsPNG(imageFile, chart, width, height); } catch (IOException ex) { System.err.println(ex); }
To save as JPEG image, use the saveChartAsJPEG() method.
Other Java Graphics Tutorials: