使用JFreeChart绘制Excel时间序列双轴折线图
使用JFreeChart绘制Excel时间序列双轴折线图
本文将介绍如何使用Java和JFreeChart库从Excel文件读取数据, 并创建一个包含两个时间序列和双垂直轴的折线图。水平轴将显示时间格式, 垂直轴将显示Excel文件中指定列的数据。
代码实现
以下是用JFreeChart库实现的完整Java代码:javaimport java.io.File;import java.io.FileInputStream;import java.io.IOException;
import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.CellType;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.DateAxis;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;import org.jfree.data.time.Day;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;
public class LineChartExample { public static void main(String[] args) { try { // 读取Excel文件 FileInputStream file = new FileInputStream(new File('input.xlsx')); Workbook workbook = new XSSFWorkbook(file); Sheet sheet = workbook.getSheet('P1');
// 创建时间序列集合 TimeSeriesCollection dataset = new TimeSeriesCollection();
// 创建时间序列 TimeSeries series1 = new TimeSeries('垂直轴'); TimeSeries series2 = new TimeSeries('次要垂直轴');
// 读取数据并添加到时间序列 for (int i = 1; i <= 50; i++) { Row row = sheet.getRow(i); Cell cell1 = row.getCell(0); Cell cell2 = row.getCell(1); Cell cell3 = row.getCell(2);
if (cell1.getCellType() == CellType.NUMERIC && cell2.getCellType() == CellType.NUMERIC && cell3.getCellType() == CellType.NUMERIC) { Day day = new Day((int) cell1.getNumericCellValue(), 1, 2022); series1.add(day, cell2.getNumericCellValue()); series2.add(day, cell3.getNumericCellValue()); } }
// 添加时间序列到集合 dataset.addSeries(series1); dataset.addSeries(series2);
// 创建折线图 JFreeChart chart = ChartFactory.createXYLineChart('折线图', '时间', '垂直轴', dataset, PlotOrientation.VERTICAL, true, true, false);
// 设置水平轴为时间格式 XYPlot plot = (XYPlot) chart.getPlot(); DateAxis dateAxis = new DateAxis(); plot.setDomainAxis(dateAxis);
// 设置次要垂直轴 plot.setDataset(1, dataset); plot.mapDatasetToRangeAxis(1, 1); plot.setRangeAxis(1, new org.jfree.chart.axis.NumberAxis('次要垂直轴'));
// 设置折线图渲染器 XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(); renderer.setSeriesShapesVisible(0, false); renderer.setSeriesShapesVisible(1, false); plot.setRenderer(renderer);
// 保存图表为图片 ChartUtilities.saveChartAsJPEG(new File('linechart.jpg'), chart, 500, 300);
// 关闭文件流 file.close(); workbook.close(); } catch (IOException e) { e.printStackTrace(); } }}
代码说明
-
导入必要的库: 代码首先导入必要的JFreeChart和Apache POI库来处理Excel文件和创建图表。
-
读取Excel数据: 代码读取名为 'input.xlsx' 的Excel文件, 并获取名为 'P1' 的工作表。然后, 它循环遍历工作表中的每一行, 将A列作为时间数据, B列和C列作为两个不同时间序列的数据。
-
创建JFreeChart数据集: 代码创建
TimeSeriesCollection对象来存储时间序列数据。 -
创建JFreeChart图表: 代码使用
ChartFactory.createXYLineChart()方法创建折线图, 并设置图表标题, 坐标轴标签等属性。 -
配置图表: 代码将水平轴设置为时间格式, 并添加次要垂直轴以显示第二个时间序列数据。
-
保存图表: 最后, 代码将图表保存为名为 'linechart.jpg' 的JPEG图片文件。
总结
这段代码展示了如何使用JFreeChart库从Excel文件读取数据, 并创建一个包含时间格式水平轴和双垂直轴的折线图。 通过修改代码, 可以轻松地自定义图表的外观和功能, 例如更改颜色, 添加图例和标题等。
原文地址: https://www.cveoy.top/t/topic/fSYK 著作权归作者所有。请勿转载和采集!