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

文章目录

  • 前言
  • 一、JFreeChart 简介
  • 二、环境准备
  • 三、 创建第一个折线图
  • 四、自定义图表样式
    • 4.1 设置背景色
    • 4.2 设置折线颜色
    • 4.3 设置字体(解决中文乱码)
    • 4.4 设置横坐标的标签宽度和方向
  • 五、导出图表
  • 六、实战:动态生成日报图表
  • 总结


前言

在数据可视化的世界中,图表是展示数据的强大工具。无论是折线图、柱状图还是饼图,它们都能帮助我们更直观地理解数据。在 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 中添加以下依赖:

<dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.5.3</version>
</dependency>

三、 创建第一个折线图

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

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 设置背景色

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

4.2 设置折线颜色

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 设置字体(解决中文乱码)

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 设置横坐标的标签宽度和方向

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 文件的示例:

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

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

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

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 仓库


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Formality:探针(Probe Point)的设置与使用

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一般情况下&#xff0c;verify命令会对参考设计和实现设计所有匹配的比较点各自进行验证&#xff0c;但有些时候为了调试&#xff0c;可能需要验证参考设计和实现设…

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡 问题 idea编译器 安装copilot AI工具 实际操作 在 IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤如下&#xff1a; 打开 IntelliJ IDEA&#xff1a; 打开你的 IntelliJ IDEA 应用…

【计算机网络】TCP/IP 网络模型有哪几层?

目录 应用层 传输层 网络层 网络接口层 总结 为什么要有 TCP/IP 网络模型&#xff1f; 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通…

(done) openMP学习 (Day10: Tasks 原语)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#19-%E6%8A%80%E8%83%BD%E8%AE%AD%E7%BB%83%E9%93%BE%E8%A1%A8%E5%92%8Copenmp 本章节内容仅提供引入&#xff0c;关于 task 更详细的细节请看 openMP 手册或者源材料 Day9 介绍了一个优化链表遍历的粗糙方…

《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合

《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合 本篇文章的所有内容仅基于C撰写。 1. 基础知识 1.1 概念 回溯是递归的副产品&#xff0c;它也是遍历树的一种方式&#xff0c;其本质是穷举。它并不高效&#xff0c;但是比暴力循…

群晖安装Gitea

安装Docker Docker运行Gitea 上传gitea包&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象&#xff0c;点击新增&#xff0c;从文件添加 点击启动 可根据情况&#xff0c;进行高级设置&#xff0c;没有就下一步 点击应…

SAP ABAP调用DeepSeek API大模型接口

搜索了一下DeepSeek&#xff0c;发现有人已经实现了SAP的对接&#xff0c; 不登录网页&#xff0c;SAP如何使用DeepSeek快速编程&#xff0c;ABAP起飞啦~ 按照对应的注册流程和方法。总算做出了第一个能够直连DeepSeek的API abap程序。 效果不错。 report ZTOOL_ABAP_CALL_D…

verilog练习:i2c slave 模块设计

文章目录 前言1. 结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了&#xff0c;网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总&#xff0c;如果对读者有…

活动预告 |【Part 1】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…

【电机控制器】STC8H1K芯片——低功耗

【电机控制器】STC8H1K芯片——低功耗 文章目录 [TOC](文章目录) 前言一、芯片手册说明二、IDLE模式三、PD模式四、PD模式唤醒五、实验验证1.接线2.视频&#xff08;待填&#xff09; 六、参考资料总结 前言 使用工具&#xff1a; 1.STC仿真器烧录器 提示&#xff1a;以下是本…

校园网规划方案

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog 本课程设计参考学习计算机网络 思科Cisco Packet Tracer仿真实验_哔哩哔哩_bilibili, 文章和pkg详见个人博客站: http://www.kervin24.to…

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤&#xff1a; 利用 DeepSeek 生成 PPT 内容&#xff1a; 访问 DeepSeek 官网&#xff0c;完成注册/登录后进入对话界面。输入指令&#xff0c;例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲&#xff0c;需包…

【Matlab优化算法-第14期】基于智能优化算法的VMD信号去噪项目实践

基于智能优化算法的VMD信号去噪项目实践 一、前言 在信号处理领域&#xff0c;噪声去除是一个关键问题&#xff0c;尤其是在处理含有高斯白噪声的复杂信号时。变分模态分解&#xff08;VMD&#xff09;作为一种新兴的信号分解方法&#xff0c;因其能够自适应地分解信号而受到…

8.JVM-方法区

前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal&#xff1a;如何保证多个线程在并发环境下的安全性&#xff1f;典型应用就是数据库连接管理&#xff0c;以及会话管理 栈、堆、方法区的交互关系 下面就涉及了对象的访问定位 Person&a…

大模型训练(7):集合通信与通信原语

0 背景 分布式训练过程中设计到许多通信上的操作&#xff0c; 每个操作有其不同的术语并且有所区别&#xff0c;这里将其用简单的例子和描述总结一下&#xff0c;方便理解。 集合通信&#xff08;Collective Communications&#xff09;是一个进程组的所有进程都参与的全局通…

全程Kali linux---CTFshow misc入门(38-50)

第三十八题&#xff1a; ctfshow{48b722b570c603ef58cc0b83bbf7680d} 第三十九题&#xff1a; 37换成1&#xff0c;36换成0&#xff0c;就得到长度为287的二进制字符串&#xff0c;因为不能被8整除所以&#xff0c;考虑每7位转换一个字符&#xff0c;得到flag。 ctfshow{5281…

C++Primer学习(2.2)

2.2 变量 变量提供一个具名的、可供程序操作的存储空间。C中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围&#xff0c;以及变量能参与的运算。对C程序员来说,“变量(variable)”和“对象(object)”一般可以互换使用。 术…

Maven 安装配置(完整教程)

文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和自动化构建工具。它主要服务于 Java 平台&#xff0c;但也支持其他编程语言…

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈&#xff0c;追求远距离的视音频的同步交互成为新的时尚。近些年来&#xff0c;依托计算机技术、通信技术和网络条件的发展&#xff0c;集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…

DeepSeek为何能爆火

摘要&#xff1a;近年来&#xff0c;DeepSeek作为一款新兴的社交媒体应用&#xff0c;迅速在年轻人群体中走红&#xff0c;引发了广泛关注。本文旨在探讨DeepSeek为何能在短时间内爆火&#xff0c;从而为我国社交媒体的发展提供参考。首先&#xff0c;通过文献分析&#xff0c;…