JFreeChart在Struts2中实现3D饼状图统计

在Struts2中,用JFreeChart实现3D饼状图统计

前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例。

下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式

需要加入的jar包有:  jcommon-1.0.17.jar 、 jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) 、 struts2-jfreechart-plugin-2.3.16.3.jar(这个是Struts2所带的,在下载的Struts2的lib目录下)、struts2所常用的9个核心jar包 。 jar包的版本可以有所不同

上述jar包放入到项目的WebRoot/WEB-INF/lib目录下

1、 以java应用程序的方式运行,在web项目中的src目录下新建包: com.jfreechart.test  , 在该包中新建类 PieChart3DTest.java

PieChart3DTest.java

package com.jfreechart.test;

import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;

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.plot.PiePlot3D;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.util.Rotation;

public class PieChart3DTest {

	public static void main(String[] args) throws IOException{

		//步骤1:创建CategoryDataset对象(准备数据)
	    PieDataset dataset = createDataset();
        //步骤2:根据Dataset 生成JFreeChart对象,以及做相应的设置
        JFreeChart jfreeChart = createChart(dataset);
        //步骤3:将JFreeChart对象输出到文件
        saveAsFile("F:\\PieChart3D.jpg", jfreeChart, 800, 600);

	}

	/**
     * 创建一个dataset,该dataset包含图表要显示的数据
     * @return DefaultPieDataset
     */
	private static DefaultPieDataset createDataset() {

		//DefaultPieDataset是默认的饼形图数据集合对象类,可用于创建饼形图数据集合对象
		DefaultPieDataset dataset = new DefaultPieDataset();
		//为dataset对象设值
		dataset.setValue("文学类",20000);
		dataset.setValue("科技类",42000);
		dataset.setValue("财经类",21000);
		dataset.setValue("娱乐类",29000);
		//返回数据集合对象
		return dataset;
	}

	/**
     * 根据PieDataset创建JFreeChart对象
     * @return JFreeChart
     */
    public static JFreeChart createChart(PieDataset pieDataset) {

		//JFreeChart类是一个制图对象类,先用它来创建一个制图对象chart
		//ChartFactory类是制图工厂类,用它来为制图对象chart完成实例化
		//createPieChart3D()是制图工厂的一个方法,用来创建一个3D的饼形图对象
        JFreeChart chart = ChartFactory.createPieChart3D(
        		"图书销量统计图",            //图表标题
        		pieDataset,              //数据集
        		true,                    //是否显示图例
        		false,                   //是否采用标准生成器
        		false                    //是否支持超链接
        		);

        //通过JFreeChart对象的 setTitle方法,修改统计图表的标题部分(包括修改图表标题内容、字体大小等)
        chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22)));
        //调用 JFreeChart对象的 getLegend(int index)方法,取得该图表的指定索引的图例对象,通过 LegendTitle对象来修改统计图表的图例
        LegendTitle legend = chart.getLegend(0);
        //设置图例的字体和字体大小,即位于下方的字的字体和大小
        legend.setItemFont(new Font("宋体", Font.BOLD, 14));
        // 设置画布背景色
        //chart.setBackgroundPaint(new Color(192, 228, 106));

        //取得饼图3D的绘图(plot3D)对象
        PiePlot3D plot3D = (PiePlot3D)chart.getPlot();

        //设置Pie图的分类标签的字体,即位于Pie图的中间部分的每个扇形旁边对应的字的字体
        plot3D.setLabelFont(new Font("隶书", Font.BOLD, 16));
        //设置数据区的背景透明度,范围在0.0~1.0间
        plot3D.setBackgroundAlpha(0.9F);
        //设置PieChart是否显示为圆形
        plot3D.setCircular(true);
        //完全关闭片区外廓,若将值设为 true 即可让外廓显示出来
        plot3D.setSectionOutlinesVisible(false);
        //设置忽略零值,不设值时默认会将一个标签放置在饼图片区显示的位置,并且在图表的图例中添加一个分类。
        //plot3D.setIgnoreZeroValues(true);
        //设置忽略null值,不设值时默认情况跟零值一样
        //plot3D.setIgnoreNullValues(true);

        //设置旋转角度
        plot3D.setStartAngle(90.0);
        //设置旋转方向,Rotation.CLOCKWISE)为顺时针。
        plot3D.setDirection(Rotation.CLOCKWISE);
        //设置图表透明图0.0~1.0范围。0.0为完全透明,1.0为完全不透明。
        plot3D.setForegroundAlpha(0.4F); 

        //设置每个数据区的填充颜色,不设置即默认,默认时是自动分配的
        //plot3D.setSectionPaint("文学类", new Color(200, 255, 255));        

        // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
        plot3D.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));
        // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
        //plot3D.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));

        return chart;
    }

	/**
	 * 保存图表为文件
	 */
    public static void saveAsFile(String filePath, JFreeChart jfreeChart,
            int weight, int height) throws IOException { 

    	//输出图表到文件,saveCharAsJPEG()方法的参数(File file,JFreeChart chart,int width,int height)
        ChartUtilities.saveChartAsJPEG(new File(filePath), jfreeChart, weight, height);
    }

}</span><strong>
</strong>

