一個java新手編寫web網頁時遇到一個問題,就是取出數據庫里的某個表的內容並將其生成柱狀圖或者折線圖,這突然就比較迷茫,不知應該怎樣完成,但靜下心來想了想思路,首先我應該知道要生成圖表有哪些路可尋,通過上網發現了大神總結的心得如下(原文):
https://blog.csdn.net/happylee6688/article/details/26960729
- ChartDirector
- JScharts
- JFreeChart
<%@ page pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@ page import="java.awt.Color,
org.jfree.chart.ChartFactory,
org.jfree.chart.JFreeChart,
org.jfree.chart.plot.PlotOrientation,
org.jfree.chart.servlet.ServletUtilities,
org.jfree.data.category.CategoryDataset,
org.jfree.data.general.*,
org.jfree.chart.plot.CategoryPlot,
org.jfree.chart.axis.CategoryAxis,
org.jfree.chart.axis.ValueAxis,
org.jfree.chart.renderer.category.BarRenderer3D,
org.jfree.chart.urls.StandardCategoryURLGenerator,
org.jfree.chart.*,
org.jfree.chart.entity.*,
org.jfree.chart.labels.*,
org.jfree.chart.axis.CategoryLabelPositions,
java.awt.Font,
java.awt.GradientPaint,
org.jfree.ui.TextAnchor,
org.jfree.chart.axis.NumberAxis,
org.jfree.chart.axis.NumberTickUnit
"%>
<%@ page import="org.jfree.data.general.DefaultPieDataset"%>
<%@ page import="org.jfree.data.category.CategoryDataset" %>
<%@ page import="org.jfree.data.category.DefaultCategoryDataset" %>
<%@ page import="org.jfree.chart.JFreeChart"%>
<%@ page import="org.jfree.chart.plot.PiePlot"%>
<%@ page import="org.jfree.chart.ChartRenderingInfo"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
<%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%>
<%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>
<%@ page import="org.jfree.chart.encoders.SunPNGEncoderAdapter"%>
<%@ page import="org.jfree.chart.StandardChartTheme"%>
<%@ page import="org.jfree.chart.ChartFactory"%>
<%@ page import="org.jfree.chart.plot.CategoryPlot"%>
<%@ page import="org.jfree.chart.plot.PlotOrientation"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer"%>
<%@ page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"%>
<%@ page import="java.awt.Font"%>
<%@ page import="java.awt.Color"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.io.*"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis3D"%>
<%@ page import="org.jfree.chart.axis.CategoryLabelPositions"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis3D"%>
<%@ page import="org.jfree.chart.axis.NumberAxis3D"%>
<%@ page import="org.jfree.chart.axis.NumberTickUnit"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer3D"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer3D" %>
<%@ page import="org.jfree.chart.renderer.category.LineAndShapeRenderer" %>
<%@ page import="org.jfree.data.category.DefaultCategoryDataset" %>
<%@ page import="org.jfree.chart.plot.DatasetRenderingOrder" %>
//PS:一個新手就盡可能的導入類,以防出錯.....
//餅狀圖代碼如下:
<html>
<body>
<%
//實例化核心類對象
DefaultPieDataset dataset=new DefaultPieDataset();
//設置圖表值,可為多個
dataset.setValue("paid",45);
dataset.setValue("Unpaid",25);
//根據JFreeChart提供的工廠類org.jfree.chart.ChartFactory創建餅狀圖
JFreeChart chart=ChartFactory.createPieChart3D("Student payment form",dataset,true,false,false);
//生成圖形存入session,得到存入session的圖形名稱
String filename=ServletUtilities.saveChartAsPNG(chart,500,400,session);
//在頁面中通過img展示生成的圖形,通過jfreechart的servlet輸出圖形
String graphURL=request.getContextPath()+"/DisplayChart?filename="+filename;
%>
<img src="<%=graphURL %>" >
</body>
</html>
以上輸出圖表的方法是用JFreeChart的serverlet進行輸出,所以要配置web.xml文件,如下:(如果圖表不顯示,多半是web.xml沒有配置)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>ceshi</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/DisplayChart</url-pattern>
</servlet-mapping>
</web-app>
事實上,圖表輸出是有倆種方式,另一種是通過一個函數輸出:(柱狀圖為例)
//第一步,構造一個Dataset :填充要統計的數據
DefaultCategoryDataset mDataset = new DefaultCategoryDataset();
mDataset.addValue(2000, "清華大學", "本科生"); //數據一般從數據庫得出,用個for循環即可
mDataset.addValue(1500, "清華大學", "研究生");
mDataset.addValue(1000, "清華大學", "博士生");
mDataset.addValue(900, "清華大學", "講師");
mDataset.addValue(800, "清華大學", "副教授");
mDataset.addValue(300, "清華大學", "教授");
mDataset.addValue(600, "清華大學", "行政人員");
mDataset.addValue(400, "清華大學", "管理人員");
//第二步,生成圖形,ChartFactory.createBarChart3D來生成柱狀圖
JFreeChart mChart = ChartFactory.createBarChart3D(
"學校人員分布圖", // 圖形名稱
"類型", // 分類名稱,為橫坐標名稱
"數量", // 值名稱,為縱坐標名稱
mDataset, // 數據集合
PlotOrientation.VERTICAL, // 垂直顯示
true, // 是否顯示圖例
true,// 是否使用工具提示
false);// 是否使用url
//第三,顯示,有倆種方法:流式輸出與URL(上面已經講了)輸出
response.setContentType("image/png");
//流式輸出
ChartUtilities.writeChartAsPNG(response.getOutputStream(),mChart,800,500);
//////////////////////////////////////////////////////
按理說,圖表核心輸出就已經學會了,但從上文得知,JFreeChart是不支持中文,會出現亂碼,如果圖表中的參數用英文,上面代碼足以應付
如果想輸出中文而且還不顯示亂碼,那必須要自己再配置,如下:
// 配置字體
Font xfont = new Font("宋體", Font.PLAIN, 12);// X軸
Font yfont = new Font("宋體", Font.PLAIN, 12);// Y軸
Font kfont = new Font("宋體", Font.PLAIN, 12);// 底部
Font titleFont = new Font("宋體", Font.BOLD, 25); // 圖片標題
// 圖形的繪制結構對象,對於餅圖不適用
CategoryPlot plot = mChart.getCategoryPlot();
// X 軸
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 軸標題
domainAxis.setTickLabelFont(xfont);// 軸數值
domainAxis.setTickLabelPaint(Color.BLACK); // 字體顏色
// Y 軸
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLACK); // 字體顏色
rangeAxis.setTickLabelFont(yfont);
這樣就解決亂碼了,上邊的代碼適用柱狀圖,設置字體,
對於折線圖、餅圖設置字體 的代碼不太一樣,需要單獨對不同類型的圖形設置字體,但都非常類似。
用戶的一般需求上面的一些思路就足以,但有時想輸出一些綜合的圖表,比如柱狀圖與折線圖一起輸出,甚至是柱狀圖與很多折線圖一起輸出,
網上也有很多例子,順帶着上面的思想也可以學習折線圖。
綜合圖參考鏈接:
http://blog.sina.com.cn/s/blog_906e353d0101241e.html
https://blog.csdn.net/sb_jb/article/details/77867614?fps=1&locationNum=2