1. 概述
在本教程中,我们将了解如何使用JFreeChart,这是一个用于创建各种图表的综合Java库。我们可以使用它来将图形数据表示集成到Swing应用程序中。它还包括一个单独的JavaFX扩展。
我们将从基础开始,涵盖设置和图表创建,并尝试几种不同类型的图表。
2. 创建我们的第一个图表
JFreeChart允许我们创建折线图、条形图、饼图、散点图、时间序列图、直方图等,它还可以将不同的图表组合成一个图。
2.1 设置依赖
首先,我们需要将jfreechart添加到pom.xml文件中:
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.4</version>
</dependency>
我们应该始终检查最新版本及其JDK兼容性,以确保我们的项目是最新的且正常运行。在这种情况下,版本1.5.4需要JDK 8或更高版本。
2.2 创建基本折线图
让我们首先使用DefaultCategoryDataset为我们的图表创建一个数据集:
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(200, "Sales", "January");
dataset.addValue(150, "Sales", "February");
dataset.addValue(180, "Sales", "March");
dataset.addValue(260, "Sales", "April");
dataset.addValue(300, "Sales", "May");
现在,我们可以创建一个JFreeChart对象,使用上面的数据集来绘制折线图。
ChartFactory.createLineChart方法将图表标题、x轴和y轴标签以及数据集作为参数:
JFreeChart chart = ChartFactory.createLineChart(
"Monthly Sales",
"Month",
"Sales",
dataset);
接下来,ChartPanel对象对于在Swing组件中显示图表至关重要。然后,此对象用作JFrame内容窗格来创建应用程序窗口:
ChartPanel chartPanel = new ChartPanel(chart);
JFrame frame = new JFrame();
frame.setSize(800, 600);
frame.setContentPane(chartPanel);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
当我们运行此代码时,我们将看到月度销售额图表:
如我们所见,我们仅使用少量代码就创建了一个图表。
3. 探索不同类型的图表
在剩下的例子中,我们将尝试一些不同类型的图表。我们不需要对代码进行太多更改。
3.1 条形图
我们可以修改JFreeChart创建代码,将折线图转换为条形图:
JFreeChart chart = ChartFactory.createBarChart(
"Monthly Sales",
"Month",
"Sales",
dataset);
绘制上一个示例中的数据集:
我们可以看到,JFreeChart非常灵活,可以轻松地使用不同类型的图表显示相同的数据。
3.2 饼图
饼图显示整体中各部分的比例。要创建饼图,我们需要使用DefaultPieDataset类来创建数据集,我们还使用createPieChart()方法来构建JFreeChart对象:
DefaultPieDataset<String> dataset = new DefaultPieDataset<>();
dataset.setValue("January", 200);
dataset.setValue("February", 150);
dataset.setValue("March", 180);
JFreeChart chart = ChartFactory.createPieChart(
"Monthly Sales",
dataset,
true, // include legend
true, // generate tooltips
false); // no URLs
当我们将鼠标悬停在饼图的某个部分上时,可以看到工具提示,显示一个月的绝对销售额和总额的相对百分比:
最后,我们应该注意到, ChartFactory.createPieChart ()方法有几种变体,以实现更精细的定制。
3.3 时间序列图
时间序列图显示数据随时间的变化趋势。要构建数据集,我们需要一个TimeSeriesCollection对象,它是TimeSeries对象的集合,每个对象都是包含与特定时间段相关的值的数据项序列:
TimeSeries series = new TimeSeries("Monthly Sales");
series.add(new Month(1, 2024), 200);
series.add(new Month(2, 2024), 150);
series.add(new Month(3, 2024), 180);
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(series);
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"Monthly Sales",
"Date",
"Sales",
dataset,
true, // legend
false, // tooltips
false); // no URLs
让我们看看结果:
此示例展示了JFreeChart在绘制时序数据方面的强大功能,使其能够轻松跟踪随时间的变化。
3.4 组合图
组合图表允许我们将不同类型的图表组合成一个图表,与前面的示例相比,代码稍微复杂一些。
我们需要使用DefaultCategoryDataset来存储数据,但在这里,我们创建两个实例,每个图表类型一个:
DefaultCategoryDataset lineDataset = new DefaultCategoryDataset();
lineDataset.addValue(200, "Sales", "January");
lineDataset.addValue(150, "Sales", "February");
lineDataset.addValue(180, "Sales", "March");
DefaultCategoryDataset barDataset = new DefaultCategoryDataset();
barDataset.addValue(400, "Profit", "January");
barDataset.addValue(300, "Profit", "February");
barDataset.addValue(250, "Profit", "March");
CategoryPlot创建包含两种图表类型的绘图区,它允许我们将数据集分配给渲染器-LineAndShapeRenderer用于线条,BarRenderer用于条形:
CategoryPlot plot = new CategoryPlot();
plot.setDataset(0, lineDataset);
plot.setRenderer(0, new LineAndShapeRenderer());
plot.setDataset(1, barDataset);
plot.setRenderer(1, new BarRenderer());
plot.setDomainAxis(new CategoryAxis("Month"));
plot.setRangeAxis(new NumberAxis("Value"));
plot.setOrientation(PlotOrientation.VERTICAL);
plot.setRangeGridlinesVisible(true);
plot.setDomainGridlinesVisible(true);
最后,让我们使用JFreeChart创建最终的图表:
JFreeChart chart = new JFreeChart(
"Monthly Sales and Profit",
null, // null means to use default font
plot, // combination chart as CategoryPlot
true); // legend
此设置允许组合呈现数据,以直观的方式展示销售额和利润之间的协同作用:
这样,JFreeChart可以呈现需要多种图表类型的复杂数据集,以便更好地理解和分析。
4. 总结
在本文中,我们探讨了使用JFreeChart创建不同类型的图表,包括折线图、条形图、饼图、时序图和组合图。
本介绍仅仅触及了JFreeChart功能的皮毛。
Post Directory