以java应用程序的方式,运行上面的 PieChart3DTest.java ,便可以在F盘的根目录下产生了一个名叫PieChart3D.jpg文件,如下图所示:

2、 以web项目程序的方式运行

(1)在web项目中的src目录下新建包:com.jfreechart.action,在该包中新建类PieChart3DAction.java

PieChart3DAction.java

package com.jfreechart.action;

import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Map;

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.plot.PiePlot3D;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.util.Rotation;

import com.jfreechart.commons.FileUtil;
import com.opensymphony.xwork2.ActionContext;

public class PieChart3DAction {
	private JFreeChart chart;

	// 必须提供 getChart() 方法,且由该方法返回 JFreeChart 对象
	public JFreeChart getChart() throws Exception {
		//JFreeChart类是一个制图对象类,先用它来创建一个制图对象chart
		//ChartFactory类是制图工厂类,用它来为制图对象chart完成实例化
		//createPieChart3D()是制图工厂的一个方法,用来创建一个3D的饼形图对象
        chart = ChartFactory.createPieChart3D(
        		"图书销量统计图",            //图表标题
        		createDataset(),         //数据集
        		true,                    //是否显示图例
        		false,                   //是否采用标准生成器
        		false                    //是否支持超链接
        		);

        //通过JFreeChart对象的 setTitle方法,修改统计图表的标题部分(包括修改图表标题内容、字体大小等)
        chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22)));
        //调用 JFreeChart对象的 getLegend(int index)方法,取得该图表的指定索引的图例对象,通过 LegendTitle对象来修改统计图表的图例
        LegendTitle legend = chart.getLegend(0);
        //设置图例的字体和字体大小,即位于下方的字的字体和大小
        legend.setItemFont(new Font("宋体", Font.BOLD, 14));
        // 设置画布背景色
        //chart.setBackgroundPaint(new Color(192, 228, 106));

        //取得饼图3D的绘图(plot3D)对象
        PiePlot3D plot3D = (PiePlot3D)chart.getPlot();

        //设置Pie图的分类标签的字体,即位于Pie图的中间部分的每个扇形旁边对应的字的字体
        plot3D.setLabelFont(new Font("隶书", Font.BOLD, 16));
        //设置数据区的背景透明度,范围在0.0~1.0间
        plot3D.setBackgroundAlpha(0.9F);
        //设置PieChart是否显示为圆形
        plot3D.setCircular(true);
        //完全关闭片区外廓,若将值设为 true 即可让外廓显示出来
        plot3D.setSectionOutlinesVisible(false);
        //设置忽略零值,不设值时默认会将一个标签放置在饼图片区显示的位置,并且在图表的图例中添加一个分类。
        //plot3D.setIgnoreZeroValues(true);
        //设置忽略null值,不设值时默认情况跟零值一样
        //plot3D.setIgnoreNullValues(true);

        //设置旋转角度
        plot3D.setStartAngle(90.0);
        //设置旋转方向,Rotation.CLOCKWISE)为顺时针。
        plot3D.setDirection(Rotation.CLOCKWISE);
        //设置图表透明图0.0~1.0范围。0.0为完全透明,1.0为完全不透明。
        plot3D.setForegroundAlpha(0.4F); 

        //设置每个数据区的填充颜色,不设置即默认,默认时是自动分配的
        //plot3D.setSectionPaint("文学类", new Color(200, 255, 255));        

        // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
        plot3D.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));
        // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
        //plot3D.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));

        //设置生成的图表的文件名
        String fileName = "PieChart3DBook.jpg";
        //设置图像输出的指定路径
        String filePath = FileUtil.getWebRootPath()+"images\\chart\\"+fileName;
        //输出图表到文件
        saveAsFile(filePath, chart, 800, 600);

        //取得request对象
        Map request = (Map)ActionContext.getContext().get("request");
		//把生成的图表文件的路径filePath放进request对象中
        request.put("filePath", filePath);

		return chart;
	}

	/**
	 * 保存图表为文件
	 */
    public static void saveAsFile(String filePath, JFreeChart jfreeChart,
            int weight, int height) throws IOException { 

    	//输出图表到文件,saveCharAsJPEG()方法的参数(File file,JFreeChart chart,int width,int height)
        ChartUtilities.saveChartAsJPEG(new File(filePath), jfreeChart, weight, height);
    }

	/**
     * 创建一个dataset,该dataset包含图表要显示的数据
     * @return DefaultPieDataset
     */
	private static DefaultPieDataset createDataset() {

		//DefaultPieDataset是默认的饼形图数据集合对象类,可用于创建饼形图数据集合对象
		DefaultPieDataset dataset = new DefaultPieDataset();
		//为dataset对象设值
		dataset.setValue("文学类",20000);
		dataset.setValue("科技类",42000);
		dataset.setValue("财经类",21000);
		dataset.setValue("娱乐类",29000);
		//返回数据集合对象
		return dataset;
	}

	//在struts.xml中的对应<action>里,应该写的是  method="pieChart3D" 和  <result type="chart">
	public String pieChart3D() {
		return "success";
	}
}

