在Java中绘制曲线图,推荐使用JFreeChart库(开源且功能强大),下面通过完整示例分步讲解实现方法:
环境准备
- 添加Maven依赖:
<dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.5.3</version> </dependency>
或手动下载JAR包
绘制曲线图核心代码
import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.JFreeChart; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; public class CurveChartExample { public static void main(String[] args) { // 1. 创建数据集 XYSeries series = new XYSeries("温度变化"); series.add(1, 15); // (x, y)坐标 series.add(2, 18); series.add(3, 22); series.add(4, 17); series.add(5, 20); XYSeriesCollection dataset = new XYSeriesCollection(); dataset.addSeries(series); // 2. 创建曲线图 JFreeChart chart = ChartFactory.createXYLineChart( "24小时温度监测", // 标题 "时间(小时)", // X轴标签 "温度(℃)", // Y轴标签 dataset // 数据集 ); // 3. 显示图表窗口 ChartFrame frame = new ChartFrame("曲线图", chart); frame.pack(); frame.setVisible(true); } }
关键步骤解析
-
数据准备:
XYSeries
存储坐标点数据XYSeriesCollection
封装多个数据系列(支持多条曲线)
-
自定义样式(可选增强):
// 获取绘图区域 XYPlot plot = chart.getXYPlot();
// 设置曲线颜色和粗细
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
renderer.setSeriesPaint(0, Color.RED); // 第一条曲线红色
renderer.setSeriesStroke(0, new BasicStroke(2.0f)); // 线宽2像素
plot.setRenderer(renderer);
// 设置背景网格
plot.setBackgroundPaint(Color.WHITE);
plot.setDomainGridlinePaint(Color.LIGHT_GRAY); // X轴网格线
plot.setRangeGridlinePaint(Color.LIGHT_GRAY); // Y轴网格线
3. **导出为图片**:
```java
ChartUtils.saveChartAsPNG(
new File("chart.png"), // 输出文件
chart, // 图表对象
800, // 宽度
600 // 高度
);
高级应用技巧
-
动态更新数据:
series.add(6, 19); // 追加新数据点 chart.fireChartChanged(); // 触发图表重绘
-
多条曲线对比:
XYSeries series2 = new XYSeries("湿度"); series2.add(1, 40); series2.add(2, 45); dataset.addSeries(series2); // 添加到同一数据集
-
平滑曲线(使用样条插值):
renderer.setSeriesShapesVisible(0, false); // 隐藏数据点 renderer.setSeriesLinesVisible(0, true);
替代方案推荐
-
JavaFX图表(JDK8+内置):
LineChart<Number,Number> chart = new LineChart<>(xAxis, yAxis); XYChart.Series data = new XYChart.Series(); data.getData().add(new XYChart.Data(1, 15)); chart.getData().add(data);
-
XChart库(轻量级):
XYChart chart = QuickChart.getChart("示例", "X", "Y", "series", new double[]{1,2,3}, new double[]{15,18,22}); BitmapEncoder.saveBitmap(chart, "chart.png", BitmapFormat.PNG);
常见问题解决
- 中文乱码:设置字体
chart.getTitle().setFont(new Font("宋体", Font.BOLD, 16));
- 性能优化:大数据集时关闭图形标记
renderer.setSeriesShapesVisible(0, false); // 隐藏数据点
- 坐标轴精度:
NumberAxis axis = (NumberAxis) plot.getDomainAxis(); axis.setTickUnit(new NumberTickUnit(1)); // X轴每1单位显示刻度
引用说明
本文代码基于JFreeChart 1.5.3 API编写,遵循BSD开源协议,数据可视化建议参考《数据可视化最佳实践》原则,确保图表清晰传达信息。
经验提示:工业场景建议结合JFreeChart的
TimeSeries
类处理时间序列数据,金融领域可使用CandlestickChart
绘制K线图。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/38791.html