Java使用JFreeChart創(chuàng)建動態(tài)圖表的代碼示例
前言
在數(shù)據(jù)可視化的世界中,圖表是展示數(shù)據(jù)的強(qiáng)大工具。無論是折線圖、柱狀圖還是餅圖,它們都能幫助我們更直觀地理解數(shù)據(jù)。在 Java 生態(tài)中,JFreeChart 是一個功能強(qiáng)大且靈活的圖表庫,廣泛應(yīng)用于各種 Java 應(yīng)用程序中。本文將帶你從零開始學(xué)習(xí)如何使用 JFreeChart 創(chuàng)建動態(tài)圖表,并結(jié)合實(shí)際代碼示例,讓你快速掌握其核心功能。
一、JFreeChart 簡介
JFreeChart 是一個開源的 Java 圖表庫,支持多種圖表類型,包括:
折線圖(Line Chart)
柱狀圖(Bar Chart)
餅圖(Pie Chart)
散點(diǎn)圖(Scatter Plot)
面積圖(Area Chart)
它的主要特點(diǎn)包括:
易于使用:通過簡單的 API 即可創(chuàng)建復(fù)雜的圖表。
高度可定制:支持自定義顏色、字體、樣式等。
支持導(dǎo)出:可以將圖表導(dǎo)出為 PNG、JPEG、PDF 等格式。
二、環(huán)境準(zhǔn)備
在開始之前,我們需要在項(xiàng)目中引入 JFreeChart 的依賴。如果你使用 Maven,可以在 pom.xml 中添加以下依賴:
<dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.5.3</version> </dependency>
三、 創(chuàng)建第一個折線圖
折線圖是展示數(shù)據(jù)趨勢的常用圖表類型。以下是一個簡單的示例,展示如何使用 JFreeChart 創(chuàng)建一個折線圖。
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) { // 創(chuàng)建數(shù)據(jù)集 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(1, "Series1", "Category1"); dataset.addValue(4, "Series1", "Category2"); dataset.addValue(3, "Series1", "Category3"); dataset.addValue(5, "Series1", "Category4"); // 創(chuàng)建折線圖 JFreeChart chart = ChartFactory.createLineChart( "Sample Line Chart", // 圖表標(biāo)題 "Category", // X軸標(biāo)簽 "Value", // Y軸標(biāo)簽 dataset // 數(shù)據(jù)集 ); // 保存圖表為圖片 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(); } } }
運(yùn)行結(jié)果
運(yùn)行上述代碼后,會生成一個名為 line_chart.png 的圖片文件,內(nèi)容如下:
標(biāo)題:Sample Line Chart
X 軸標(biāo)簽:Category
Y 軸標(biāo)簽:Value
數(shù)據(jù)點(diǎn):(Category1, 1), (Category2, 4), (Category3, 3), (Category4, 5)
四、自定義圖表樣式
JFreeChart 提供了豐富的 API 來自定義圖表樣式。以下是一些常見的自定義操作:
4.1 設(shè)置背景色
import java.awt.Color; // 設(shè)置圖表背景色 chart.setBackgroundPaint(Color.WHITE); // 設(shè)置繪圖區(qū)域背景色 CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.LIGHT_GRAY);
4.2 設(shè)置折線顏色
import org.jfree.chart.renderer.category.LineAndShapeRenderer; // 獲取渲染器 LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer(); // 設(shè)置折線顏色 renderer.setSeriesPaint(0, Color.RED); // 第一條折線為紅色 renderer.setSeriesStroke(0, new BasicStroke(2.0f)); // 設(shè)置線條粗細(xì)
4.3 設(shè)置字體(解決中文亂碼)
import org.jfree.chart.StandardChartTheme; // 設(shè)置全局字體 StandardChartTheme chartTheme = new StandardChartTheme("CN"); chartTheme.setExtraLargeFont(new Font("宋體", Font.PLAIN, 20)); // 標(biāo)題字體 chartTheme.setLargeFont(new Font("宋體", Font.PLAIN, 16)); // 圖例字體 chartTheme.setRegularFont(new Font("宋體", Font.PLAIN, 14)); // 軸標(biāo)簽字體 ChartFactory.setChartTheme(chartTheme);
4.4 設(shè)置橫坐標(biāo)的標(biāo)簽寬度和方向
CategoryAxis categoryAxis = chart.getCategoryPlot().getDomainAxis(); categoryAxis.setMaximumCategoryLabelLines(2); // 允許每個標(biāo)簽最多兩行 categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 旋轉(zhuǎn)標(biāo)簽 categoryAxis.setLowerMargin(0.0); // 去掉邊緣空白 categoryAxis.setUpperMargin(0.0); // 去掉邊緣空白
五、導(dǎo)出圖表
JFreeChart 支持將圖表導(dǎo)出為多種格式,如 PNG、JPEG、PDF 等。以下是將圖表保存為 PNG 文件的示例:
import org.jfree.chart.ChartUtils; // 保存圖表為 PNG 文件 ChartUtils.saveChartAsPNG(new File("chart.png"), chart, 800, 600);
六、實(shí)戰(zhàn):動態(tài)生成日報(bào)圖表
以下是一個實(shí)戰(zhàn)示例,展示如何動態(tài)生成日報(bào)中的折線圖,并將其插入到 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 { // 創(chuàng)建數(shù)據(jù)集 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(10, "監(jiān)測站", "00:00"); dataset.addValue(20, "監(jiān)測站", "06:00"); dataset.addValue(30, "監(jiān)測站", "12:00"); dataset.addValue(40, "監(jiān)測站", "18:00"); // 創(chuàng)建折線圖 JFreeChart chart = ChartFactory.createLineChart( "監(jiān)測站總在線數(shù)", // 圖表標(biāo)題 "小時", // X軸標(biāo)簽 "數(shù)量", // Y軸標(biāo)簽 dataset // 數(shù)據(jù)集 ); // 保存圖表為圖片 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"); } }
總結(jié)
通過本文,你已經(jīng)掌握了 JFreeChart 的基本用法,包括:
創(chuàng)建折線圖、柱狀圖等常見圖表。
自定義圖表樣式(背景色、折線顏色、字體等)。
將圖表導(dǎo)出為圖片或插入到 Word 文檔中。
JFreeChart 是一個功能強(qiáng)大且靈活的圖表庫,適用于各種數(shù)據(jù)可視化需求。希望本文能幫助你快速上手JFreeChart,并在實(shí)際項(xiàng)目中應(yīng)用它!
到此這篇關(guān)于Java使用JFreeChart創(chuàng)建動態(tài)圖表的代碼示例的文章就介紹到這了,更多相關(guān)Java JFreeChart創(chuàng)建動態(tài)圖表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
smslib發(fā)短信實(shí)例代碼(電腦發(fā)短信)
smslib發(fā)短信實(shí)例,大家可以參考使用開發(fā)自己的程序2013-12-12關(guān)于遠(yuǎn)程調(diào)用RestTemplate的使用避坑指南
這篇文章主要介紹了關(guān)于遠(yuǎn)程調(diào)用RestTemplate的使用避坑指南,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10解決@Validated注解無效,嵌套對象屬性的@NotBlank無效問題
這篇文章主要介紹了解決@Validated注解無效,嵌套對象屬性的@NotBlank無效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10JAVA三種攔截方式詳解(原生過濾器Filter、springMVC攔截器、aop切面)
在Java開發(fā)中方法攔截是一種常見的技術(shù),可以用于在方法執(zhí)行前后添加額外的邏輯或修改方法的行為,這篇文章主要給大家介紹了關(guān)于JAVA三種攔截方式的相關(guān)資料,文中介紹的方式分別是原生過濾器Filter、springMVC攔截器、aop切面,需要的朋友可以參考下2024-05-05基于Java實(shí)現(xiàn)多線程下載并允許斷點(diǎn)續(xù)傳
這篇文章主要介紹了基于Java實(shí)現(xiàn)多線程下載并允許斷點(diǎn)續(xù)傳,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03Java中websocket消息推送的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中websocket消息推送的實(shí)現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02