(2)在web项目中的src目录下新建struts.xml文件

struts.xml

[html] view
plain
copyprint?

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
  3. <struts>
  4. <!-- 配置 Struts 2 应用中的常量 -->
  5. <constant name="struts.i18n.encoding" value="UTF-8"/>
  6. <!-- 配置本应用中的包,继承 jfreechart-default 包 -->
  7. <package name="chart" extends="jfreechart-default">
  8. <!-- 定义一个名为 barChart3D 的 Action -->
  9. <action name="pieChart3D" class="com.jfreechart.action.BarChart3DAction" method="pieChart3D">
  10. <result type="chart">
  11. /PieChart3D.jsp
  12. <!-- 定义 JFreeChart 报表的大小 -->
  13. <param name="width">800</param>
  14. <param name="height">500</param>
  15. </result>
  16. </action>
  17. </package>
  18. </struts>

(3))修改在web项目中的WebRoot/WEB-INF/目录下的web.xml

web.xml

[java] view
plain
copyprint?

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="3.0"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7. <!-- 设置struts 2过滤器 -->
  8. <filter>
  9. <filter-name>struts 2</filter-name>
  10. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  11. </filter>
  12. <filter-mapping>
  13. <filter-name>struts 2</filter-name>
  14. <url-pattern>/*</url-pattern>
  15. </filter-mapping>
  16. <!-- 设置欢迎页面 -->
  17. <welcome-file-list>
  18. <welcome-file>index.jsp</welcome-file>
  19. </welcome-file-list>
  20. <!-- session超时定义,单位为分钟 -->
  21. <session-config>
  22. <session-timeout>30</session-timeout>
  23. </session-config>
  24. </web-app>

(4)在web项目中的src目录下新建包: com.jfreechart.commons , 在该包中新建类 FileUtil.java

FileUtil.java

[java] view
plain
copyprint?

  1. package com.jfreechart.commons;
  2. import javax.servlet.ServletContext;
  3. import org.apache.struts2.ServletActionContext;
  4. import com.opensymphony.xwork2.ActionContext;
  5. public class FileUtil {
  6. /**
  7. * 获得web项目根目录
  8. */
  9. public static String getWebRootPath() throws Exception {
  10. ActionContext actionContext = ActionContext.getContext();
  11. ServletContext servletContext = (ServletContext)actionContext.get(ServletActionContext.SERVLET_CONTEXT);
  12. String rootPath = servletContext.getRealPath("/");
  13. return rootPath;
  14. }
  15. }

(5)修改在web项目中的WebRoot/目录下新建index.jsp、PieChart3D.jsp

index.jsp

[java] view
plain
copyprint?

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>首页</title>
  11. </head>
  12. <body>
  13. <a href="barChart3D.action">查看3D饼状图</a><br />
  14. </body>
  15. </html>

PieChart3D.jsp

