JFreeChart是一个开源的JAVA项目,它主要用来开发各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。在这些不同式样的图表上可以满足目前商业系统的要求。JFreeChart是一种基于JAVA语言的图表开发技术。JFreeChart可用于Servlet、JSP、Applet、Java Appication环境中,通过JDBC可动态显示任何数据库数据,结合Itext可以输出至PDF文件。
JFreeChart主要是由三个类构成:
A)org.jfree.chart.servlet.ChartDeleter继承自HttpSessionBindingListener,用于实现当Session 关闭时,删除临时目中的图象文件。
B)org.jfree.chart.servlet.DisplayChart继承自Httpservlet 用于处理显示图象。
C)org.jfree.chart.servlet.ServletUtilities有一系列方法,例如,saveChartAs*;saveChartAs*是把图表按照不同的形式存储为图象;sendTempFile方法被重载了很多次,用于把文件流发送response。
下面以柱状图和饼图为例,介绍图形创建方法。
1 柱状图
org.jfree.chart.ChartFactory这个工厂类有createBarChart、createStackedBarChart、createBarChart3D、createStackedBarChart3D,这几个工厂方法创建不同类型的柱状图,比较重要的是 PlotOrientation.VERTICAL 让平行柱垂直显示,而 PlotOrientation.HORIZONTAL 则让平行柱水平显示。对柱状图影响较大的几个类包括:org.jfree.chart.axis.CategoryAxis、org.jfree.chart.axis.ValueAxis、org.jfree.chart.renderer.BarRenderer、org.jfree.chart.renderer. BarRenderer3D。
具体实现步骤:
1)创建用于图形生成所要的数据集对象。
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
其中:rowKeys表示X轴数据,columnKeys表示Y轴数据,data表示填充柱状图所要的实际数据(来自于数据库)。
2)创建图形对象。
JFreeChart chart = ChartFactory.createBarChart3D("标题",null,null,dataset,PlotOrientation.VERTICAL,,true,false,false);
createBarChart3D方法是ChartFactory工厂类里的一个方法,用于3D柱状图的生成,该类继承自JFreeChart。其中的八个参数分别代表:图形的标题、X轴标题、Y轴标题、dataset就是CategoryDataset类的实例对象、显示标题、启用热键、启用超键接。
3)设置图形显示的属性。
a ) ValueAxis类,设置柱到图上下边的距离。实现方法是:
ValueAxis rangeAxis = plot.getRangeAxis();
设置最高的一个柱与图片顶端的距离:
rangeAxis.setUpperMargin(0.15)
设置最低的一个柱与图片底端的距离:
rangeAxis.setLowerMargin(0.15)
b)org.jfree.chart.renderer.BarRenderer3D类,设置图形上显示的数值。实现方法如下:
BarRenderer3D renderer = new BarRenderer3D();
renderer.setBaseOutlinePaint(Color.BLACK);
设置 Wall 的颜色:
renderer.setWallPaint(Color.gray);
设置每个柱的颜色:
renderer.setSeriesPaint(0, new Color(0, 0, 255));
renderer.setSeriesPaint(1, new Color(0, 100, 255));
renderer.setSeriesPaint(2, Color.GREEN);
设置每个柱的 Outline 颜色
renderer.setSeriesOutlinePaint(0, Color.BLACK);
renderer.setSeriesOutlinePaint(1, Color.BLACK);
renderer.setSeriesOutlinePaint(2, Color.BLACK);
设置每个地区所包含的平行柱之间的距离
renderer.setItemMargin(0.1);
显示每个柱的数值,并修改该数值的字体属性
renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));
renderer.setItemLabelsVisible(true);
为图形加入超连接
renderer.setItemURLGenerator(new StandardCategoryURLGenerator());
renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
2 饼图
org.jfree.chart.plot包,包含创建饼形图的所有方法和属性。
笔者根据业务需求创建了setURLGenerator(PieURLGenerator generator)方法,在图片上建立连接,就是图片不同部分连接不同的资源。
setSectionLabelType(int type)方法:
指定 section 标签的类型,共有 7 种类型。如果不指定,默认是 NAME_LABELS,其中类型分别是:
PiePlot.NO_LABELS
PiePlot.NAME_LABELS
PiePlot.VALUE_LABELS
PiePlot.PERCENT_LABELS 、PiePlot.NAME_AND_VALUE_LABELS、PiePlot. NAME_AND_PERCENT_LABELS、PiePlot.VALUE_AND_PERCENT_LABELS。
setDefaultOutlinePaint(java.awt.Paint paint)方法,指定 section 轮廓线的颜色,如果不指定,默认值为NULL。
setDefaultOutlineStroke(java.awt.Stroke stroke)方法,指定 section 轮廓线的厚度。
setRadius(double percent) 和 setExplodePercent(int section, double percent)方法,抽离 section,就是把某一section从饼形图剥离出来,需要两个方法一起使用。
setStartAngle(double angle)方法,设置第一个section开始位置,默认从12点钟方向开始。
setPaint(int section, java.awt.Paint paint)方法指定section的颜色。
setDirection(int direction)方法指定section顺序,默认是顺时针方向。顺时针:PiePlot.CLOCKWISE;逆时针:PiePlot.ANTICLOCKWISE。
具体实现步骤:
1)创建用于图形生成所要的数据集对象。
首先实例化类DefaultPieDataset dataset = new DefaultPieDataset()。然后利用DefaultPieDataset类提供的setValue(value1,value2)方法,把从数据库里提取的数据存入DefaultPieDataset对象。其中value1是数据名称、value2是数据值。
2)创建图形对象。
首先实例化JFreeChart chart = ChartFactory.createPieChart3D(title, dataset, true, true, false)createPieChart3D方法是用于饼图生成的主要方法。其中title代表图形的标题、dataset就是DefaultPieDataset对象的实例。
3)设置图形显示的属性。
String filename = ServletUtilities.saveChartAsPNG(jFreeChart, 700, 450, info, session);
ChartUtilities.writeImageMap(pw, filename, info);
pw.flush()
saveChartAsPNG方法在ServletUtilities工厂类定义完成。主要用于把图形对象JFreeChart以图片的形式保存。其中的jFreeChart就是JFreeChart对象的实例。该方法返回一个文件名。
writeImageMap(pw, filename, info)方法用于把保存的图片文件以字节流的形式写入用户界面。
其中pw是java.io包的PrintWriter类的实例对象,该对象创建一个图形输出流。Filename是输出图片的文件名。该文件名来自ServletUtilities.saveChartAsPNG方法创建。
参数info用于图形信息的显示。
用ChartRenderingInfo info=new ChartRenderingInfo(new StandardEntityCollection())创建。
最后输出完成图形,调用pw.flush()方法关闭IO流。
------------------------------------------------------------------------------------------
限于篇幅的问题我们在这里只实现两种常用的图表,其他类型图表读者可以触类旁通。我们先给出柱状图的实现,饼图的实现再来跟柱状图进行比较。
package lius.chart.demo;
import java.io.*;
import org.jfree.data.*; import org.jfree.chart.*; import org.jfree.chart.plot.*; /** * 该类用于演示最简单的柱状图生成 * @author Winter Lau */ public class BarChartDemo {
public static void main(String[] args) throws IOException{
CategoryDataset dataset = getDataSet2(); JFreeChart chart = ChartFactory.createBarChart3D( "水果产量图", // 图表标题 "水果", // 目录轴的显示标签 "产量", // 数值轴的显示标签 dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方向:水平、垂直 true, // 是否显示图例(对于简单的柱状图必须是false) false, // 是否生成工具 false // 是否生成URL链接 );
FileOutputStream fos_jpg = null; try { fos_jpg = new FileOutputStream("D:\\fruit.jpg"); ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); } finally { try { fos_jpg.close(); } catch (Exception e) {} } } /** * 获取一个演示用的简单数据集对象 * @return */ private static CategoryDataset getDataSet() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100, null, "苹果"); dataset.addValue(200, null, "梨子"); dataset.addValue(300, null, "葡萄"); dataset.addValue(400, null, "香蕉"); dataset.addValue(500, null, "荔枝"); return dataset; } /** * 获取一个演示用的组合数据集对象 * @return */ private static CategoryDataset getDataSet2() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100, "北京", "苹果"); dataset.addValue(100, "上海", "苹果"); dataset.addValue(100, "广州", "苹果"); dataset.addValue(200, "北京", "梨子"); dataset.addValue(200, "上海", "梨子"); dataset.addValue(200, "广州", "梨子"); dataset.addValue(300, "北京", "葡萄"); dataset.addValue(300, "上海", "葡萄"); dataset.addValue(300, "广州", "葡萄"); dataset.addValue(400, "北京", "香蕉"); dataset.addValue(400, "上海", "香蕉"); dataset.addValue(400, "广州", "香蕉"); dataset.addValue(500, "北京", "荔枝"); dataset.addValue(500, "上海", "荔枝"); dataset.addValue(500, "广州", "荔枝"); return dataset; } }
|
程序运行结束后生成的图片文件效果如下图所示:
图4如果是使用简单的数据即使用getDataSet方法获取数据集时产生的图片文件如下:
图5
对于饼图而言,数据集的获取用的不是同一个数据集类,另外饼图不支持同一个类别的项目中还有子项目这样的数据。我们只给出创建饼图的代码,至于写图表到一个文件则与柱状图一致,无需重复。
package lius.chart.demo;
import java.io.*;
import org.jfree.data.*; import org.jfree.chart.*; /** * 用于演示饼图的生成 * @author Winter Lau */ public class PieChartDemo {
public static void main(String[] args) throws IOException{ DefaultPieDataset data = getDataSet(); JFreeChart chart = ChartFactory.createPie3DChart("水果产量图", // 图表标题 data, true, // 是否显示图例 false, false ); //写图表对象到文件,参照柱状图生成源码 } /** * 获取一个演示用的简单数据集对象 * @return */ private static DefaultPieDataset getDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("苹果",100); dataset.setValue("梨子",200); dataset.setValue("葡萄",300); dataset.setValue("香蕉",400); dataset.setValue("荔枝",500); return dataset; } }
|
生成的饼图文件效果如下:
图6
为了将生成的图表直接传给客户端浏览器,只需要将前面两个例子中的文件流换成是通过HttpServletResponse对象获取到的输出流,详细代码清单如下:
package lius.chart.demo;
import java.io.IOException; import javax.servlet.*; import javax.servlet.http.HttpServlet;
import org.jfree.data.*; import org.jfree.chart.*; /** * 演示通过servlet直接输出图表 * @author Winter Lau */ public class ChartDemoServlet extends HttpServlet {
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContentType("image/jpeg"); DefaultPieDataset data = getDataSet(); JFreeChart chart = ChartFactory.createPie3DChart("水果产量图", data, true, false, false );
ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 100,chart,400,300,null); } /** * 获取一个演示用的简单数据集对象 * @return */ private static DefaultPieDataset getDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("苹果",100); dataset.setValue("梨子",200); dataset.setValue("葡萄",300); dataset.setValue("香蕉",400); dataset.setValue("荔枝",500); return dataset; } }
|
很多情况我们不仅仅要求可以在浏览器上显示一个图表,我们更需要客户可以直接在图表上做一下交互的操作,例如获取信息提示,点击图表某个部分进行更详细信 息的展示等等。例如前面生成的简单柱状图,用户需要在看到柱状图后点击某种水果例如是苹果即可看到各个地区苹果产量的情况。为此就要求该图形具有交互操作 的功能。在HTML中为了让一个图像具有可交互的功能就必须给该图像定义一个Map对象。下表节选一段具有该功能的HTML代码
<MAP NAME="chartMap"> <AREA SHAPE="RECT" COORDS="81,15,126,254" href="?series=0&category=100" title="100 = 7,048" onclick="javascript:clickChart('100');return false;"> <AREA SHAPE="RECT" COORDS="143,27,188,255" href="?series=0&category=200" title="200 = 6,721" onclick="javascript: clickChart ('200');return false;"> <AREA SHAPE="RECT" COORDS="205,54,250,255" href="?series=0&category=300" title="300 = 5,929" onclick="javascript: clickChart ('300');return false;"> <AREA SHAPE="RECT" COORDS="267,85,312,255" href="?series=0&category=400" title="400 = 5,005" onclick="javascript: clickChart ('400');return false;"> <AREA SHAPE="RECT" COORDS="329,17,374,255" href="?series=0&category=Diet" title="Diet = 7,017" onclick="javascript: clickChart ('Diet');return false;"> </MAP>
|
由此就产生了一个问题:如果 根据一个图像来生成对应的MAP对象。我们回头看看刚才的代码,在创建一个图表对象时候有两个参数,我们举柱状图的例子来讲这两个参数就是 ChartFactory. createBarChart3D方法中的最后两个参数,这两个参数的类型都是布尔值。这两个参数意思分别是:是否创建工具提示(tooltip)以及是 否生成URL。这两个参数分别对应着MAP中一个AREA的title属性以及href属性。
可是我想知道的是怎么来产生这个MAP啊!哈哈,不要着急,JFreeChart已经帮我们做好生成MAP对象的功 能。为了生成MAP对象就要引入另外一个对象:ChartRenderingInfo。因为JFreeChart没有直接的方法利用一个图表对象直接生成 MAP数据,它需要一个中间对象来过渡,这个对象就是ChartRenderingInfo。下图是生成MAP数据的流程图:
图7如 上图所示,ChartUtilities类是整个流程的核心,它周围的对象都是一些例如数据对象或者是文件等。这个流程简单描述如下:首先创建一个 ChartRenderingInfo对象并在调用ChartUtilities的writeChartAsJPEG时作为最后一个参数传递进去。调用该 方法结束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象,有了这个对象我们还是没有办法获取具体的MAP数 据,我们还必须借助于ChartUtilities的writeImageMap方法来将ChartRenderingInfo对象读取出来,获取MAP 数据的代码片断如下:
PrintWriter w = null; FileOutputStream fos_jpg = null; FileOutputStream fos_cri = null; try{ //根据不同类型的图表使用不同类,以下是针对饼图的操作 PiePlot plot = (PiePlot) chart.getPlot(); plot.setURLGenerator(new StandardPieURLGenerator(url)); //设置工具提示 plot.setToolTipGenerator(new StandardPieToolTipGenerator()); fos_jpg = new FileOutputStream(“d:\\fruit.jpg”); ChartUtilities.writeChartAsJPEG( fos_jpg, 100, chart, 400, 300, info); fos_cri = new FileOutputStream(__d:\\fruit.map__); w = new PrintWriter(fos_cri); ChartUtilities.writeImageMap(w, __mapname__, info); w.flush(); }finally{ try{ w.close(); }catch(Exception e){} try{ fos_cri.close(); }catch(Exception e){} try{ fos_jpg.close(); }catch(Exception e){} }
|
打开文件D:\ fruit.map,文件的内容就是要写到页面上的MAP数据。把生成的图像文件以及MAP数据文件写到页面上即可完成热点图表的功能。至于怎么结合两者 之间的关系例如图像的useMap属性值必须与MAP对象的名称结合起来,必须根据实际的应用情况进行相应的处理。笔者建议把二者通过标签库封装起来,图 像文件的名称以及MAP对象的名称由标签库统一进行控制,这样可以保证二者的一致性。
分享到:
相关推荐
**JFreeChart:一个强大的Java图表库** JFreeChart是一个广泛使用的开源Java库,它提供了丰富的图表类型,如折线图、饼图、柱状图和堆栈柱状图等,用于数据可视化。这个库非常适合那些希望在Java应用程序中集成高...
### JFreeChart在JavaWeb项目中的应用 #### 一、引言 随着互联网技术的发展,Web应用程序中的数据展示越来越依赖于图表技术。传统的表格展示方式虽然直观,但在数据分析上不如图表来得直接和高效。因此,为了更好...
综上所述,结合Applet和JFreeChart实现曲线走势图是一项涉及Web客户端编程、数据可视化和Java图形处理的综合任务。尽管Applet已逐渐被淘汰,但学习这个过程对于理解早期Web技术以及图形库的使用仍然有其价值。
【标题】"MyBatis高级查询+JFreeChart热点"是一个综合的学习项目,它涵盖了数据库操作和数据可视化两个重要领域。MyBatis是Java开发中常用的一个持久层框架,而JFreeChart则是一个用于创建高质量图表的库。下面将...
在本文中,我们将深入探讨如何使用S2SH(Struts2、Spring、Hibernate)框架,结合JFreeChart库和Ajax技术,动态生成...在实际应用中,可以根据需求调整图表类型、样式以及数据来源,以满足各种复杂的数据可视化需求。
### 解决JFreeChart中文乱码方案整理 #### 背景介绍 在使用JFreeChart绘制图表时,中文字符的显示常常会出现...通过这些综合手段的应用,可以在很大程度上解决JFreeChart中的中文乱码问题,提高图表的可用性和美观性。
在实际项目中,JFreeChart可以与其他Java框架集成,比如Swing或JavaFX,用于创建桌面应用的图形界面;也可以配合Servlet或JSP在Web应用中生成动态图表,通常会与ChartUtilities类结合,将图表保存为图片文件并返回给...
通过上述技术的综合运用,这个广告管理系统具备了高效的数据处理能力、友好的用户界面以及丰富的数据分析功能。系统中的十几张表涵盖了广告主、广告位、广告订单、投放效果等多个方面,充分体现了其实战价值。这样的...
### JFreeChart 图表制作技术研究及应用 #### 一、统计及统计图表的重要性 统计是一种重要的数据分析手段,通过对数据的搜集、汇总和计算来揭示事物的状态和发展趋势。统计信息通常具备两大特点:数量性和综合性。...
安装完成后,可以通过运行演示应用程序来快速了解JFreeChart的功能。 **3.5 配置JFreeChart以供IDE使用** 对于使用集成开发环境(IDE)的开发者来说,这部分提供了如何配置IDE以便使用JFreeChart的信息。 **3.6 ...
这是一个基于Java技术栈的投票系统...总的来说,这个投票系统展示了Java企业级开发中常用的技术组合,包括前端MVC框架、ORM工具、应用管理框架以及数据库管理和图表库的综合运用,为开发者提供了一个完整的参考示例。
JFreeChart类则从Plot构建出完整的图表,而ChartPanel则进一步将其融入Swing界面,便于在Java应用中展示。 #### 二、JFreeChart的获取与资源 JFreeChart是JFree公司在开源平台SourceForge.net上维护的一个项目,与...
综上所述,"flex+jfreechart+others"的整合是一项涉及前端交互、后端数据处理、通信协议、图表定制等多个领域的综合性工作,需要开发者具备多方面技能。通过这样的整合,可以打造出既美观又功能强大的数据可视化应用...
- 安装完成后,可以通过运行示例应用程序快速了解 JFreeChart 的基本用法。 - **编译源码** - 对于希望深入了解 JFreeChart 实现原理的开发者,可以编译源代码进行学习。 - **生成 Javadoc 文档** - 使用 Javadoc...
Java图表库JFreeChart是Java开发中用于创建各种复杂图表的开源工具,广泛应用于数据分析、报表生成、可视化应用等场景。这个库支持多种图表类型,包括柱状图、饼图、线形图、散点图、面积图、甘特图以及复杂的组合...
综合运用这些组件,开发者可以构建一个功能完善的Web应用,实现用户文件上传下载、邮件发送、报表生成等功能。例如,用户上传的文件可以通过jspSmartUpload组件处理,然后利用JavaMail发送邮件附带文件;同时,可以...
- 组合图表将不同类型的数据结合到一个图表中,便于进行综合分析。 - 可以在同一个图表上叠加不同类型的图表,如折线图和柱状图。 **2.13 未来发展** - JFreeChart团队正在持续开发新的功能和图表类型。 - 用户可以...
Struts2、Hibernate、Spring 和 JFreeChart 是Java开发中常用的四大框架和技术,它们在企业级应用开发中扮演着重要角色。这个压缩包文件“struts2+hibernate+spring+jfreechart+导出excel+导出pdf完美整合.zip”显然...
"JFreeChart的介绍及API说明_经云_新浪博客.files"和"JFreechart综合 - Powered by Sablog-X.files"这两个文件夹可能包含图片、样式表或者其他支持上述HTML页面的资源。 学习JFreeChart时,通常会从以下几个方面...
5. **报表与可视化**:系统应能生成各类统计报告,如班级平均分、个人排名等,并以图表形式展示,可能涉及JFreeChart或Echarts等图表库。 6. **通知与消息**:系统需要有通知公告发布和用户消息推送功能,可能利用...