在数据分析和可视化领域,Java提供了一个强大的开源图表库——JFreeChart。它支持多种图表类型,包括饼图、线图、柱状图、区域图等,并且可以轻松地扩展和自定义。本文将介绍JFreeChart的基本概念、特性、安装方法以及如何使用它来创建图表。
JFreeChart是一个开源的Java图表库,它允许开发者在Java应用程序中创建丰富的图表。这个库以其易用性和强大的功能而广受欢迎。以下是JFreeChart的一些主要特性:
要使用JFreeChart,需要满足以下前提条件:
现在已经对JFreeChart有了基本的了解,接下来将通过几个示例来展示如何使用JFreeChart创建图表。创建图表的过程大致分为三个步骤:
在开始示例之前,需要配置JFreeChart库。安装过程非常简单,只需按照以下步骤操作:
饼图用于直观地表示整体在给定点的百分比。饼图是一个圆形图表,具有大小与所代表数据成比例的扇区。在这个示例中,将创建一个饼图来表示特定季度不同手机制造商的市场份额。这里使用的数据不是实际数据,而是为了演示目的而创建的虚构数据。
创建图表的第一步是创建要显示在图表中的数据的数据集。对于饼图数据,需要实现JFreeChart的org.jfree.data.general.PieDataset接口的数据集。JFreeChart提供了一个实现这个接口的类,将使用这个类。这个类是org.jfree.data.general.DefaultPieDataset。使用这个类,可以像下面这样创建饼图的数据:
DefaultPieDataset objDataset = new DefaultPieDataset();
objDataset.setValue("Apple", 29);
objDataset.setValue("HTC", 15);
objDataset.setValue("Samsung", 24);
objDataset.setValue("LG", 7);
objDataset.setValue("Motorola", 10);
接下来,需要创建饼图。JFreeChart提供了一个ChartFactory类,可以使用它来创建各种类型的图表。对于饼图,需要调用这个工厂的createPieChart()方法。
JFreeChart objChart = ChartFactory.createPieChart(
"Demo Pie Chart",
objDataset,
true,
true,
false
);
最后一步是在目标源上显示图表。在这个示例中,将在屏幕上的框架中显示图表。需要执行以下操作来以这种方式显示图表:
ChartFrame frame = new ChartFrame("Demo", objChart);
frame.pack();
frame.setVisible(true);
柱状图用于提供表格数据的直观表示。可以按照创建饼图的类似步骤轻松地创建柱状图。继续使用用于饼图的示例,假设有两季度的市场份额数据,想要看到不同手机制造商的市场份额从第一季度到第二季度的变化。
柱状图使用的数据集类型是org.jfree.data.category.CategoryDataset。与饼图数据集的默认实现类似,也有一个默认实现类。这个类名为org.jfree.data.category.DefaultCategoryDataset。可以像下面这样使用:
DefaultCategoryDataset objDataset = new DefaultCategoryDataset();
objDataset.setValue(29, "Q1", "Apple");
objDataset.setValue(15, "Q1", "HTC");
objDataset.setValue(24, "Q1", "Samsung");
objDataset.setValue(22, "Q2", "Apple");
objDataset.setValue(18, "Q2", "HTC");
objDataset.setValue(25, "Q2", "Samsung");
与饼图的创建方法类似,ChartFactory也有一个方法来创建柱状图。这个方法的名称是createBarChart()。
JFreeChart objChart = ChartFactory.createBarChart(
"Demo Bar Chart",
"Mobile Manufacturer",
"Market Share",
objDataset,
PlotOrientation.VERTICAL,
true,
true,
false
);
ChartFrame frame = new ChartFrame("Demo", objChart);
frame.pack();
frame.setVisible(true);