当前位置:首页 > 后端开发 > 正文

Java如何绘制曲线图?

在Java中绘制曲线图可使用JFreeChart或XChart等第三方库,主要步骤:添加库依赖、创建数据集、配置图表对象(标题、坐标轴等)、生成图像并嵌入Swing组件或导出为文件。

在Java中绘制曲线图,推荐使用JFreeChart(开源且功能强大),下面通过完整示例分步讲解实现方法:


环境准备

  1. 添加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);
    }
}

关键步骤解析

  1. 数据准备

    • XYSeries 存储坐标点数据
    • XYSeriesCollection 封装多个数据系列(支持多条曲线)
  2. 自定义样式(可选增强):

    Java如何绘制曲线图?  第1张

    // 获取绘图区域
    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                   // 高度
);

高级应用技巧

  1. 动态更新数据

    series.add(6, 19); // 追加新数据点
    chart.fireChartChanged(); // 触发图表重绘
  2. 多条曲线对比

    XYSeries series2 = new XYSeries("湿度");
    series2.add(1, 40);
    series2.add(2, 45);
    dataset.addSeries(series2); // 添加到同一数据集
  3. 平滑曲线(使用样条插值):

    renderer.setSeriesShapesVisible(0, false); // 隐藏数据点
    renderer.setSeriesLinesVisible(0, true);

替代方案推荐

  1. 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);
  2. 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线图。

0