??xml version="1.0" encoding="utf-8" standalone="yes"?>
JFreeChart是一个开源的JAVA目Q它主要用来开发各U各L图表Q这些图表包括:饼图、柱状图(普通柱状图以及堆栈q?/span>)、线图、区域图、分布图、合图、甘特图以及一些A表盘{等。在q些不同式样的图表上可以满目前商业pȝ的要求?/span>JFreeChart是一U基?/span>JAVA语言的图表开发技术?/span>JFreeChart可用?/span>Servlet?/span>JSP?/span>Applet?/span>Java Appication环境中,通过JDBC可动态显CZQ何数据库数据Q结?/span>Itext可以输出?/span>PDF文g?/span>
JFreeChart主要是由三个cL成: AQ?/span>org.jfree.chart.servlet.ChartDeleterl承?/span>HttpSessionBindingListenerQ用于实现当Session 关闭Ӟ删除临时目中的图象文件?/span> BQ?/span>org.jfree.chart.servlet.DisplayChartl承?/span>Httpservlet 用于处理昄图象?/span> CQ?/span>org.jfree.chart.servlet.ServletUtilities有一pdҎQ例如,saveChartAs*;saveChartAs*是把图表按照不同的Ş式存储ؓ图象Q?/span>sendTempFileҎ被重载了很多ơ,用于把文件流发?/span>response?/span> 下面以柱状图和饼图ؓ例,介绍囑Ş创徏Ҏ?/span> 1 q? org.jfree.chart.ChartFactoryq个工厂cLcreateBarChart?/span>createStackedBarChart?/span>createBarChart3D?/span>createStackedBarChart3DQ这几个工厂Ҏ创徏不同cd的柱状图Q比较重要的?/span> PlotOrientation.VERTICAL 让^行柱垂直昄Q?/span> PlotOrientation.HORIZONTAL 则让q柱水qxC。对q囑֪响较大的几个cd括:org.jfree.chart.axis.CategoryAxis?/span>org.jfree.chart.axis.ValueAxis?/span>org.jfree.chart.renderer.BarRenderer?/span>org.jfree.chart.renderer. BarRenderer3D?/span> 具体实现步骤Q?/span> 1Q创建用于图形生成所要的数据集对象?/span> CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data)Q?/span> 其中Q?/span>rowKeys表示X轴数据,columnKeys表示Y轴数据,data表示填充q图所要的实际数据Q来自于数据库)?/span> 2Q创建图形对象?/span> JFreeChart chart = ChartFactory.createBarChart3D("标题", nullQ?/span>nullQ?/span>datasetQ?/span>PlotOrientation.VERTICAL,Q?/span>trueQ?/span>falseQ?/span>false)Q?/span> createBarChart3DҎ?/span>ChartFactory工厂c里的一个方法,用于3Dq囄生成Q该cȝ承自JFreeChart。其中的八个参数分别代表Q图形的标题?/span>X轴标题?/span>Y轴标题?/span>dataset是CategoryDatasetcȝ实例对象、显C标题、启用热键、启用超键接?/span> 3Q设|图形显C的属性?/span> a ) ValueAxisc,讄柱到图上下边的距R实现方法是Q?/span> ValueAxis rangeAxis = plot.getRangeAxis(); 讄最高的一个柱与图片顶端的距离Q?/span> rangeAxis.setUpperMargin(0.15) 讄最低的一个柱与图片底端的距离Q?/span> rangeAxis.setLowerMargin(0.15) bQ?/span>org.jfree.chart.renderer.BarRenderer3Dc,讄囑Ş上显C的数倹{实现方法如下: BarRenderer3D renderer = new BarRenderer3D(); renderer.setBaseOutlinePaint(Color.BLACK); 讄 Wall 的颜Ԍ renderer.setWallPaint(Color.gray); 讄每个q颜色Q?/span> renderer.setSeriesPaint(0, new Color(0, 0, 255)); renderer.setSeriesPaint(1, new Color(0, 100, 255)); renderer.setSeriesPaint(2, Color.GREEN); 讄每个q Outline 颜色 renderer.setSeriesOutlinePaint(1, Color.BLACK); renderer.setSeriesOutlinePaint(2, Color.BLACK); 讄每个地区所包含的^行柱之间的距?/span> 昄每个q数|q修改该数值的字体属?/span> renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12)); renderer.setItemLabelsVisible(true); 为图形加入超q接 renderer.setItemURLGenerator(new StandardCategoryURLGenerator()); renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator()); 2 饼图 org.jfree.chart.plot包,包含创徏饼Ş囄所有方法和属性?/span> W者根据业务需求创ZsetURLGenerator(PieURLGenerator generator)ҎQ在囄上徏立连接,是囄不同部分q接不同的资源?/span> setSectionLabelType(int type)ҎQ?/span> 指定 section 标签的类型,共有 7 U类型。如果不指定Q默认是 NAME_LABELSQ其中类型分别是Q?/span> PiePlot.NO_LABELS PiePlot.NAME_LABELS PiePlot.VALUE_LABELS PiePlot.PERCENT_LABELS ?/span>PiePlot.NAME_AND_VALUE_LABELS?/span>PiePlot. NAME_AND_PERCENT_LABELS?/span>PiePlot.VALUE_AND_PERCENT_LABELS?/span> setDefaultOutlinePaint(java.awt.Paint paint)ҎQ指?/span> section 轮廓U的颜色Q如果不指定Q默认gؓNULL?/span> setDefaultOutlineStroke(java.awt.Stroke stroke)ҎQ指?/span> section 轮廓U的厚度?/span> setRadius(double percent) ?/span> setExplodePercent(int section, double percent)ҎQ抽?/span> sectionQ就是把某一section从饼形图剥离出来Q需要两个方法一起用?/span> setStartAngle(double angle)ҎQ设|第一?/span>section开始位|,默认?/span>12炚w方向开始?/span> setPaint(int section, java.awt.Paint paint)Ҏ指定section的颜艌Ӏ?/span> setDirection(int direction)Ҏ指定section序Q默认是时针方向。顺旉Q?/span>PiePlot.CLOCKWISEQ逆时针:PiePlot.ANTICLOCKWISE?/span> 具体实现步骤Q?/span> 1Q创建用于图形生成所要的数据集对象?/span> 首先实例化类DefaultPieDataset dataset = new DefaultPieDataset()。然后利?/span>DefaultPieDatasetcL供的setValueQ?/span>value1,value2Q方法,把从数据库里提取的数据存?/span>DefaultPieDataset对象。其?/span>value1是数据名U?/span>value2是数据倹{?/span> 2Q创建图形对象?/span> 首先实例?span style="color: black; font-family: 宋体">JFreeChart chart = ChartFactory.createPieChart3D(title, dataset, true, true, false)createPieChart3DҎ是用于饼囄成的主要Ҏ。其?span style="color: black; font-family: 宋体">title
renderer.setSeriesOutlinePaint(0, Color.BLACK);
renderer.setItemMargin(0.1);
3Q设|图形显C的属性?/span>
String filename = ServletUtilities.saveChartAsPNG(jFreeChart, 700, 450, info, session);
ChartUtilities.writeImageMap(pw, filename, info);
pw.flush()
saveChartAsPNGҎ?/span>ServletUtilities工厂cd义完成。主要用于把囑Ş对象JFreeChart以图片的形式保存。其中的jFreeChart是JFreeChart对象的实例。该Ҏq回一个文件名?/span>
writeImageMapQ?/span>pw, filename, infoQ方法用于把保存的图片文件以字节的形式写入用户界面?/span>
其中pw?/span>java.io包的PrintWritercȝ实例对象Q该对象创徏一个图形输出流?/span>Filename是输出图片的文g名。该文g名来?/span>ServletUtilities.saveChartAsPNGҎ创徏?/span>
参数info用于囑Ş信息的显C?/span>
?span style="color: black; font-family: 宋体">ChartRenderingInfo info=new ChartRenderingInfo(new StandardEntityCollection())创徏?/span>
最后输出完成图形,调用pw.flush()Ҏ关闭IO?br />限于幅的问题我们在q里只实CU常用的图表Q其他类型图表读者可以触cL通。我们先l出q囄实现Q饼囄实现再来跟柱状图q行比较?
|
E序q行l束后生成的囄文g效果如下图所C:
如果是用简单的数据即用getDataSetҎ获取数据集时产生的图片文件如下:
对于饼图而言Q数据集的获取用的不是同一个数据集c,另外饼图不支持同一个类别的目中还有子目q样的数据。我们只l出创徏饼图的代码,至于写图表到一个文件则与柱状图一_无需重复?
|
生成的饼图文件效果如下:
![]() ![]() |
![]()
|
Z生成的图表直接传给客户端浏览器Q只需要将前面两个例子中的文g换成是通过HttpServletResponse对象获取到的输出,详细代码清单如下Q?
|
很多情况我们不仅仅要求可以在览器上昄一个图表,我们更需要客户可以直接在图表上做一下交互的操作Q例如获取信息提C,点击图表某个部分q行更详l信 息的展示{等。例如前面生成的单柱状图Q用户需要在看到q囑点击某种水果例如是苹果即可看到各个地果量的情况。ؓ此就要求该图形具有交互操?的功能。在HTML中ؓ了让一个图像具有可交互的功能就必须l该囑փ定义一个Map对象。下表节选一D具有该功能的HTML代码
|
由此׃生了一个问题:如果 Ҏ一个图像来生成对应的MAP对象。我们回头看看刚才的代码Q在创徏一个图表对象时候有两个参数Q我们Dq囄例子来讲q两个参数就?ChartFactory. createBarChart3DҎ中的最后两个参敎ͼq两个参数的cd都是布尔倹{这两个参数意思分别是Q是否创建工hC?tooltip)以及?否生成URL。这两个参数分别对应着MAP中一个AREA的title属性以及href属性?
可是我想知道的是怎么来生这个MAP啊!哈哈Q不要着急,JFreeChart已经帮我们做好生成MAP对象的功 能。ؓ了生成MAP对象p引入另外一个对象:ChartRenderingInfo。因为JFreeChart没有直接的方法利用一个图表对象直接生?MAP数据Q它需要一个中间对象来q渡Q这个对象就是ChartRenderingInfo。下图是生成MAP数据的流E图Q?
?上图所C,ChartUtilitiescL整个程的核心,它周围的对象都是一些例如数据对象或者是文g{。这个流E简单描q如下:首先创徏一?ChartRenderingInfo对象q在调用ChartUtilities的writeChartAsJPEG时作为最后一个参C递进厅R调用该 Ҏl束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象Q有了这个对象我们还是没有办法获取具体的MAP?据,我们q必d助于ChartUtilities的writeImageMapҎ来将ChartRenderingInfo对象d出来Q获取MAP 数据的代码片断如下:
|
打开文gD:" fruit.mapQ文件的内容是要写到页面上的MAP数据。把生成的图像文件以及MAP数据文g写到面上即可完成热点图表的功能。至于怎么l合两?之间的关pM如图像的useMap属性值必MMAP对象的名U结合v来,必须Ҏ实际的应用情况进行相应的处理。笔者徏议把二者通过标签库封装v来,?像文件的名称以及MAP对象的名U由标签库统一q行控制Q这样可以保证二者的一致性?