使用 JFreeChart 创建动态图表:从入门到实战

文章目录


前言

在数据可视化的世界中,图表是展示数据的强大工具。无论是折线图、柱状图还是饼图,它们都能帮助我们更直观地理解数据。在 Java 生态中,JFreeChart 是一个功能强大且灵活的图表库,广泛应用于各种 Java 应用程序中。本文将带你从零开始学习如何使用 JFreeChart 创建动态图表,并结合实际代码示例,让你快速掌握其核心功能。

一、JFreeChart 简介

JFreeChart 是一个开源的 Java 图表库,支持多种图表类型,包括:

  • 折线图(Line Chart)

  • 柱状图(Bar Chart)

  • 饼图(Pie Chart)

  • 散点图(Scatter Plot)

  • 面积图(Area Chart)

它的主要特点包括:

  • 易于使用:通过简单的 API 即可创建复杂的图表。

  • 高度可定制:支持自定义颜色、字体、样式等。

  • 支持导出:可以将图表导出为 PNG、JPEG、PDF 等格式。

二、环境准备

在开始之前,我们需要在项目中引入 JFreeChart 的依赖。如果你使用 Maven,可以在 pom.xml 中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jfreechart</artifactId>
    <version>1.5.3</version>
</dependency>

三、 创建第一个折线图

折线图是展示数据趋势的常用图表类型。以下是一个简单的示例,展示如何使用 JFreeChart 创建一个折线图。

java 复制代码
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.DefaultCategoryDataset;

import java.io.File;
import java.io.IOException;

public class LineChartExample {
    public static void main(String[] args) {
        // 创建数据集
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(1, "Series1", "Category1");
        dataset.addValue(4, "Series1", "Category2");
        dataset.addValue(3, "Series1", "Category3");
        dataset.addValue(5, "Series1", "Category4");

        // 创建折线图
        JFreeChart chart = ChartFactory.createLineChart(
                "Sample Line Chart", // 图表标题
                "Category",         // X轴标签
                "Value",            // Y轴标签
                dataset             // 数据集
        );

        // 保存图表为图片
        try {
            ChartUtils.saveChartAsPNG(new File("line_chart.png"), chart, 600, 400);
            System.out.println("Chart saved as line_chart.png");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果

运行上述代码后,会生成一个名为 line_chart.png 的图片文件,内容如下:

  • 标题:Sample Line Chart

  • X 轴标签:Category

  • Y 轴标签:Value

  • 数据点:(Category1, 1), (Category2, 4), (Category3, 3), (Category4, 5)

四、自定义图表样式

JFreeChart 提供了丰富的 API 来自定义图表样式。以下是一些常见的自定义操作:

4.1 设置背景色

java 复制代码
import java.awt.Color;

// 设置图表背景色
chart.setBackgroundPaint(Color.WHITE);

// 设置绘图区域背景色
CategoryPlot plot = chart.getCategoryPlot();
plot.setBackgroundPaint(Color.LIGHT_GRAY);

4.2 设置折线颜色

java 复制代码
import org.jfree.chart.renderer.category.LineAndShapeRenderer;

// 获取渲染器
LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();

// 设置折线颜色
renderer.setSeriesPaint(0, Color.RED); // 第一条折线为红色
renderer.setSeriesStroke(0, new BasicStroke(2.0f)); // 设置线条粗细

4.3 设置字体(解决中文乱码)

java 复制代码
import org.jfree.chart.StandardChartTheme;

// 设置全局字体
StandardChartTheme chartTheme = new StandardChartTheme("CN");
chartTheme.setExtraLargeFont(new Font("宋体", Font.PLAIN, 20)); // 标题字体
chartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 16));     // 图例字体
chartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 14));   // 轴标签字体
ChartFactory.setChartTheme(chartTheme);

4.4 设置横坐标的标签宽度和方向

java 复制代码
CategoryAxis categoryAxis = chart.getCategoryPlot().getDomainAxis();
categoryAxis.setMaximumCategoryLabelLines(2); // 允许每个标签最多两行
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);  // 旋转标签
categoryAxis.setLowerMargin(0.0); // 去掉边缘空白
categoryAxis.setUpperMargin(0.0); // 去掉边缘空白

五、导出图表

JFreeChart 支持将图表导出为多种格式,如 PNG、JPEG、PDF 等。以下是将图表保存为 PNG 文件的示例:

java 复制代码
import org.jfree.chart.ChartUtils;

// 保存图表为 PNG 文件
ChartUtils.saveChartAsPNG(new File("chart.png"), chart, 800, 600);

六、实战:动态生成日报图表

以下是一个实战示例,展示如何动态生成日报中的折线图,并将其插入到 Word 文档中。

java 复制代码
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.DefaultCategoryDataset;

import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;

public class DailyReportExample {
    public static void main(String[] args) throws Exception {
        // 创建数据集
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(10, "监测站", "00:00");
        dataset.addValue(20, "监测站", "06:00");
        dataset.addValue(30, "监测站", "12:00");
        dataset.addValue(40, "监测站", "18:00");

        // 创建折线图
        JFreeChart chart = ChartFactory.createLineChart(
                "监测站总在线数", // 图表标题
                "小时",         // X轴标签
                "数量",         // Y轴标签
                dataset         // 数据集
        );

        // 保存图表为图片
        String chartPath = "daily_chart.png";
        ChartUtils.saveChartAsPNG(new File(chartPath), chart, 800, 600);

        // 将图片插入到 Word 文档
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("chart", Pictures.ofStream(new FileInputStream(chartPath), PictureType.PNG).create());

        XWPFTemplate template = XWPFTemplate.compile("template.docx").render(dataMap);
        template.writeToFile("output.docx");
    }
}

总结

通过本文,你已经掌握了 JFreeChart 的基本用法,包括:

创建折线图、柱状图等常见图表。

自定义图表样式(背景色、折线颜色、字体等)。

将图表导出为图片或插入到 Word 文档中。

JFreeChart 是一个功能强大且灵活的图表库,适用于各种数据可视化需求。希望本文能帮助你快速上手 JFreeChart,并在实际项目中应用它!

参考资料:
JFreeChart 官方文档
JFreeChart GitHub 仓库


相关推荐
明月_清风2 分钟前
FastAPI 从入门到实战:3 分钟构建高性能异步 API
后端·python·fastapi
笨拙的老猴子7 分钟前
[特殊字符] Java GC机制详解:G1、ZGC、Shenandoah全面解析与版本演进对比
java·开发语言
bellus-9 分钟前
ubuntu26测试win10的ollama大模型性能
python
水木流年追梦10 分钟前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
JavaWeb学起来10 分钟前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
liuyunshengsir23 分钟前
PyTorch 动态量化(Dynamic Quantization)
人工智能·pytorch·python
电子云与长程纠缠32 分钟前
UE5制作六边形包裹球体效果
开发语言·python·ue5
砍材农夫38 分钟前
物联网 基于netty构建mqtt协议规范(遗嘱与保留消息)
java·开发语言·物联网·netty
DFT计算杂谈41 分钟前
KPROJ编译教程
java·前端·python·算法·conda
froginwe111 小时前
Python3 迭代器与生成器
开发语言