用JFreeChart画统计分析柱状图(成功版) |
[ 2006-6-19 17:38:00 | By: blueroc ]
|
JFreeChart API http://www.jfree.org/jfreechart/javadoc/ 及 成功运行的例子(直接在jsp中显示chart) org.jfree.chart org.jfree.chart.annotations org.jfree.chart.axis org.jfree.chart.entity org.jfree.chart.event org.jfree.chart.imagemap org.jfree.chart.labels org.jfree.chart.needle org.jfree.chart.plot org.jfree.chart.renderer org.jfree.chart.servlet org.jfree.chart.title org.jfree.chart.ui org.jfree.chart.urls org.jfree.data org.jfree.data.statistics org.jfree.data.time org.jfree.data.xml
我们介绍使用 JFreeChart 生成柱状图,首先从一个最简单的例子开始。
上面的程序简单,但生成的柱状图也很简单。更多的时候,我们可能需要不同的效果。org.jfree.chart.ChartFactory 这个工厂类有createBarChart,createStackedBarChart,createBarChart3D,createStackedBarChart3D这几个工厂方法创建不同类型的柱状图。关于这四个方法的 JFreeChart 的 Java Doc API 文档有详细说明,比较重要的是 PlotOrientation.VERTICAL 让平行柱垂直显示,而 PlotOrientation.HORIZONTAL 则让平行柱水平显示。 几个对柱状图影响较大的几个类,它们分别是: org.jfree.chart.axis.CategoryAxis org.jfree.chart.axis.ValueAxis org.jfree.chart.renderer.BarRenderer org.jfree.chart.renderer.BarRenderer3D 我们还是以实例来说明这几个类,先来假设一个需要统计的数据表: 根据上表数据,首先构造 CategoryDataset, 这里不再使用上面简单例子里面的 DefaultCategoryDataset 类,而是 DatasetUtilities 更有效的构造 CategoryDataset,如下列代码: 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 = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); 用上面的 dataset 生成的 3D 柱状图
CategoryAxis domainAxis = plot.getDomainAxis(); //设置 columnKey 是否垂直显示 domainAxis.setVerticalCategoryLabels(true); //设置距离图片左端距离 domainAxis.setLowerMargin(0.1); //设置距离图片右端距离 domainAxis.setUpperMargin(0.1); //设置 columnKey 是否间隔显示 domainAxis.setSkipCategoryLabelsToFit(true); plot.setDomainAxis(domainAxis); 上面代码产生的效果如下图,注意与图二的区别。
ValueAxis rangeAxis = plot.getRangeAxis(); //设置最高的一个柱与图片顶端的距离 rangeAxis.setUpperMargin(0.15); //设置最低的一个柱与图片底端的距离 //rangeAxis.setLowerMargin(0.15); plot.setRangeAxis(rangeAxis); 上面代码产生的效果如下图,注意与图二的区别。
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); 上面代码产生的效果如下图,注意与图二的区别。
补充两个有用的方法
补充 org.jfree.chart.plot.CategoryPlot 的两个方法,这两个方法对所有类型的图表都有作用,因为在前面没有介绍,这里补充一下。
//设置地区、销量的显示位置
plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); 上面代码产生的效果如下图,注意与图二的区别。
三 完整范例
前面都是一些代码片段,现在把这些片段组合成一个完整范例。 <DIV class=code> <%@ page contentType="image/jpeg;charset=GBK"%> <%@ page import="java.awt.Font"%> <%@ page import="java.awt.Color"%> <%@ page import="org.jfree.chart.ChartFactory"%> <%@ page import="org.jfree.chart.JFreeChart"%> <%@ page import="org.jfree.chart.plot.PlotOrientation"%> <%@ page import="org.jfree.chart.servlet.ServletUtilities"%> <%@ page import="org.jfree.data.general.DatasetUtilities"%> <%@ page import="org.jfree.data.DataUtilities"%> <%@ page import="org.jfree.chart.plot.CategoryPlot"%> <%@ page import="org.jfree.chart.axis.CategoryAxis"%> <%@ page import="org.jfree.chart.axis.ValueAxis"%> <%@ page import="org.jfree.chart.renderer.category.BarRenderer3D"%> <%@ page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"%> <%@ page import="org.jfree.chart.axis.AxisLocation"%> <%@ page import="org.jfree.data.category.CategoryDataset"%> <% 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 = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); JFreeChart chart = ChartFactory.createBarChart3D("水果销量图统计",null,null,dataset, PlotOrientation.VERTICAL,true,false,false); chart.setBackgroundPaint(Color.WHITE); CategoryPlot plot = chart.getCategoryPlot(); CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setVisible(true); plot.setDomainAxis(domainAxis); ValueAxis rangeAxis = plot.getRangeAxis(); //设置最高的一个 Item 与图片顶端的距离 rangeAxis.setUpperMargin(0.15); //设置最低的一个 Item 与图片底端的距离 rangeAxis.setLowerMargin(0.15); plot.setRangeAxis(rangeAxis); BarRenderer3D renderer = new BarRenderer3D(); renderer.setBaseOutlinePaint(Color.BLACK); //设置 Wall 的颜色<BR> 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); //设置每个地区所包含的平行柱的之间距离 renderer.setItemMargin(0.1); //显示每个柱的数值,并修改该数值的字体属性<BR> renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setItemLabelsVisible(true); plot.setRenderer(renderer); //设置柱的透明度<BR> plot.setForegroundAlpha(0.6f); //设置地区、销量的显示位置<BR> plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); System.out.println("!!!!!!!!!"+chart); String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; System.out.println("!!!!!!!!!"+graphURL); %> <img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">; </DIV>
不能正确运行,要在web.xml中配置:
<!--StartFragment-->
<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> 看看程序运行的结果吧:
三 总结我只介绍了少量的方法,更多的请参考 JFreeChart 的 Java Doc API 文档和 Sample Code 在Struts中用JFreeChart生成图表 1。action 处理: 2。页面 |