[java] view
plain
copyprint?

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib prefix="s" uri="/struts-tags"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>3D饼状图</title>
  12. </head>
  13. <body>
  14. <img src="<s:property value="#request.filePath" />" />
  15. </body>
  16. </html>

完成以上步骤后,把项目部署到服务器,在浏览器中访问该项目的index.jsp文件,点击“查看3D饼状图”的链接,即可跳转到PieChart3D.jsp页面,3D饼状图图表就显示在PieChart3D.jsp页面上了,图表的效果如上图一致。另外,上述所用的方法是 把图表先生成一个jpg文件,存放在服务器上的该web项目的相关目录下,然后在前台的jsp页面中引用该文件在项目中的的文件路径,即可把图表显示到前台页面中

时间: 2024-10-14 13:19:10

JFreeChart在Struts2中实现3D饼状图统计的相关文章

使用 jfreechart 生成 曲线、柱状图、饼状图、分布图 展示到JSP

原文:使用 jfreechart 生成 曲线.柱状图.饼状图.分布图 展示到JSP 源代码下载地址:http://www.zuidaima.com/share/1550463634410496.htm 虽然现在JS做报表和图形展示已经非常普遍和漂亮了,但是不能忽略有jfreechart 这样一种东西! 这些翻阅资料,在看以前写的示例时发现了关于jfreechart 的简单示例,不管怎样发上来分享一下!

AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示

前言: "宁肯像种子一样等待  也不愿像疲惫的陀螺  旋转得那样勉强" 这是前几天在查资料无意间看到的一位园友的签名,看完后又读了两遍,觉得很有味道.后来一寻根究底才知这是出资大诗人汪国真之口,出处<她>.且抛开上下文,单从这短短几句,正恰如其分的折射出有一群人,他们穿着不那么fashion,言辞不那么犀利,但是内心某一块地方像是躁动的火山,拥有无尽的动力和激情,矢志不渝种子般投身到技术研究和心得分享当中. 或许每一次的生长都是那么悄无声息,但是无数次的坚持只是为了破土那日

JFreeChart在Struts2中实现3D折线图统计

在Struts2中,用JFreeChart实现3D折线图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式 需要加入的jar包有:  jcommon-1.0.17.jar . jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) . struts2-jfreechart-plugin-2.3.16.3.jar

JFreeChart在Struts2中实现3D柱状图统计

上篇介绍了JFreeChart柱状图在Struts2中的实现,这篇来看一下3D柱状图的实现. 在Struts2中,用JFreeChart实现3D柱状图统计 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式 需要加入的jar包有:  jcommon-1.0.17.jar . jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) . struts2-jfreechart-plugin-2

Flash饼状图统计代码

index.html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=

FusionChart实现柱状图、饼状图的动态数据显示 附Demo

最近做的项目中需要用饼状图显示——'问卷调查'的统计结果(之前用过FusionChart做过柱状图的数据展示,那还是两年前的事了),在网上查了下FusionChart实现饼状图显示方面的资料,却发现资料都比较零散.不完整,或者说没有简洁明了的说清楚其用法,到FusionChart官网上去看,无奈是英文的,而且Deom项目太大,没有耐心去看,最后还是将以前的项目找出来,摸索着弄了下搞定,现将FusionChart实现柱状图.饼状图的动态数据显示的方法和经验写出来,希望对做web开发需要的朋友能有所

绘制matplotlib 饼状图

参考:https://blog.csdn.net/ScarlettYellow/article/details/80458797 (2)2016年就业人员在三次产业中分布的饼状图. def swap(list): date = [] name = [] for i in range(0,len(list)): date.append(list[i][1]) name.append(list[i][0]) return date, name def fun2(): # 构造数据 industry3

js饼状图(带百分比)功能实现,新人必懂

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <title></title> 6 <script src="../../js/my/highcharts.js"></script> 7 <script src="../../css2/jquery-1.10.2.min.js

JFreeChart框架中生成饼状图上怎样显示数据 [问题点数:40分,结帖人GreenLawn]

我用JFreeChart框架生成饼状图,但想把数据信息在饼图上显示,是在饼图内部(即圆内)显示!怎样实现啊?? 去掉lablepieplot.setLabelGenerator(null);去掉线pieplot.setLabelLinksVisible(false); 饼图标签显示百分比方法PiePlot pp = (PiePlot)chart.getPlot();pp.setLabelGenerator(new StandardPieSectionLabelGenerator("{2}&quo