Spring+JFreeChart 自动生成统计图
程序员文章站
2022-06-09 17:15:17
...
图示:
web.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>Spring12JFreeChart</display-name> <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>/servlet/DisplayChart</url-pattern> </servlet-mapping> <servlet> <servlet-name>freechart</servlet-name> <servlet-class>cn.jfreeChart.BankPieChart</servlet-class> </servlet> <servlet-mapping> <servlet-name>freechart</servlet-name> <url-pattern>/image/bankpiechart</url-pattern> </servlet-mapping> </web-app>
1.jsp 3D柱形图
<%@ page contentType="text/html; charset=utf-8"%> <%@ page import="org.jfree.chart.JFreeChart" %> <%@ page import="org.jfree.chart.plot.PlotOrientation" %> <%-- 可以将形成的图片保存成文件 --%> <%@ page import="org.jfree.chart.servlet.ServletUtilities" %> <%@ page import="org.jfree.chart.title.TextTitle" %> <%@ page import="java.awt.Font" %> <%@ page import="org.jfree.chart.ChartFactory" %> <%@ page import="org.jfree.data.category.DefaultCategoryDataset" %> <%@ page import="java.awt.GradientPaint" %> <%@ page import="java.awt.Color" %> <%@ page import="org.jfree.chart.renderer.category.BarRenderer" %> <%@ page import="org.jfree.chart.plot.CategoryPlot" %> <%@ page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator" %> <%@ page import="org.jfree.chart.axis.ValueAxis" %> <%@ page import="org.jfree.chart.axis.CategoryAxis" %> <% //1.建立一个默认的类型数据集 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); //数值,行比较器,列比较器,列入表中 dataset.addValue(150, "广东", "蛇"); dataset.addValue(160, "广东", "龙"); dataset.addValue(170, "广东", "马"); dataset.addValue(180, "广东", "狗"); dataset.addValue(130, "广东", "虎"); dataset.addValue(150, "广东", "凤"); dataset.addValue(170, "广东", "猫"); String title = "广州地区兽类销量统计图"; //2.用 ChartFactory 工厂来建立一个 3D 的柱形图 //参数:图的标题,水平标题,垂直标题,数据集,图表方向,是否包含图例,是否包含提示,是否包含 URL JFreeChart chart = ChartFactory.createBarChart3D( title, "兽类", "销量", dataset, PlotOrientation.VERTICAL, false, false, false); //以下代码可选 chart.setTitle(new TextTitle(title, new Font("微软雅黑",Font.ITALIC,24))); CategoryPlot plot = chart.getCategoryPlot(); //高度 int height = 400; //条形有个渐变的效果 GradientPaint gp = new GradientPaint(0,0,Color.BLACK,0,height,Color.RED); BarRenderer renderer = (BarRenderer)plot.getRenderer(); renderer.setSeriesPaint(0, gp); //设置每个条的宽度 renderer.setMaximumBarWidth(0.08); //设置条形上显示数字 renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); renderer.setBaseItemLabelPaint(Color.WHITE); //设置 Y 向的汉字 ValueAxis y = plot.getRangeAxis(); y.setLabelFont(new Font("宋体",Font.PLAIN,14)); //设置 X 向的汉字 CategoryAxis x = plot.getDomainAxis(); x.setLabelFont(new Font("宋体",Font.PLAIN,14)); //X 轴汉字 x.setTickLabelFont(new Font("微软雅黑", Font.PLAIN,14)); //3.返回一个已经建立好的文件名,放在 temp 临时文件夹中,设置 session , 每个 session 会产生一个图形文件,tomcat 关闭后自动删除 String fileName = ServletUtilities.saveChartAsPNG(chart, 550, height, session); //4.DisplayChart 是 org.jfree.chart.servlet 包中的一个HttpServlet,使用前要在 web.xml 中布署 String url = request.getContextPath()+("/servlet/DisplayChart?filename="+fileName);; %> <html> <head> <title>兽类销售统计图</title> </head> <body style="background-color: #fff;"> <p style="text-align: center;"> <img alt="兽类销量统计图" src="<%=url%>"/> </p> </body> </html>
效果图:
2.jsp 3D柱形图2
<%@ page contentType="text/html; charset=utf-8"%> <%@ page import="org.jfree.chart.JFreeChart" %> <%-- 设置图表的方向包 --%> <%@ page import="org.jfree.chart.plot.PlotOrientation" %> <%-- 可以将形成的图片保存成文件 --%> <%@ page import="org.jfree.chart.servlet.ServletUtilities" %> <%@ page import="org.jfree.chart.ChartFactory" %> <%@ page import="org.jfree.chart.axis.CategoryAxis" %> <%@ page import="org.jfree.data.category.DefaultCategoryDataset" %> <%@ page import="org.jfree.chart.axis.AxisLocation" %> <%@ page import="java.awt.*" %> <%@ page import="org.jfree.chart.axis.ValueAxis" %> <%@ page import="org.jfree.chart.title.TextTitle" %> <%@ page import="org.jfree.chart.plot.CategoryPlot" %> <%@ page import="org.jfree.chart.renderer.category.BarRenderer" %> <%@ page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator" %> <%@ page import="org.jfree.chart.labels.ItemLabelPosition" %> <%@ page import="org.jfree.chart.labels.ItemLabelAnchor" %> <%@ page import="org.jfree.ui.TextAnchor" %> <%@ page import="org.jfree.chart.title.LegendTitle" %> <% //1.建立一个默认的类型数据集 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); //数值,行比较器,列比较器,列入表中 dataset.addValue(550, "广东", "蛇"); dataset.addValue(560, "广东", "龙"); dataset.addValue(570, "广东", "马"); dataset.addValue(580, "广东", "狗"); dataset.addValue(530, "广东", "虎"); dataset.addValue(650, "广东", "凤"); dataset.addValue(670, "广东", "猫"); dataset.addValue(650, "广西", "蛇"); dataset.addValue(660, "广西", "龙"); dataset.addValue(630, "广西", "虎"); dataset.addValue(450, "广西", "凤"); dataset.addValue(470, "广南", "猫"); dataset.addValue(450, "广南", "蛇"); dataset.addValue(460, "广南", "龙"); String title = "广州地区兽类销量统计图"; //2.用 ChartFactory 工厂来建立一个 3D 的柱形图 //参数:图的标题,水平标题,垂直标题,数据集,图表方向,是否包含图例,是否包含提示,是否包含 URL JFreeChart chart = ChartFactory.createBarChart3D( title, "兽类", "销量", dataset, PlotOrientation.VERTICAL, true, true, true); chart.setTitle(new TextTitle(title, new Font("微软雅黑",Font.ITALIC,24))); //得到图表的 CategoryPlot 对象,设置更多的属性 CategoryPlot plot = chart.getCategoryPlot(); plot.setNoDataMessage("没有数据"); plot.setBackgroundPaint(Color.lightGray);//设定图表数据显示部分背景色 plot.setDomainGridlinePaint(Color.white);//横坐标网络线白色 plot.setDomainGridlinesVisible(true);//可见 plot.setRangeGridlinePaint(Color.white);//纵坐标网络线白色 //设置地区、销量显示位置 plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); //改变柱子的颜色 BarRenderer renderer = (BarRenderer)plot.getRenderer(); renderer.setSeriesPaint(0, Color.decode("#ff6600"));//给 series1 Bar renderer.setSeriesPaint(1, Color.decode("#003399"));//给 series2 Bar renderer.setSeriesPaint(2, Color.decode("#cc0000"));//给 series3 Bar renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); ItemLabelPosition itemLabelPosition= new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER,TextAnchor.CENTER,0.0D); renderer.setBasePositiveItemLabelPosition(itemLabelPosition); //得到轴对象 ValueAxis y = plot.getRangeAxis();//有值的轴 //设置最小从 150 开始,而不是从 0 开始 y.setRange(100d, 700d);//设置范围 y.setTickLabelFont(new Font("Arial",Font.BOLD,12));//设置方向的字体 y.setLabelFont(new Font("黑体",Font.PLAIN,14)); //设置 X 轴 CategoryAxis x = plot.getDomainAxis();//设置 X 轴的字体 x.setTickLabelFont(new Font("宋体",Font.BOLD,12));//设置 X 轴的字体 x.setLabelFont(new Font("黑体",Font.PLAIN,14)); //图例 LegendTitle legendTitle = chart.getLegend(); legendTitle.setItemFont(new Font("宋体",Font.BOLD,12));//设置图例的字体 //3.返回一个已经建立好的文件名,放在 temp 临时文件夹中,设置 session , 每个 session 会产生一个图形文件,tomcat 关闭后自动删除 String fileName = ServletUtilities.saveChartAsPNG(chart, 640, 550, session); //4.DisplayChart 是 org.jfree.chart.servlet 包中的一个HttpServlet,使用前要在 web.xml 中布署 String url = request.getContextPath()+("/servlet/DisplayChart?filename="+fileName);; %> <html> <head> <title>兽类销售统计图</title> </head> <body style="background-color: #fff;"> <p style="text-align: center;"> <img alt="兽类销售统计图" src="<%=url%>"/> </p> </body> </html>
效果图:
BankPieChart 通过Servlet输出饼状图
package cn.jfreeChart; import java.awt.Font; import java.io.IOException; import java.text.DecimalFormat; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.labels.StandardPieToolTipGenerator; import org.jfree.chart.plot.PiePlot; import org.jfree.chart.title.TextTitle; import org.jfree.data.general.DefaultPieDataset; /** * Servlet 直接输出图表 * */ @SuppressWarnings("serial") public class BankPieChart extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { serivce(request, response); } protected void serivce(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String title = "世界人口在某公司本占有率"; response.setContentType("image/jpeg"); DefaultPieDataset data = getDataset(); //建立的图表对象 JFreeChart chart = ChartFactory.createPieChart3D(title, data, true, false, false); chart.setTitle(new TextTitle(title, new Font("微软雅黑", Font.ITALIC, 24))); PiePlot plot = (PiePlot) chart.getPlot(); plot.setLabelFont(new Font("黑体",Font.PLAIN,12)); //设置饼形图的百分比 plot.setToolTipGenerator(new StandardPieToolTipGenerator("{0}\n{1}-({2})", new DecimalFormat("0"),new DecimalFormat("#.##%"))); plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}\n{1}-({2})", new DecimalFormat("0"),new DecimalFormat("#.##%"))); chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,13)); //在这里是用 write 到输出流中,而不是用 save ChartUtilities.writeChartAsPNG(response.getOutputStream(), chart, 500, 350); } //得到数据的类 private static DefaultPieDataset getDataset(){ //建立一个默认的种类数据集 DefaultPieDataset dataset = new DefaultPieDataset(); //第一个参数为名称,第二个参数是 double 类型,并非百分比 dataset.setValue("中国人口", 500); dataset.setValue("美国人口", 400); dataset.setValue("欧洲人口", 300); dataset.setValue("日本人口", 100); dataset.setValue("非洲人口", 300); return dataset; } }
3.jsp 饼状图
<%@ page contentType="text/html; charset=utf-8"%> <html> <head> <title>人口</title> </head> <body style="background-color: #fff;"> <p style="text-align: center;"> <img alt="人口" src="image/bankpiechart"> </p> </body> </html>
效果图:
下一篇: JavaScript 自定义对象方法汇总