使用JFreeChart绘制Excel双轴折线图
使用JFreeChart绘制Excel双轴折线图
本文将介绍如何使用Java库JFreeChart从Excel文件中的数据创建双轴折线图。
问题描述
假设你有一个名为'input.xlsx'的Excel文件,其中包含一个名为'P1'的工作表。该工作表包含以下数据:
- A列:时间数据 (例如:2023, 2024...)* B列:主要垂直轴数据* C列:次要垂直轴数据
我们的目标是创建一个折线图,其中:
- 水平轴表示时间。* 主要垂直轴表示B列的数据。* 次要垂直轴表示C列的数据。
代码实现
以下是用JFreeChart库实现的完整Java代码:javaimport java.io.File;import java.io.IOException;
import org.apache.poi.ss.usermodel.Cell;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.data.category.DefaultCategoryDataset;import org.jfree.data.time.RegularTimePeriod;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.data.time.Year;
public class LineChartExample { public static void main(String[] args) { // 读取Excel文件 Workbook workbook = null; try { workbook = new XSSFWorkbook(new File('input.xlsx')); } catch (IOException e) { e.printStackTrace(); }
// 获取'P1'工作表 Sheet sheet = workbook.getSheet('P1');
// 创建时间序列数据集 TimeSeriesCollection dataset = new TimeSeriesCollection();
// 创建次要垂直轴数据集 DefaultCategoryDataset secondaryDataset = new DefaultCategoryDataset();
// 遍历数据行 for (int i = 1; i <= 49; i++) { Row row = sheet.getRow(i); Cell cellA = row.getCell(0); Cell cellB = row.getCell(1); Cell cellC = row.getCell(2);
// 获取时间值 RegularTimePeriod timePeriod = new Year((int) cellA.getNumericCellValue());
// 获取垂直轴值 double valueB = cellB.getNumericCellValue();
// 获取次要垂直轴值 double valueC = cellC.getNumericCellValue();
// 添加数据到时间序列数据集 TimeSeries series = new TimeSeries('Series ' + i); series.add(timePeriod, valueB); dataset.addSeries(series);
// 添加数据到次要垂直轴数据集 secondaryDataset.addValue(valueC, 'Series ' + i, timePeriod); }
// 创建折线图 JFreeChart chart = ChartFactory.createLineChart( '双轴折线图示例', // 图表标题 '时间', // 水平轴标签 '值', // 垂直轴标签 dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方向 true, // 是否显示图例 true, // 是否生成工具提示 false // 是否生成URL链接 );
// 获取图表的绘图区域 XYPlot plot = (XYPlot) chart.getPlot();
// 设置水平轴为时间格式 DateAxis dateAxis = new DateAxis('时间'); plot.setDomainAxis(dateAxis);
// 设置垂直轴为数据格式 plot.setRangeAxis(1, secondaryDataset);
// 保存图表为PNG图片 try { ChartUtilities.saveChartAsPNG(new File('line_chart.png'), chart, 800, 600); } catch (IOException e) { e.printStackTrace(); }
System.out.println('折线图已成功创建。'); }}
代码说明:
- 导入必要的库: 确保你的项目中包含了JFreeChart和Apache POI库。2. 读取Excel文件: 使用Apache POI库读取'input.xlsx'文件并获取'P1'工作表。3. 创建数据集: 创建两个数据集,一个用于主要垂直轴(TimeSeriesCollection),另一个用于次要垂直轴(DefaultCategoryDataset)。4. 填充数据集: 遍历Excel表格中的数据行,并将数据添加到相应的数据集中。5. 创建折线图: 使用
ChartFactory.createLineChart()方法创建折线图对象。6. 设置轴格式: 将水平轴设置为时间格式,并将次要垂直轴添加到图表中。7. 保存图表: 将图表保存为PNG格式的图片文件。
总结
本文介绍了如何使用JFreeChart库创建带有双轴的折线图,并提供了完整的Java代码示例。你可以根据自己的需求修改代码,例如更改图表标题、轴标签和数据源等。
原文地址: https://www.cveoy.top/t/topic/fSYL 著作权归作者所有。请勿转载和采集!