使用JfreeChart开发图表经验总结(含源码)
WEB图表开发系列一:使用JFreeChart生成热点图表
WEB图表开发系列一:使用JFreeChart生成热点图表<一>前言:JFreeChart是开放源代码站点上的一个JAVA项目。
它的功能十分强大,能创建饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等,并可生成PNG或JPG图片格式文件。
本人在学习过程中发现,网上很多文章都是讲一些JFreeChart的基本应用,而对JFreeChart生成热点图表这样常用的功能虽有所提及却没有一个完整的例子,所以我就写一个简单示例供大家参考,希望对大家的学习有所帮助。
<二>示例说明:假设有一个关于程序员北京,上海,广洲三地程序员学历,开发语言,薪金情况的调查。
首先要以饼图显示程序员学历的分布情况(index.jsp)。
点击饼图的每一部分会以柱状图显示该层次程序员所用开发语言和薪金的情况(barview.jsp)。
重点演示怎样在饼图上添加链接。
<三>准备工作:1.下载最新版本的JFreeChart,当前为jfreechart-1.0.0-rc1下载地址:/jfreechart/index.html2.解压文件,将jfreechart-1.0.0-rc1/lib下的jcommon-1.0.0-rc1.jar,jfreechart-1.0.0-rc1.jar复制到WEB应用的lib目录下。
3.在web.xml文件中增加以下内容:1.<servlet>2.<servlet-name>DisplayChart</servlet-name>3.<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>4.</servlet>5.<servlet-mapping>6.<servlet-name>DisplayChart</servlet-name>7.<url-pattern>/servletDisplayChart</url-pattern>8.</servlet-mapping><四>饼图页面代码(index.jsp)1.<%@ page contentType="text/html;charset=GBK"%>2.<%@ page import="org.jfree.data.general.DefaultPieDataset"%>3.<%@ page import="org.jfree.chart.*"%>4.<%@ page import="org.jfree.chart.plot.*"%>5.<%@ page import="org.jfree.chart.servlet.ServletUtilities"%>6.<%@ page import="bels.StandardPieItemLabelGenerator"%>7.<%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%>8.<%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>9.<%@ page import="java.io.*"%>10.<HTML>11.<HEAD>12.<META http-equiv=Content-Type content="text/html; charset=GBK">13.<TITLE>nacl_zhuang@</TITLE>14.</HEAD>15.<BODY>16.<%17.18.DefaultPieDataset data = new DefaultPieDataset();19.data.setValue("高中以下",370);20.data.setValue("高中",1530);21.data.setValue("大专",5700);22.data.setValue("本科",8280);23.data.setValue("硕士",4420);24.data.setValue("博士",80);25.26.PiePlot3D plot = new PiePlot3D(data);//3D饼图27.plot.setURLGenerator(new StandardPieURLGenerator("barview.jsp"));//设定链接28.JFreeChart chart = new JFreeChart("",JFreeChart.DEFAULT_TITLE_FONT, plot, true);29.chart.setBackgroundPaint(java.awt.Color.white);//可选,设置图片背景色30.chart.setTitle("程序员学历情况调查表");//可选,设置图片标题31.plot.setToolTipGenerator(new StandardPieItemLabelGenerator());32.StandardEntityCollection sec = new StandardEntityCollection();33.ChartRenderingInfo info = new ChartRenderingInfo(sec);34.PrintWriter w = new PrintWriter(out);//输出MAP信息35.//500是图片长度,300是图片高度36.String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);37.ChartUtilities.writeImageMap(w, "map0", info, false);38.39.String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename="+ filename;40.41.%>42.43.<P ALIGN="CENTER">44.<img src="<%= graphURL %>"width=500 height=300 border=0usemap="#map0">45.</P>46.</BODY>47.</HTML>生成的图片如下在浏览器中点右键->查看源文件会发现有以下一段HTML代码:1.<map id="map0"name="map0">2.<area shape="poly"coords="247,61,250,61,250,123,250,123"title="博士= 80"alt=""href="barview.jsp?category=博士&pieIndex=0"/>3.<area shape="poly"coords="148,112,153,102,160,92,170,83,182,76,196,70,212,65,229,62,247,61,250,123,250,123"title="硕士= 4,420"alt=""href="barview.jsp?category=硕士&pieIndex=0"/>4.<area shape="poly"coords="324,167,311,173,297,179,282,182,266,185,250,186,234,185,217,183,202,179,188,173,175,167,165,159,1 57,151,151,142,147,132,146,122,148,112,250,123,250,123"title="本科= 8,280"alt=""href="barview.jsp?category=本科&pieIndex=0"/>5.<area shape="poly"coords="307,72,324,80,338,91,347,103,352,117,352,131,347,144,338,156,324,167,250,123,250,123"title="大专= 5,700"alt=""href="barview.jsp?category=大专&pieIndex=0"/>6.<area shape="poly"coords="261,62,285,65,307,72,250,123,250,123"title="高中= 1,530"alt=""href="barview.jsp?category=高中&pieIndex=0"/>7.<area shape="poly"coords="250,61,261,62,250,123,250,123"title="高中以下= 370"alt=""href="barview.jsp?category=高中以下&pieIndex=0"/>8.</map>这就是MAP信息,我们在IMG标签中加入usemap="#map0"就可以为饼图的每一部分加入链接。
通过代码实例跟我学JFreeChart 图表组件——在J2EE Web应用系统中采用MVC架构实现方式应用JFreeChart的实例
1.1通过代码实例跟我学JFreeChart 图表组件——在J2EE Web应用系统中采用MVC架构实现方式应用JFreeChart的实例1、添加一个请求的页面 requestImageFormMVC.jsp(1)添加requestImageFormMVC.jsp页面文件(2)requestImageFormMVC.jsp页面的代码示例<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>请求的页面</title></head><body><form action="/JFreeChart/showSomeImage" method="post">图像的宽度:<input type="text" name="imagesWidth" /> <br>图像的高度:<input type="text" name="imagesHeight" /> <br>图像的标题:<input type="text" name="imagesTitle" /> <br><input type="submit" value="提交" /></form></body></html>2、响应结果的页面showSomeImageMVC.jsp(1)添加showSomeImageMVC.jsp页面文件(2)showSomeImageMVC.jsp页面的代码示例<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'showSomeImageMVC.jsp' starting page</title></head><body><table border="1" align="center" bordercolor="#6699FF" class="wd_red"><tr><td>这是Pie图的数据</td><td rowspan="3" align="center"><img src="<%= request.getAttribute("targetGraphURL") %>" border=0 usemap="#<%= request.getAttribute("graphFileName") %>"></td></tr><tr><td>这是Pie图的其它数据</td></tr><tr><td>这是Pie图的其它数据</td></tr></table></body></html>3、设计对应的Servlet组件程序(1)程序类名称为 ShowSomeImage,包名称为com.px1987.jfreechart.servlet(2)设置URL-Pattern为/showSomeImage(3)编程该Servlet组件中的功能实现代码package com.px1987.jfreechart.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.px1987.jfreechart.model.WebPieChartBean;public class ShowSomeImage extends HttpServlet {public ShowSomeImage() {super();}public void destroy() {super.destroy();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("gb2312");String imagesWidth=request.getParameter("imagesWidth");String imagesHeight=request.getParameter("imagesHeight");String imagesTitle=request.getParameter("imagesTitle");WebPieChartBean pieChartBeanID=new WebPieChartBean();pieChartBeanID.setImagesWidth(imagesWidth);pieChartBeanID.setImagesHeight(imagesHeight);pieChartBeanID.setImagesTitle(imagesTitle);pieChartBeanID.setRequest(request);pieChartBeanID.createImageMVC();String graphFileName=pieChartBeanID.getGraphFileName();String targetGraphURL=pieChartBeanID.getTargetGraphURL();request.setAttribute("graphFileName", graphFileName);request.setAttribute("targetGraphURL", targetGraphURL);RequestDispatcheroneRequestDispatcher=request.getRequestDispatcher("/showSomeImageMVC.jsp");oneRequestDispatcher.forward(request, response);}public void init() throws ServletException {}}4、测试本示例目前的应用效果(1)在浏览器中输入测试页面的URL地址:http://127.0.0.1:8080/JFreeChart/requestImageFormMVC.jsp(2)在表单中输入图表相关的工作参数,如何再提交表单,将出现下面的执行结果。
利用JfreeChart开发包绘制图表
作者 简介:王征强(97 ,湖北黄 冈人 ,邢台职业技术学院电子工程 系,北京航 空航天大学在读硕士。 17 一)
确 ,但 有着 不直 观 、不 易被 人脑所 理 解 的缺 点 。人们 从可 视化 图表 中吸 取信 息远 比从 数据 形式 中吸取 信 息 更快 、更 有效 ,更方便 。为 了提 供 更强 大 的信 息 ,这 就需要 我们 把统 计数 据进 行可 视化 ,为此把 统计
数据转化为可视化的图表显得尤为必要。本文使用当今计算机界最热门的语言 Jv 和 J eC a 开发包 aa f e hr r t
出各 种 复杂 、漂亮 的图表 。
在 目前广 泛 应用 的 BS结构 中 ,看看 如何 用 Jv 语言 实现 We / aa b统计 图表 。
使用 J a p l 显示图形,适用于支持 Jv A pe 的浏览器。缺点是开发难度较高,速度慢, a Apt v e aa p l t 需 要针 对 具体 的应用 要求 编制 Jv 图程序 。 aa绘
在 服 务器端 使用 控件动 态 生成 图形 文件 ,此 方法可 以适用于 任何 流行 的客户 端浏 览器 。基于 Jv aa 语言 的 Jre hr包 、PA(ueJV f C at e J P r aaAWT包 和 Jc Jv jc o c ne ) si(aaObetfr i c)包 ,这 几个都 是开放源 代 s Se
码的包,开发简单 ,使用方便 ,客户端无需安装其他软件 ,只要使用通用浏览器 即可显示统计图形。 各种控件虽然使用语言各不相 同, 但是使用方法大同小异。 大致步骤如下: . 1 首先创建一个图表对象;
2给 图表 的各个 属性 赋值 ,如 图表 的标题 、长 、宽 ,要 绘制什 么类 型 的图表等 ;3建 立数据 集 ,给 图表 中 . . 加 入数据 :4生成统 计 图形文 件 ;5把 图形文 件放 在合 适 的位 置上进 行显 示 。 . .
通过代码实例跟我学JFreeChart 图表组件——在Java应用程序中创建饼图的应用实例(Eclipse开发工具版本)
data, true, // 是否显示图例
false,
// 是否显示 tooltips
false); //是否显示 URLs
/* PiePlot pieplot = (PiePlot)jfreechart.getPlot(); //通过 JFreeChart 对象获得 PiePlot,
然后对它进行修改和定制
就需要再通过 get 方法得出相应的 Plot 类对象并进行修改和定制它们。
3、创建饼图的代码示例
(1)创建一个数据源(dataset)
饼图的 dataset 一般是用 PieDataset 接口,具体实现类是 DefaultPieDataset。下面为代码示例:
private static DefaultPieDataset getDataSet() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Java",100);
dataset.setValue("C++",200);
dataset.setValue("Basica",300);
dataset.setValue("J2EE",400);
dataset.setValue("",500);
return dataset;
}
(2)由 ChartFactory 类产生出 JFreeChart 类的对象实例
JFreeChart chart = ChartFactory.createPieChart3D("创建饼图的示例", // 图表标题
利用JFreeChart生成折线图
利用JFreeChart生成折线图通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折线图。
如果想生成普通效果的折线图,需要通过工厂类ChartFactory的createLineChart()方法获得JFreeChart类的实例;如果想生成3D效果的折线图,需要通过工厂类ChartFactory的createLineChart3D()方法获得JFreeChart类的实例。
这两个方法的入口参数是完全相同的,各个入口参数的类型及功能请参见14.2.1节的表14.2。
可以分别通过绘图区对象CategoryPlot的getDomainAxis()方法和getRangeAxis()方法,获得横轴对象和纵轴对象,通过得到的轴对象可以设置绘制坐标轴的相关属性,常用方法及实现功能如表14.4所示。
表14.4 设置坐标轴绘制属性的部分通用方法纵轴对象还提供了设置坐标最大值的方法setUpperBound(double max),在默认情况下将最大值控制在能够正常绘制统计图的范围内。
通过java.awt.BasicStroke类可以绘制出各种各样的线段,大体分为实线段和虚线段,可控的绘制条件包括线条的宽度、线段端点的风格、折线段的折点风格、虚线段的绘制风格和虚线段的绘制偏移量,BasicStroke类提供的所有构造方法如表14.5所示。
表14.5 BasicStroke类提供的所有构造方法线段端点的修饰风格有3种,分别由3个常量表示,具体信息如表14.6所示。
表14.6 线段端点修饰风格简介线段折点的修饰风格同样有3种,也由3个常量表示,具体信息如表14.7所示。
表14.7 线段折点修饰风格简介入口参数dash 用来定义虚线,为float 型数组,当dash 数组由偶数个元素组成时,索引值为偶数的元素值代表虚线段的长度,索引值为奇数的元素值代表两个虚线段之间的空白部分的长度,需要注意的是,数组的索引值是从0开始的;当数组中只有一个元素时,例如dash={6},等同于dash={6,6}。
通过代码实例跟我学JFreeChart 图表组件——在J2EE Struts Web应用系统中应用JFreeChart的实例(第2部分)
1.1
通过代码实例跟我学 JFreeChart 图表组件——在 J2EE Struts Web 应
用系统中应用 JFreeChart 的实例(第 2 部分)
1.1.1 设计利用命令模式实现的业务层组件的命令接口 1、接口名称为 WebChartCommandInterface,包名称为 com.px1987.jfreechart.model
杨教授工作室,版权所有,盗版必究, 2/31 页
Hale Waihona Puke implements WebChartCommandInterface
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料
private String graphFileName = null; public PieChartBean() { } //下面的方法提供给 JavaBean(webChartBean.java) public String generateSomeChart(String chartTitleString,String categoryName, String numberString, HttpSession java.io.IOException { PrintWriter pw=new PrintWriter(out); DefaultPieDataset pieDatasetData =new DefaultPieDataset(); pieDatasetData.setValue("J2SE 技术",400); pieDatasetData.setValue("C++语言",580); pieDatasetData.setValue(" 技术",718); pieDatasetData.setValue("软件测试",820); try { PiePlot plot = new PiePlot(pieDatasetData); plot.setToolTipGenerator(new StandardPieToolTipGenerator()); tooltip 文字 plot.setURLGenerator(new StandardPieURLGenerator("WebChartHelp.jsp")); 图表上产生超链接 JFreeChart pieChart = new JFreeChart(chartTitleString, JFreeChart.DEFAULT_TITLE_FONT, plot, true); pieChart.setBackgroundPaint(java.awt.Color.white); ChartRenderingInfo StandardEntityCollection());
JFreeChart图表制作
两个大的包组成:org.jfree.chart 与org.jfree.data。其中前者主要与图 形本身有关,后者与图形显示的数据有关。 核心类主要有: org.jfree.chart.JFreeChart :图表对象,任何类型的图表的最终表现形 式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个 工厂类用于创建不同类型的图表对象。 org.jfree.data.category.XXXDataSet: 数据集对象,用于提供显示图 表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类。 org.jfree.chart.plot.XXXPlot :图表区域对象,基本上这个对象决定着 什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对 象的支持 org.jfree.chart.axis.XXXAxis :用于处理图表的两个轴:纵轴和横轴。 org.jfree.chart.render.XXXRender :负责如何显示一个图表对象。 org.jfree.chart.urls.XXXURLGenerator: 用于生成Web图表中每个项目 的鼠标点击链接。 XXXXXToolTipGenerator: 用于生成图象的帮助提示,不同类型图表对 应不同类型的工具提示类。
了解JFreeChart 利用JFreeChart生成饼状图 利用JFreeChart生成柱状图 利用JFreeChart生成折线图 利用JFreeChart生成时序图 JFreeChat的Web应用
JFreeChart(/) 是一个开 源的 JAVA 项目,它主要用来开发各种各样的图 表,这些图表包括:饼图、柱状图 ( 普通柱状图 以及堆栈柱状图 ) 、线图、区域图、分布图、混 合图、甘特图以及一些仪表盘等等。在这些不同 式样的图表上可以满足目前商业系统的要求。 JFreeChart 是一种基于 JAVA 语言的图表开发 技术。 JFreeChart 可用于 Servlet 、 JSP 、 Applet 、 Java Appication 环境中,通过 JDBC 可动态显示任何数据库数据。
Jfreechart开发手记(一)完整的柱状图-含数据下钻的实现方法
Jfreechart开发手记(一)完整的柱状图-含数据下钻的实现
方法
Jfreechart开发手记(一)
完整的柱状图
(含数据下钻的实现)
作者:Steel.Ma
Mail:****************
****************
MSN:*************************
Blog: /steelma
/iamsteelma
1概述
本笔记阐述的是如何使用开源的Jfreechart框架,制作一个完整的柱状图并实现BI软件中常见的“数据下钻”功能。
先来看看效果图:
以上就是本笔记的范例代码所要实现的,其中,点击每根柱子,还能自动链接到另外一个页面中,并该柱所带的参数传递过去。
以下开始进行环境配置:
2环境准备与基本配置
环境选型:
Tomcat 6.0.18
Jfreechart 1.0.13
MyEclipse
Tomcat、MyEclipse可以忽略,按照默认配置即可,这里介绍下如何配置
Jfreechart的包。
打开MyEclipse,在项目名称上右击,然后选择Build Path->Configure Build Path,将Jfreechart下的lib文件夹中的jcommon-1.0.16.jar与jfreechart-1.0.13.jar引入,注意!其他文件不要引入!切切!
引入后,效果当如下:
最后打开web.xml文件,加入如下这2段xml配制代码:This is the description of my J2EE
component。
通过代码实例跟我学Java 图表技术——开源JFreeChart Web图表组件在J2EE 项目中的应用实例
1.1通过代码实例跟我学Java 图表技术——开源JFreeChart Web图表组件在J2EE 项目中的应用实例1.1.1Web图表技术1、Web图表技术概述在开发应用程序时,经常会遇到必须提供交互式图表的情况。
客户要求应用程序能够用饼图、柱形图或XY散点图的形式直观地描述数据。
(1)B/S与C/S方式下的图表技术的不同WWW的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。
传统的一些以软件包形式发布的应用程序,例如报表系统等,都被逐渐搬到了因特网上。
但是这两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面---B/S下的UI不及C/S 下的丰富。
(2)如何实现Web方式下的图表为了能在web浏览器上显示所需的用户界面,需要使用HTML以及图片的方式来展现数据。
1)传统的一些利用操作系统本身的控件来开发的用户界面就无法适应琳琅满目的客户端需求。
2)为了可以在web浏览器上查看到图表,一般有下面的几种做法。
2、图表技术的基础Java Graphics2D技术。
3、实现Web图表的各种技术可以使用Java Applet或者J2EE JSP/Servlet等程序方式。
4、实现Web图表的各种技术直接在Web服务器端生成好图表图片文件后再发送给浏览器。
5、实现Web图表的各种技术----使用JAVA的图表引擎JFreeChart(1)实现的原理JFreeChart主要用来开发各种各样的图表,并且是目前比较好的Java图表解决方案。
可以产生基于Web的图表。
(2)实现的示例:http://127.0.0.1:8080/NetBook/WebChar/JFreeChartSample.jsp注意:在上面的三种方式中,其中以第三种方式的功能比较强大,但也需要进行复杂的编程实现。
1.1.2开源的图表组件JFreeChart1、开源的图表组件JFreeChart(1)JFreeChart公司的各个产品JFreeChart是JFreeChart公司在开源网站上的一个项目,该公司的主要产品有如下的几种:1)JFreeReport:报表解决工具2)JFreeChart:Java图形解决方案(Application/Applet/Servlet/Jsp)3)JCommon:JFreeReport和JFreeChart的公共类库4)JFreeDesigner:JFreeReport的报表设计工具(2)JFreeChart概述2、JFreeChart所能够产生的主要图形类型JFreeChart主要用来开发各种各样的图表,并且是目前比较好的Java图表解决方案。
java利用JFreeChart实现各种数据统计图(柱形图_饼图_折线图)
各类统计程序实现杨方 531115121 矢量图的生成矢量统计图,即是以矢量图形格式生成、存在和输出的统计图。
这种统计图图形要素丰富、交互编辑简单、存储格式多样,打印输出方便,是GIS应用系统最优先选择的统计图。
最常用的三类矢量统计图是直方图、曲线图、饼图。
矢量统计图的生成,首先要将数据组织为一定的格式,然后进行图形参数的计算和设置,再生成图形,最后进行浏览显示或者保存输出。
当然,如果对生成的图形不满意,可以进行参数修改,然后重新生成,最后再显示或保存。
1.1 数据组织原始数据可以整理为二维表格的形式,通过文件(*.txt,*.xls,*.doc)导入,也可以将数据整理为二维数组的形式输入。
统计图只支持为数值型的数据,包括整型、长整型、浮点型和双精度型等4种数据类型。
1.2 设置参数图形参数可以由用户外部输入,也可以根据数据生成默认参数,分为基本参数、坐标参数、图例参数和数据参数等。
(1)基本参数包括图形类型,图形名称,图形范围,点、线、区参数等。
(2)坐标轴参数包括是否绘制轴线、刻度线、标注、网格线的标志,刻度数,颜色,名称,比例尺,以及是否绘制包围盒或箭头的标志。
(3)图例参数包括是否绘制图例的标志和图例显示位置标志。
(4)数据参数包括数据类型,是否绘制数据表的标志,图形单元的宽度或间隔、图形单元的颜色,系列和类别显示标志等。
1.3 图形生成生成图形的基本步骤如下:(1)确认存在点、线、面工作区。
生成的图形要暂时存入工作区中,然后才能进行显示或保存。
点线面工作区可以由外部输入,也可以在软件中生成。
(2)确认各项图形参数有效。
必须保证每项图形参数都有效,否则软件将出错。
对于没有设置有效值的参数,要重新设置默认参数。
(3)依次生成图形的各个要素:生成坐标轴、生成图形主体、生成数据表、生成图例和生成图形。
在生成统计图的过程中,要随时计算图形的当前范围,以控制后续元素的位置。
1.4 图形显示统计图生成后,保存在MAPGIS的点线面工作区中,可以调用MAPGIS的图形显示视图进行显示。
java利用JFreeChart实现各种数据统计图(柱形图,饼图,折线图)
java利用JFreeChart实现各种数据统计图(柱形图,饼图,折线图)最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了:1. jfreec hart-1.0.13.jar2. jcommo n-1.0.16.jar3. gnujax p.jar先来看一下,最终效果图:主要是jfr eecha rt-1.0.13.jar,但这三个包要齐全,我已经将所有与jfre echar t有关的j ar包与本文实例的工程(代码)一同压缩上传了,有兴趣的同学可以下载,下载地址:http://downlo /detail/pzhtpf/4327700接下来,我们一步步来实现本程序。
一,前期准备工作,也就把这三个第三方包添加进本文工程,添加过程特别简单,前面写过一篇博客,讲的是jav a如何读取Excel表格中的数据(有兴趣的同学可以看一看:/pzhtpf/articl e/detail s/7506135),也要添加第三方包,添加过程一模一样,这里我们在复习一遍:1,建,立java项目,在这个项目在建立一个新的文件夹l i b;2,将上述三个jar包,复制到lib3,然后右键点击这个jav a项目,选择Prop ertie s4,在左侧列表里选中Jav a BuildPath,右侧选中Li brari es5,点击AddJARs6,然后去选择这个项目中lib文件夹中的三个jar,点击确定成功后,项目中会多一个文件夹为:Refere ncedLibrar ies二,实现柱形图的java代码:import java.awt.Font;import org.jfree.chart.ChartF actor y;import org.jfree.chart.ChartP anel;import org.jfree.chart.JFreeC hart;import org.jfree.chart.axis.Catego ryAxi s;import org.jfree.chart.axis.ValueA xis;import org.jfree.chart.plot.Catego ryPlo t;import org.jfree.chart.plot.PlotOr ienta tion;import org.jfree.data.catego ry.Catego ryDat aset;import org.jfree.data.catego ry.Defaul tCate goryD atase t;public classBarCha rt {ChartP anelframe1;public BarCha rt(){Catego ryDat asetdatase t = getDat aSet();JFreeC hartchart= ChartF actor y.create BarCh art3D("水果", // 图表标题"水果种类", // 目录轴的显示标签"数量", // 数值轴的显示标签datase t, // 数据集PlotOr ienta tion.VERTIC AL, // 图表方向:水平、垂直true, // 是否显示图例(对于简单的柱状图必须是false)false, // 是否生成工具false // 是否生成UR L链接);//从这里开始Catego ryPlo t plot=chart.getCat egory Plot();//获取图表区域对象Catego ryAxi s domain Axis=plot.getDom ainAx is(); //水平底部列表domain Axis.setLab elFon t(new Font("黑体",Font.BOLD,14)); //水平底部标题domain Axis.setTic kLabe lFont(new Font("宋体",Font.BOLD,12)); //垂直标题ValueA xis rangeA xis=plot.getRan geAxi s();//获取柱状rangeA xis.setLab elFon t(new Font("黑体",Font.BOLD,15));chart.getLeg end().setIte mFont(new Font("黑体", Font.BOLD, 15));chart.getTit le().setFon t(new Font("宋体",Font.BOLD,20));//设置标题字体//到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题frame1=new ChartP anel(chart,true); //这里也可以用chart Frame,可以直接生成一个独立的Frame}privat e static Catego ryDat asetgetDat aSet() {Defaul tCate goryD atase t datase t = new Defaul tCate goryD atase t();datase t.addVal ue(100, "北京", "苹果");datase t.addVal ue(100, "上海", "苹果");datase t.addVal ue(100, "广州", "苹果");datase t.addVal ue(200, "北京", "梨子");datase t.addVal ue(200, "上海", "梨子");datase t.addVal ue(200, "广州", "梨子"); datase t.addVal ue(300, "北京", "葡萄"); datase t.addVal ue(300, "上海", "葡萄"); datase t.addVal ue(300, "广州", "葡萄"); datase t.addVal ue(400, "北京", "香蕉"); datase t.addVal ue(400, "上海", "香蕉"); datase t.addVal ue(400, "广州", "香蕉"); datase t.addVal ue(500, "北京", "荔枝"); datase t.addVal ue(500, "上海", "荔枝"); datase t.addVal ue(500, "广州", "荔枝"); return datase t;}public ChartP anelgetCha rtPan el(){return frame1;}}效果图如下:但我们把pr ivate static Catego ryDat asetgetDat aSet(){}方法中的数据变化一下后,又会形成另一种效果,比如说我们改成:privat e static Catego ryDat asetgetDat aSet() {Defaul tCate goryD atase t datase t = new Defaul tCate goryD atase t(); datase t.addVal ue(100, "苹果", "苹果");datase t.addVal ue(200, "梨子", "梨子");datase t.addVal ue(300, "葡萄", "葡萄");datase t.addVal ue(400, "香蕉", "香蕉");datase t.addVal ue(500, "荔枝", "荔枝");return datase t;}效果图如下:三,实现饼状图的java代码:packag e com.njue.testJF reeCh art;import java.awt.Font;import java.text.Decima lForm at; import java.text.Number Forma t;import javax.swing.JPanel;import org.jfree.chart.ChartF actor y;import org.jfree.chart.ChartP anel;import org.jfree.chart.JFreeC hart;import org.jfree.chart.labels.Standa rdPie Secti onLab elGen erato r;import org.jfree.chart.plot.PiePlo t;import org.jfree.data.genera l.Defaul tPieD atase t;public classPieCha rt {ChartP anelframe1;public PieCha rt(){Defaul tPieD atase t data = getDat aSet();JFreeC hartchart= ChartF actor y.create PieCh art3D("水果产量",data,true,false,false);//设置百分比PiePlo t pieplo t = (PiePlo t) chart.getPlo t();Decima lForm at df = new Decima lForm at("0.00%");//获得一个De cimal Forma t对象,主要是设置小数问题Number Forma t nf = Number Forma t.getNum berIn stanc e();//获得一个Nu mberF ormat对象Standa rdPie Secti onLab elGen erato r sp1 = newStanda rdPie Secti onLab elGen erato r("{0} {2}", nf, df);//获得Stan dardP ieSec tionL abelG enera tor对象pieplo t.setLab elGen erato r(sp1);//设置饼图显示百分比//没有数据的时候显示的内容pieplo t.setNoD ataMe ssage("无数据显示");pieplo t.setCir cular(false);pieplo t.setLab elGap(0.02D);pieplo t.setIgn oreNu llVal ues(true);//设置不显示空值pieplo t.setIgn oreZe roVal ues(true);//设置不显示负值frame1=new ChartP anel(chart,true);chart.getTit le().setFon t(new Font("宋体",Font.BOLD,20));//设置标题字体PiePlo t piePlo t= (PiePlo t) chart.getPlo t();//获取图表区域对象packag e com.njue.testJF reeCh art;import java.awt.Font;import java.text.Simple DateF ormat;import org.jfree.chart.ChartF actor y; import org.jfree.chart.ChartP anel;import org.jfree.chart.JFreeC hart;import org.jfree.chart.axis.DateAx is; import org.jfree.chart.axis.ValueA xis;import org.jfree.chart.plot.XYPlot;import org.jfree.data.time.Month;import org.jfree.data.time.TimeSe ries;import org.jfree.data.time.TimeSe riesC ollec tion;import org.jfree.data.xy.XYData set;public classTimeSe riesC hart{ChartP anelframe1;public TimeSe riesC hart(){XYData set xydata set = create Datas et();JFreeC hartjfreec hart=ChartF actor y.create TimeS eries Chart("Legal& Genera l单位信托基金价格", "日期", "价格",xydata set, true, true, true);XYPlot xyplot = (XYPlot) jfreec hart.getPlo t();DateAx is dateax is = (DateAx is) xyplot.getDom ainAx is();dateax is.setDat eForm atOve rride(new Simple DateF ormat("MMM-yyyy"));frame1=new ChartP anel(jfreec hart,true);dateax is.setLab elFon t(new Font("黑体",Font.BOLD,14)); //水平底部标题dateax is.setTic kLabe lFont(new Font("宋体",Font.BOLD,12)); //垂直标题 ValueA xis rangeA xis=xyplot.getRan geAxi s();//获取柱状rangeA xis.setLab elFon t(new Font("黑体",Font.BOLD,15));jfreec hart.getLeg end().setIte mFont(new Font("黑体", Font.BOLD, 15)); jfreec hart.getTit le().setFon t(new Font("宋体",Font.BOLD,20));//设置标题字体}privat e static XYData set create Datas et() { //这个数据集有点多,但都不难理解TimeSe riestimese ries= new TimeSe ries("legal& genera l欧洲指数信任",org.jfree.data.time.Month.class);timese ries.add(new Month(2, 2001), 181.80000000000001D);timese ries.add(new Month(3, 2001), 167.30000000000001D);timese ries.add(new Month(4, 2001), 153.80000000000001D);timese ries.add(new Month(5, 2001), 167.59999999999999D);timese ries.add(new Month(6, 2001), 158.80000000000001D);timese ries.add(new Month(7, 2001), 148.30000000000001D);timese ries.add(new Month(8, 2001), 153.90000000000001D);timese ries.add(new Month(9, 2001), 142.69999999999999D);timese ries.add(new Month(10, 2001), 123.2D);timese ries.add(new Month(11, 2001), 131.80000000000001D);timese ries.add(new Month(12, 2001), 139.59999999999999D);timese ries.add(new Month(1, 2002), 142.90000000000001D);timese ries.add(new Month(2, 2002), 138.69999999999999D);timese ries.add(new Month(3, 2002), 137.30000000000001D);timese ries.add(new Month(4, 2002), 143.90000000000001D);timese ries.add(new Month(5, 2002), 139.80000000000001D);timese ries.add(new Month(6, 2002), 137D);timese ries.add(new Month(7, 2002), 132.80000000000001D);TimeSe riestimese ries1 = new TimeSe ries("legal& genera l英国指数信任",org.jfree.data.time.Month.class);timese ries1.add(new Month(2, 2001), 129.59999999999999D);timese ries1.add(new Month(3, 2001), 123.2D);timese ries1.add(new Month(4, 2001), 117.2D);timese ries1.add(new Month(5, 2001), 124.09999999999999D);timese ries1.add(new Month(6, 2001), 122.59999999999999D);timese ries1.add(new Month(7, 2001), 119.2D);timese ries1.add(new Month(8, 2001), 116.5D);timese ries1.add(new Month(9, 2001), 112.7D);timese ries1.add(new Month(10, 2001), 101.5D);timese ries1.add(new Month(11, 2001), 106.09999999999999D);timese ries1.add(new Month(12, 2001), 110.3D);timese ries1.add(new Month(1, 2002), 111.7D);timese ries1.add(new Month(2, 2002), 111D);timese ries1.add(new Month(3, 2002), 109.59999999999999D);timese ries1.add(new Month(4, 2002), 113.2D);timese ries1.add(new Month(5, 2002), 111.59999999999999D);timese ries1.add(new Month(6, 2002), 108.8D);timese ries1.add(new Month(7, 2002), 101.59999999999999D);TimeSe riesC ollec tiontimese riesc ollec tion= newTimeSe riesC ollec tion();timese riesc ollec tion.addSer ies(timese ries);timese riesc ollec tion.addSer ies(timese ries1);return timese riesc ollec tion;}public ChartP anelgetCha rtPan el(){return frame1;}}效果图如下:再来看一下主方法:import java.awt.GridLa yout;import javax.swing.JFrame;public classmainCl ass {public static void main(String args[]){JFrame frame=new JFrame("Java数据统计图");frame.setLay out(new GridLa yout(2,2,10,10));frame.add(new BarCha rt().getCha rtPan el()); //添加柱形图frame.add(new BarCha rt1().getCha rtPan el()); //添加柱形图的另一种效果frame.add(new PieCha rt().getCha rtPan el()); //添加饼状图frame.add(new TimeSe riesC hart().getCha rtPan el()); //添加折线图frame.setBou nds(50, 50, 800, 600);frame.setVis ible(true);}}五,总结以上都是一个简单的例子去实现了,想了解更深的同学可自行查询资料,其实以上代码都通俗易懂,只要结合自己的实际情况,便可开发出属于自己的A pplic ation,大家可以看出我这里是在Appli catio n上实现的,其实更多情况数据统计图在java web上应用更多,大家也可自行了解。
折线图jfreechartJFreeChart折线图总结
折线图jfreechart:JFreeChart折线图总结疯狂代码 / ĵ:http://Java/Article21473.html 我的编程环境是eclipse3.20+Orcal10g,使用的框架是struts1.2,写log使用的是log4j。
首先,我们必须引入开发所使用的包。
网上的介绍都说大部分需要3个包。
jcommon-1.0.14.jar和jfreechart-1.0.11.jar,还有另外一个包,可是我在操作中发现,引入上述3个包,我的tomcat在启动时总会出错,与现有的程序包有冲突。
后来在同事的帮助下,才发现只要上述前两个包就可以了。
将这两个包放入tomcat的lib中,并增加这两个包的环境变量。
修改web.xml,增加相应的servlet。
<servlet><servlet-name>DisplayChart</servlet-name><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class></servlet><!-- Action Servlet Mapping --><servlet-mapping><servlet-name>DisplayChart</servlet-name><url-pattern>/servlet/DisplayChart</url-pattern></servlet-mapping> 接下来,我们便可以编写程序了。
我的需求是在后台处理完数据后,生成时间金额的一个统计图,然后在web页中显示图片。
JFreeChart可以产生不同类型的统计图,如饼图,折线图,曲线图,柱状图等。
它很好的使用了工厂模式,所有这些类型的图都需要相应在工厂ChartFactory中生成出相应的chart对象。
jfreechart_生成折线图,饼图,柱状图,堆栈柱状图
最近公司使用jfreechart来生成统计图,使用了折线图,饼图等,因为用的1.0.8a版的jfreechart,与1.0.0版本的地方有很多不同,而且图片生成清晰度比老版的高,如下是我做的demo.1.所需包(1) jfreechart-1.0.8a.jar(2) jcommon-1.0.12.jar2.运行环境JDK 1.53.源代码import java.awt.Color;import java.awt.Font;import java.io.File;import java.io.FileOutputStream;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.axis.CategoryAxis;import org.jfree.chart.axis.CategoryLabelPositions;import org.jfree.chart.axis.NumberAxis;import org.jfree.chart.axis.V alueAxis;import bels.StandardCategoryItemLabelGenerator;import bels.StandardPieSectionLabelGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PiePlot3D;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.renderer.category.BarRenderer;import org.jfree.chart.renderer.category.LineAndShapeRenderer;import org.jfree.chart.renderer.category.StackedBarRenderer;import org.jfree.chart.title.TextTitle;import org.jfree.data.category.CategoryDataset;import org.jfree.data.general.DatasetUtilities;import org.jfree.data.general.DefaultPieDataset;import org.jfree.data.general.PieDataset;/*** 实际取色的时候一定要16位的,这样比较准确** @author new*/public class CreateChartServiceImpl{private static final String CHART_PA TH = "E:/test/";public static void main(String[] args){// TODO Auto-generated method stubCreateChartServiceImpl pm = new CreateChartServiceImpl();// 生成饼状图pm.makePieChart();// 生成单组柱状图pm.makeBarChart();// 生成多组柱状图pm.makeBarGroupChart();// 生成堆积柱状图pm.makeStackedBarChart();// 生成折线图pm.makeLineAndShapeChart();}/*** 生成折线图*/public void makeLineAndShapeChart(){double[][] data = new double[][]{{ 672, 766, 223, 540, 126 },{ 325, 521, 210, 340, 106 },{ 332, 256, 523, 240, 526 } };String[] rowKeys ={ "苹果", "梨子", "葡萄" };String[] columnKeys ={ "北京", "上海", "广州", "成都", "深圳" };CategoryDataset dataset = getBarData(data, rowKeys, columnKeys); createTimeXYChar("折线图", "x轴", "y轴", dataset, "lineAndShap.png"); }/*** 生成分组的柱状图*/public void makeBarGroupChart(){double[][] data = new double[][]{ 672, 766, 223, 540, 126 },{ 325, 521, 210, 340, 106 },{ 332, 256, 523, 240, 526 } };String[] rowKeys ={ "苹果", "梨子", "葡萄" };String[] columnKeys ={ "北京", "上海", "广州", "成都", "深圳" };CategoryDataset dataset = getBarData(data, rowKeys, columnKeys); createBarChart(dataset, "x坐标", "y坐标", "柱状图", "barGroup.png");}/*** 生成柱状图*/public void makeBarChart(){double[][] data = new double[][]{{ 672, 766, 223, 540, 126 } };String[] rowKeys ={ "苹果" };String[] columnKeys ={ "北京", "上海", "广州", "成都", "深圳" };CategoryDataset dataset = getBarData(data, rowKeys, columnKeys); createBarChart(dataset, "x坐标", "y坐标", "柱状图", "bar.png");}/*** 生成堆栈柱状图*/public void makeStackedBarChart(){double[][] data = new double[][]{{ 0.21, 0.66, 0.23, 0.40, 0.26 },{ 0.25, 0.21, 0.10, 0.40, 0.16 } };String[] rowKeys ={ "苹果", "梨子" };String[] columnKeys ={ "北京", "上海", "广州", "成都", "深圳" };CategoryDataset dataset = getBarData(data, rowKeys, columnKeys); createStackedBarChart(dataset, "x坐标", "y坐标", "柱状图", "stsckedBar.png"); }/*** 生成饼状图*/public void makePieChart(){double[] data ={ 9, 91 };String[] keys ={ "失败率", "成功率" };createV alidityComparePimChar(getDataPieSetByUtil(data, keys), "饼状图", "pie2.png", keys);}// 柱状图,折线图数据集public CategoryDataset getBarData(double[][] data, String[] rowKeys, String[] columnKeys){return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);}// 饼状图数据集public PieDataset getDataPieSetByUtil(double[] data,String[] datadescription){if (data != null && datadescription != null){if (data.length == datadescription.length){DefaultPieDataset dataset = new DefaultPieDataset();for (int i = 0; i < data.length; i++){dataset.setV alue(datadescription[i], data[i]);}return dataset;}}return null;/*** 柱状图**@param dataset 数据集* @param xName x轴的说明(如种类,时间等)* @param yName y轴的说明(如速度,时间等)* @param chartTitle 图标题* @param charName 生成图片的名字* @return*/public String createBarChart(CategoryDataset dataset, String xName,String yName, String chartTitle, String charName){JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题xName, // 目录轴的显示标签yName, // 数值轴的显示标签dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、垂直true, // 是否显示图例(对于简单的柱状图必须是false)false, // 是否生成工具false // 是否生成URL链接);Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);/** V ALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭,* 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看*///chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.V ALUE_TEXT_ANTIALIAS_OFF);chart.setTextAntiAlias(false);chart.setBackgroundPaint(Color.white);// create plotCategoryPlot plot = chart.getCategoryPlot();// 设置横虚线可见plot.setRangeGridlinesVisible(true);// 虚线色彩plot.setRangeGridlinePaint(Color.gray);// 数据轴精度NumberAxis vn = (NumberAxis) plot.getRangeAxis();// vn.setAutoRangeIncludesZero(true);DecimalFormat df = new DecimalFormat("#0.00");vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式// x轴设置CategoryAxis domainAxis = plot.getDomainAxis();domainAxis.setLabelFont(labelFont);// 轴标题domainAxis.setTickLabelFont(labelFont);// 轴数值// Lable(Math.PI/3.0)度倾斜// domainAxis.setCategoryLabelPositions(CategoryLabelPositions// .createUpRotationLabelPositions(Math.PI / 3.0));domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的Lable 是否完整显示// 设置距离图片左端距离domainAxis.setLowerMargin(0.1);// 设置距离图片右端距离domainAxis.setUpperMargin(0.1);// 设置columnKey 是否间隔显示// domainAxis.setSkipCategoryLabelsToFit(true);plot.setDomainAxis(domainAxis);// 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)plot.setBackgroundPaint(new Color(255, 255, 204));// y轴设置V alueAxis rangeAxis = plot.getRangeAxis();rangeAxis.setLabelFont(labelFont);rangeAxis.setTickLabelFont(labelFont);// 设置最高的一个Item 与图片顶端的距离rangeAxis.setUpperMargin(0.15);// 设置最低的一个Item 与图片底端的距离rangeAxis.setLowerMargin(0.15);plot.setRangeAxis(rangeAxis);BarRenderer renderer = new BarRenderer();// 设置柱子宽度renderer.setMaximumBarWidth(0.05);// 设置柱子高度renderer.setMinimumBarLength(0.2);// 设置柱子边框颜色renderer.setBaseOutlinePaint(Color.BLACK);// 设置柱子边框可见renderer.setDrawBarOutline(true);// // 设置柱的颜色renderer.setSeriesPaint(0, new Color(204, 255, 255));renderer.setSeriesPaint(1, new Color(153, 204, 255));renderer.setSeriesPaint(2, new Color(51, 204, 204));// 设置每个地区所包含的平行柱的之间距离renderer.setItemMargin(0.0);// 显示每个柱的数值,并修改该数值的字体属性renderer.setIncludeBaseInRange(true);renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true);plot.setRenderer(renderer);// 设置柱的透明度plot.setForegroundAlpha(1.0f);FileOutputStream fos_jpg = null;try{isChartPathExist(CHART_PA TH);String chartName = CHART_PA TH + charName;fos_jpg = new FileOutputStream(chartName);ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);return chartName;}catch (Exception e){e.printStackTrace();return null;}finally{try{fos_jpg.close();}catch (Exception e){e.printStackTrace();}}/*** 横向图** @param dataset 数据集* @param xName x轴的说明(如种类,时间等)* @param yName y轴的说明(如速度,时间等)* @param chartTitle 图标题* @param charName 生成图片的名字* @return*/public String createHorizontalBarChart(CategoryDataset dataset,String xName, String yName, String chartTitle, String charName){JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题xName, // 目录轴的显示标签yName, // 数值轴的显示标签dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、垂直true, // 是否显示图例(对于简单的柱状图必须是false)false, // 是否生成工具false // 是否生成URL链接);CategoryPlot plot = chart.getCategoryPlot();// 数据轴精度NumberAxis vn = (NumberAxis) plot.getRangeAxis();//设置刻度必须从0开始// vn.setAutoRangeIncludesZero(true);DecimalFormat df = new DecimalFormat("#0.00");vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式CategoryAxis domainAxis = plot.getDomainAxis();domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的// LableFont labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);domainAxis.setLabelFont(labelFont);// 轴标题domainAxis.setTickLabelFont(labelFont);// 轴数值domainAxis.setMaximumCategoryLabelWidthRatio(0.8f);// 横轴上的Lable 是否完整显示// domainAxis.setV erticalCategoryLabels(false);plot.setDomainAxis(domainAxis);V alueAxis rangeAxis = plot.getRangeAxis();// 设置最高的一个Item 与图片顶端的距离rangeAxis.setUpperMargin(0.15);// 设置最低的一个Item 与图片底端的距离rangeAxis.setLowerMargin(0.15);plot.setRangeAxis(rangeAxis);BarRenderer renderer = new BarRenderer();// 设置柱子宽度renderer.setMaximumBarWidth(0.03);// 设置柱子高度renderer.setMinimumBarLength(30);renderer.setBaseOutlinePaint(Color.BLACK);// 设置柱的颜色renderer.setSeriesPaint(0, Color.GREEN);renderer.setSeriesPaint(1, new Color(0, 0, 255));// 设置每个地区所包含的平行柱的之间距离renderer.setItemMargin(0.5);// 显示每个柱的数值,并修改该数值的字体属性renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); // 设置柱的数值可见renderer.setBaseItemLabelsVisible(true);plot.setRenderer(renderer);// 设置柱的透明度plot.setForegroundAlpha(0.6f);FileOutputStream fos_jpg = null;try{isChartPathExist(CHART_PA TH);String chartName = CHART_PA TH + charName;fos_jpg = new FileOutputStream(chartName);ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);return chartName;}catch (Exception e){e.printStackTrace();return null;}finally{try{fos_jpg.close();}catch (Exception e){e.printStackTrace();}}}/*** 饼状图** @param dataset 数据集* @param chartTitle 图标题* @param charName 生成图的名字* @param pieKeys 分饼的名字集* @return*/public String createV alidityComparePimChar(PieDataset dataset,String chartTitle, String charName, String[] pieKeys){JFreeChart chart = ChartFactory.createPieChart3D(chartTitle, // chart// titledataset,// datatrue,// include legendtrue, false);// 使下说明标签字体清晰,去锯齿类似于//chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.V ALUE_TEXT_ANTIALIAS_OFF);的效果chart.setTextAntiAlias(false);// 图片背景色chart.setBackgroundPaint(Color.white);// 设置图标题的字体重新设置titleFont font = new Font("隶书", Font.BOLD, 25);TextTitle title = new TextTitle(chartTitle);title.setFont(font);chart.setTitle(title);PiePlot3D plot = (PiePlot3D) chart.getPlot();// 图片中显示百分比:默认方式// 指定饼图轮廓线的颜色// plot.setBaseSectionOutlinePaint(Color.BLACK);// plot.setBaseSectionPaint(Color.BLACK);// 设置无数据时的信息plot.setNoDataMessage("无对应的数据,请重新查询。
JFreeChart入门 - 使用JFreeChart开发Pie(饼状图)
本文介绍怎么样使用JFreeChart来开发一个Pie图(饼状图)。
测试环境OS:WindowsXPJava:jdk1.5.0_06JFreeChart:1.0.9(2008年3月最新版本)※因为JFreeChart采用Java开发而成,所以在其他系统也能正常运行。
JFreeChart Pie图的开发JFreeChart开发一个饼图非常简单,大致分以下三步:步骤1:创建PieDataset对象(准备数据)步骤2:根据Dataset 生成JFreeChart对象,以及做相应的设置步骤3:将JFreeChart对象输出到文件,Servlet输出流等Java代码:CreateJFreeChartPie.javaview plaincopy to clipboardprint?1.package com.syboos.demo.jfreechart;2.83.public static PieDataset createDataset() {84. DefaultPieDataset defaultpiedataset = new DefaultPieDataset();85. defaultpiedataset.setValue("One", new Double(37.800000000003D));86. defaultpiedataset.setValue("Two", new Double(20.002D));87. defaultpiedataset.setValue("Three", new Double(17.504D));88. defaultpiedataset.setValue("Four", new Double(47D));89.return defaultpiedataset;90. }91.92.}编译与执行执行以下操作:C:\Work\Download\JFreeChart\demos>javac -classpath .;jcommon-1.0.12.jar;jfreechart-1.0.9.jarcom/syboos/demo/jfreechart/CreateJFreeChartPie.javaC:\Work\Download\JFreeChart\demos>java-classpath .;jcommon-1.0.12.jar;jfreechart-1.0.9.jar com.syboos.demo.jfreechart.CreateJFreeChartPie C:\Work\Download\JFreeChart\demos>※参考:C:\Work\Download\JFreeChart\demos文件夹的阶层如下:jcommon-1.0.12.jarjfreechart-1.0.9.jarcom\syboos\demo\jfreechart\CreateJFreeChartPie.java执行后,可以发现生成了C:\jfreechart\pie.png文件===============================================================================一、jFreeChart产生图形的流程创建一个数据源(dataset)来包含将要在图形中显示的数据>>创建一个JFreeChart 对象来代表要显示的图形>>把图形输出重要的类和接口:org.jfree.data.general.Dataset 所有数据源类都要实现的接口org.jfree.chart.ChartFactory 由它来产生JFreeChart 对象org.jfree.chart.JFreeChart 所有对图形的调整都是通过它噢!!org.jfree.chart.plot.Plot 通过JFreeChart 对象获得它,然后再通过它对图形外部部分(例:坐标轴)调整注意:它有很多子类,一般都下嗍造型到它的子类!org.jfree.chart.renderer.AbstractRenderer 通过JFreeChart 对象获得它,然后再通过它对图形内部部分(例:折线的类型)调整。
jFreeChart学习笔记
jFreeChart学习笔记一 JFreeChart生成饼状图实现的思路1、初始化图表数据2、获得图表数据集DefaultPieDataset3、利用chart工厂创建一个jfreechart实例JFreeChart chart = ChartFactory.createPieChart3D(title, // 图表标题dataset, // 图表数据集true, // 是否显示图例false, // 是否生成工具(提示)false // 是否生成URL链接);4、通过T extTitle类设置饼图的标题与字体:void setFont(Font font)标题字体void setPaint(Paint paint)标题字体颜色void setText(String title)标题内容5、通过LegendTitle类设置图例的字体:void setItemFont(Font font)标题字体6、获得饼图实例PiePlot,设置饼图参数:void setLabelFont(Font font)标签字体void setForegroundAlpha(float alpha)指定图片的透明度(0.0-1.0)void setLabelGenerator(PieSectionLabelGenerator generator)分类标签的格式,设置成null则整个标签包括连接结都不显示void setStartAngle(double angle)饼图的初始角度源代码import java.awt.Color;import java.awt.Font;import java.text.DecimalFormat;import java.text.NumberFormat;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartFrame;import org.jfree.chart.JFreeChart;importbels.StandardPieSectionLabelGenerator;import org.jfree.chart.plot.PiePlot;import org.jfree.chart.title.LegendTitle;import org.jfree.chart.title.TextTitle;import org.jfree.data.general.DefaultPieDataset;public class CreatePieChart {/*** 获得数据集。
JFreeChart在项目开发中实现图形报表的应用探讨
Jr C a 是 一 个 Jv 开 源 项 目 ,是 一 款 优 秀 的 Fe hr e t aa Jv 图表 生成 工 具 ,它 不 仅 功 能 全 面 ,提 供 了 在 Jv aa aa A p ctn Sr e 和 JP下 生 成 各 种 图 片 格 式 的 图 pl ao ,e l i i vt S
利 用 Jr C a 可 以生 成 柱 形 图 、 形 图 、 线 图 Fe hr e t 饼 折
FI NANCI AL COM P UTE OF I U R I ANAN :
21年 4 0 第期 o
Q
利 用 Jr C at 件 生 成 动 态统 计 图 表 的基 本 步 Fe h r插 e
骤为 :
1 创建绘图数据集合 ; .
一
、
J re h r配黄 和部 署 Fe C at
2 创 建 Jre hr实 例 ; . FeC a t 3 .自定 义 图 表绘 制 属 性 , 步 可 选 ; 该 4 生 成指 定 格式 的 图片 , 返 回图 片名 称 ; . 并 5 组 织 图片 浏览 路 径 ; .
6 在 页面 上 显示 图片 。 .
( )F eC at 配 置 一 J re h r的
从 Jr C a 的 官方 网站 上 下载 到 该 工 具 , 下 载 Fe hr e t 将 文 件 解 压 缩 后 可 得 到 一 个 名 为 jecat1 . 文 件 f ehr . 5的 r 一 0 夹 ,将 l 子 文 件 夹 内 的文 件 复 制 到 We 用 程 序 目 i r l t a > s l y h r< s r l t n me e v e —n me Dip a C a t / e v e - a >
Jfreechart 图表开发文档
Jfreechart 图表开发文档目标简介:只要按要求写好sql 语句就能生成相应的图表。
实现步骤:1.置图表属性2.写sql 语句3.取图表数据对象4.生成图表5.显示图表详细说明:1.置图表属性图表属性类中定义了图表的属性信息,如,图表标题,图表热链接,是否3D效果显示code:String title = "统计图2";ChartProperty cp = new ChartProperty(title);cp.setChart3D(false);cp.setHitUrl("/servlet/_test");2.写sql 语句sql语句要求:饼型图,柱型图要求sql 语句的select 字段,第一个为String 型,第二个为number 型,曲线图第一个字段要求为日期型,第二个字段为number型,可以有第三个字段,第四个字段…..(n个)这个可生成多曲线图表。
code:1.String sql = "select basepricetype, sum(saleprice)" +" from tb_builsrc_contractinfo" +" where affirm_date >= to_date('2004-06-01', 'yyyy-MM-dd') and" +" affirm_date <= to_date('2004-06-02', 'yyyy-MM-dd')" +" group by basepricetype";2.sql = "select affirm_date, baseprice, saleprice" +" from tb_builsrc_contractinfo" +" where affirm_date >= to_date('2004-06-01 00:00:00', 'yyyy-MM-dd HH24:mi:SS') and " +" affirm_date <= to_date('2004-06-01 23:59:59', 'yyyy-MM-dd HH24:mi:SS')" +" order by affirm_date ";3.取图表数据对象生成不同图表所在生成的jfreechart 数据对象不同,jfreechart提供三个接口,饼型图为,PieDataset,要柱型图为CategoryDataset, 曲线图为XYDataset,同时在交易系统包中提供有DbChartCenter类,静态封装生成不同图表。
JFreeChart生成各种统计图小结
1 柱状图
org.jfree.chart.ChartFactory这个工厂类有createBarChart、createStackedBarChart、
createBarChart3D、createStackedBarChart3D,这几个工厂方法创建不同类型的柱状图,
C)org.jfree.chart.servlet.ServletUtilities有一系列方法,
例如,saveChartAs*;saveChartAs*是把图表按照不同的形式存储为图象;sendTempFile方法被重载了很多次,
用于把文件流发送response。
下面以柱状图和饼图为例,介绍图形创建方法。
象。C)org.jfree.chart.servlet.ServletUtilities有一系列方法,例如,
saveChartAs*;saveChartAs*是把图表按照不同的形式存储为图象;sendTempFile方法被重载了很多次,
用于把文件流发送response。下面以柱状图和饼图为例,介绍图形创建方法。
通过JDBC可动态显示任何数据库数据,结合Itext可以输出至PDF文件。JFreeChart主要是由三个类构成:A)
org.jfree.chart.servlet.ChartDeleter继承自HttpSessionBindingListener,用于实现当Session关闭时,
删除临时目中的图象文件。B)org.jfree.chart.servlet.DisplayChart继承自Httpservlet用于处理显示图
JFreeChart生成各种统计图小结
JFreeChart是一个开源的JAVA项目,它主要用来开发各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用JfreeChart开发图表经验总结(含源码)使用JfreeChart开发图表经验总结(含源码)Keith He 2005年10月27日最近,公司一项目要出很多的图表。
由于项目是B/S架构的,所以生成的图表也要考虑能在浏览器上动态显示。
生成基于浏览器的图表方式比较多。
据我所知道的,常用的有三种:1、VML方式实现。
这种方式是通过产生客户端的代码,由客户端根据代码生成相应的图表。
但这种方式产生的图表有很多的局限性,如受限于浏览器,有些浏览器可能并不支持VML。
另外,没有封装完整的图表开发包。
2、通过applet来产生图表。
这种方式也对客户端要求比较高,必须要有JRE,而且通过applet生成的图表在加载过程中会有个Java的Log动画。
用户看了可能会感觉不太舒服。
3、通过服务端直接生成图表的图片。
这种方式对客户端几乎没有什么要求,缺点是加重了服务端的负担,对服务端要求就相对高了点。
经过比较,根据项目自身特点,我们打算采用第三种方式来开发图表。
为了缩短开发周期、节约成本,我们选用了开源的JFreeChart(/jfreechart/)。
jfreechart是一个免费创建图表的java工具,目前最新版本是JFreeChart-1.0.0-rc1。
它可以生成各式各样的图表。
这些图表包括饼图、柱状图、线形图、区域图、甘特图等等,基本可以满足各种项目的要求。
但在开发过程中我也发现了JFreeChart的一些不足,或者说有些称得上是BUG。
总体说来,JFreeChart还是个优秀的开源项目。
关于JFreeChart生成图表的文章比较多了,我主要谈谈使用JFreeChart的一些比较棘手问题以及解决方法。
同时也会将问题所用到的源码(JFreeChart-1.0.0-rc1+Struts1.2.4)从项目中抽象出来一起提供给大家。
一、图片上热点链接中文乱码的解决方法这个问题是在我查阅关于JFreeChart相关资料时出现频率最高的一个问题。
其实这个乱码问题不能怪罪于JFreeChart。
有人甚至就因此认为JFreeChart对中文支持不太完善,JFreeChart可要叫了:我是冤枉的!我们来找出问题产生的原因,这个问题也就不难解决了。
首先查看一下出现问题页面的Html源文件,你会发现在源文件的开头多出了一段map代码,代码类似于这样:<map id="chart-30928.png"name="chart-30928.png"><area shape="poly" coords="179,163,176,154,174,145"title="洗衣机=315(29.86%)" alt=""/>…………</map><html><head>…………这部分map代码其实是JFreeChart产生的,是用来产生图片上的热点链接,这也是问题产生的根源所在。
你的Jsp页面通过<%@ page contentType="text/html;charset=UTF-8" %>或者<%@ pagecontentType="text/html; charset=GBK" %>来设置contentType这无可厚非,但map并不是由这个jsp页面产生的。
它是JFreeChart通过PrintWriter产生的。
查看一下你生成图片的Chart源码,其中有ChartUtilities.writeImageMap(pw, filename, info, false)这样的语句。
这是用来向页面写入map代码的。
默认情况下,map代码会以服务器默认编码(ISO-8859-1)输出。
这就和你的Jsp编码不一致,从而产生乱码。
原因找到了,问题也就不难解决的。
设置PrintWriter的contentType与Jsp的contentType保存一致就可以了。
代码如下(笔者的Web应用是基于Struts框架的)://PieMothAciton.java public ActionForwardexecute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {//设置输出编码格式response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();…………String filename = chart.generatePieChart3D("月统计比例图",session, out);String graphURL = request.getContextPath()+ "/servlet/DisplayChart?filename=" + filename;request.setAttribute("filename",filename);request.setAttribute("graphURL",graphURL);return mapping.findForward(SUCCESS);}重新部署你的Web应用,中文乱码文件就可以解决了。
二、饼图显示百分比在饼图中JFreeChart默认只显示选项和数值,没有显示各项所占比例。
由于手头没有1.0版的JFreeChart Developer Guide(这可是要钱的,后来想想即使有,也未必能找到关于百分比这方面的说明),再加上DEMO中的饼图都没有显示百分比,无法参考。
后来在网上找到了一个老版本的例子,其中能显示百分比。
它是通过在PiePlot中设置的:PiePlot pie;pie.setPercentFormatString("#,###0.0#%");但1.0版本中根本就找不到setPercentFormatString这方法,JFreeChart各版本之间改动比较大,很难兼容。
还好它是开源的,把它的源码都搜索了一遍,认真读了一些源码,终于理出了头绪。
原来在1.0.0-rc1版中显示百分比已经调整到StandardPieItemLabelGenerator构造函数中了,StandardPieItemLabelGenerator有三个构造函数。
StandardPieItemLabelGenerator()不显示各项所占比例。
另外两个可以显示比例。
代码如下:plot.setLabelGenerator(new StandardPieItemLabelGenerator(StandardPieItemLabelG enerator.DEFAULT_TOOLTIP_FORMAT));//或者采用下面自定义样式显示,{0}表示选项,{1}表示数值,{2}表示所占比例plot.setLegendLabelGenerator(new StandardPieItemLabelGenerator("{0}: ({1}M, {2})"));效果如下图:默认显示百分比是取整的,如果要让百分比保留二位小数,可以用第三个构造函数:plot.setLabelGenerator(new StandardPieItemLabelGenerator(“{0}={1}({2})R 21;,NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));效果如下图:三、混合图表(不同类型的图混合显示)我们经常用的是柱状图、曲线图、和饼图,这三类型图基本能满足大部分项目的需求。
但有些项目比较特殊,可能需要在一张图上同时显示不同类型的图。
这在JFreeChart中可以轻松实现。
例如我们要做个流量监控的系统,该系统一天中在不同的时间段有不同的阀值(最大值),该阀值表示成阶梯线。
而实际流量就是个曲线了。
当流量在某个时段内超过阀值时就触发相应的事件(如限流)。
要表示阀值和流量的对比关系就需要两种类型的图片在同一张图表上表示,如下图:首先像创建普通图表一样来创建图片,笔者先创建了一个XYStep Chart。
然后创建第二图表的Renderer,再分别将第二图表的Dataset、Renderer添加进第一图表的plot。
实例代码如下://MultipleChart.javaJFreeChart jfreechart = ChartFactory.createXYStepAreaChart("监控设置","时刻","流量",xydataset,PlotOrientation.VERTICAL,true,true,false);XYPlot xyplot =jfreechart.getXYPlot();…………//设置第二图表的RendererStandardXYItemRenderer standardxyitemrenderer = new StandardXYItemRenderer();standardxyitemrenderer.setToolTipGenerator(new StandardXYToolTipGenerator("{0}({1}) = {2}",new SimpleDateFormat("HH:mm"),new DecimalFormat("#,##0")));//将第二图表的Dataset、Renderer添加进xyplotxyplot.setDataset(1, lineDataset);xyplot.setRenderer(1,standardxyitemrenderer); 这样就创建了曲线和阶梯的混合图表。