• 787.00 KB
  • 2023-01-17 11:48:40 发布

java实现各种数据统计图.doc

  • 31页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
.. java实现各种数据统计图(柱形图,饼图,折线图)分类: Java2012-05-2422:28 22644人阅读 评论(29) 收藏 举报javajfreechartdatasetapplicationclassproperties最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了:1.      jfreechart-1.0.13.jar2.      jcommon-1.0.16.jar3.      gnujaxp.jar 先来看一下,最终效果图: ... ..主要是jfreechart-1.0.13.jar,但这三个包要齐全,我已经将所有与jfreechart有关的jar包与本文实例的工程(代码)一同压缩上传了,有兴趣的同学可以下载,下载地址:download.csdn.net/detail/pzhtpf/4327700 接下来,我们一步步来实现本程序。 一,前期准备工作,也就把这三个第三方包添加进本文工程,添加过程特别简单,前面写过一篇博客,讲的是java如何读取Excel表格中的数据(有兴趣的同学可以看一看:blog.csdn.net/pzhtpf/article/details/7506135),也要添加第三方包,添加过程一模一样,这里我们在复习一遍:1, 建,立java项目,在这个项目在建立一个新的文件夹lib;2, 将上述三个jar包,复制到lib3,然后右键点击这个java项目,选择Properties4,在左侧列表里选中JavaBuildPath,右侧选中Libraries5,点击AddJARs6, 然后去选择这个项目中lib文件夹中的三个jar,点击确定成功后,项目中会多一个文件夹为:ReferencedLibraries 二, 实现柱形图的java代码:[plain] viewplaincopy1.  import java.awt.Font;  2.  3.import org.jfree.chart.ChartFactory;  4.import org.jfree.chart.ChartPanel;  5.import org.jfree.chart.JFreeChart;  6.import org.jfree.chart.axis.CategoryAxis;  7.import org.jfree.chart.axis.ValueAxis;  8.import org.jfree.chart.plot.CategoryPlot;  9.import org.jfree.chart.plot.PlotOrientation;  10.import org.jfree.data.category.CategoryDataset;  11.import org.jfree.data.category.DefaultCategoryDataset;  12.  13.public class BarChart {  14.    ChartPanel frame1;  15.    public  BarChart(){  16.        CategoryDataset dataset = getDataSet();  17.        JFreeChart chart = ChartFactory.createBarChart3D(  ... ..1.                             "水果", // 图表标题  2.                            "水果种类", // 目录轴的显示标签  3.                            "数量", // 数值轴的显示标签  4.                            dataset, // 数据集  5.                            PlotOrientation.VERTICAL, // 图表方向:水平、垂直  6.                            true,           // 是否显示图例(对于简单的柱状图必须是false)  7.                            false,          // 是否生成工具  8.                            false           // 是否生成URL  9.                            );  10.          11.        //从这里开始  12.        CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象  13.        CategoryAxis domainAxis=plot.getDomainAxis();         //水平底部列表  14.         domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14));         //水平底部标题  15.         domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));  //垂直标题  16.         ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状  17.         rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));  18.          chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));  19.          chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体  20.            21.          //到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题  22.            23.         frame1=new ChartPanel(chart,true);        //这里也可以用chartFrame,可以直接生成一个独立的Frame  24.           25.    }  26.       private static CategoryDataset getDataSet() {  27.           DefaultCategoryDataset dataset = new DefaultCategoryDataset();  28.           dataset.addValue(100, "", "苹果");  29.           dataset.addValue(100, "", "苹果");  30.           dataset.addValue(100, "", "苹果");  31.           dataset.addValue(200, "", "梨子");  ... ..1.           dataset.addValue(200, "", "梨子");  2.           dataset.addValue(200, "", "梨子");  3.           dataset.addValue(300, "", "葡萄");  4.           dataset.addValue(300, "", "葡萄");  5.           dataset.addValue(300, "", "葡萄");  6.           dataset.addValue(400, "", "香蕉");  7.           dataset.addValue(400, "", "香蕉");  8.           dataset.addValue(400, "", "香蕉");  9.           dataset.addValue(500, "", "荔枝");  10.           dataset.addValue(500, "", "荔枝");  11.           dataset.addValue(500, "", "荔枝");  12.           return dataset;  13.}  14.public ChartPanel getChartPanel(){  15.    return frame1;  16.      17.}  18.}   效果图如下: ... ..但我们把private static CategoryDatasetgetDataSet(){}方法中的数据变化一下后,又会形成另一种效果,比如说我们改成:[plain] viewplaincopy1.private static CategoryDataset getDataSet() {  2.           DefaultCategoryDataset dataset = new DefaultCategoryDataset();  3.           dataset.addValue(100, "苹果", "苹果");  4.           dataset.addValue(200, "梨子", "梨子");  5.           dataset.addValue(300, "葡萄", "葡萄");  6.           dataset.addValue(400, "香蕉", "香蕉");  7.           dataset.addValue(500, "荔枝", "荔枝");  8.           return dataset;  9.}   效果图如下: 三,    实现饼状图的java代码:[plain] viewplaincopy1. package .njue.testJFreeChart;  ... ..1.  2.import java.awt.Font;  3.import java.text.DecimalFormat;  4.import java.text.NumberFormat;  5.  6.import javax.swing.JPanel;  7.  8.import org.jfree.chart.ChartFactory;  9.import org.jfree.chart.ChartPanel;  10.import org.jfree.chart.JFreeChart;  11.import org.jfree.chart.labels.StandardPieSectionLabelGenerator;  12.import org.jfree.chart.plot.PiePlot;  13.import org.jfree.data.general.DefaultPieDataset;  14.  15.public class PieChart {  16.    ChartPanel frame1;  17.    public PieChart(){  18.          DefaultPieDataset data = getDataSet();  19.          JFreeChart chart = ChartFactory.createPieChart3D("水果产量",data,true,false,false);  20.        //设置百分比  21.          PiePlot pieplot = (PiePlot) chart.getPlot();  22.          DecimalFormat df = new DecimalFormat("0.00%");//获得一个DecimalFormat对象,主要是设置小数问题  23.          NumberFormat nf = NumberFormat.getNumberInstance();//获得一个NumberFormat对象  24.          StandardPieSectionLabelGenerator sp1 = new StandardPieSectionLabelGenerator("{0}  {2}", nf, df);//获得StandardPieSectionLabelGenerator对象  25.          pieplot.setLabelGenerator(sp1);//设置饼图显示百分比  26.        27.      //没有数据的时候显示的容  28.          pieplot.setNoDataMessage("无数据显示");  29.          pieplot.setCircular(false);  30.          pieplot.setLabelGap(0.02D);  31.        32.          pieplot.setIgnoreNullValues(true);//设置不显示空值  33.          pieplot.setIgnoreZeroValues(true);//设置不显示负值  34.         frame1=new ChartPanel (chart,true);  35.          chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体  36.          PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象  ... ..1.          piePlot.setLabelFont(new Font("宋体",Font.BOLD,10));//解决乱码  2.          chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,10));  3.    }  4.    private static DefaultPieDataset getDataSet() {  5.        DefaultPieDataset dataset = new DefaultPieDataset();  6.        dataset.setValue("苹果",100);  7.        dataset.setValue("梨子",200);  8.        dataset.setValue("葡萄",300);  9.        dataset.setValue("香蕉",400);  10.        dataset.setValue("荔枝",500);  11.        return dataset;  12.}  13.    public ChartPanel getChartPanel(){  14.        return frame1;  15.          16.    }  17.}   效果图如下:... .. 四,      实现折线图的java代码: [plain] viewplaincopy1.package .njue.testJFreeChart;  2.  3.import java.awt.Font;  4.import java.text.SimpleDateFormat;  5.  6.import org.jfree.chart.ChartFactory;  7.import org.jfree.chart.ChartPanel;  8.import org.jfree.chart.JFreeChart;  9.import org.jfree.chart.axis.DateAxis;  10.import org.jfree.chart.axis.ValueAxis;  11.import org.jfree.chart.plot.XYPlot;  12.import org.jfree.data.time.Month;  13.import org.jfree.data.time.TimeSeries;  14.import org.jfree.data.time.TimeSeriesCollection;  15.import org.jfree.data.xy.XYDataset;  16.  17.public class TimeSeriesChart {  ... ..1.    ChartPanel frame1;  2.    public TimeSeriesChart(){  3.        XYDataset xydataset = createDataset();  4.        JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("Legal & General单位信托基金价格", "日期", "价格",xydataset, true, true, true);  5.        XYPlot xyplot = (XYPlot) jfreechart.getPlot();  6.        DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();  7.        dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));  8.        frame1=new ChartPanel(jfreechart,true);  9.        dateaxis.setLabelFont(new Font("黑体",Font.BOLD,14));         //水平底部标题  10.        dateaxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));  //垂直标题  11.        ValueAxis rangeAxis=xyplot.getRangeAxis();//获取柱状  12.        rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));  13.        jfreechart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));  14.        jfreechart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体  15.  16.    }   17.     private static XYDataset createDataset() {  //这个数据集有点多,但都不难理解  18.            TimeSeries timeseries = new TimeSeries("legal & general欧洲指数信任",  19.                    org.jfree.data.time.Month.class);  20.            timeseries.add(new Month(2, 2001), 181.001D);  21.            timeseries.add(new Month(3, 2001), 167.001D);  22.            timeseries.add(new Month(4, 2001), 153.001D);  23.            timeseries.add(new Month(5, 2001), 167.999D);  24.            timeseries.add(new Month(6, 2001), 158.001D);  25.            timeseries.add(new Month(7, 2001), 148.001D);  26.            timeseries.add(new Month(8, 2001), 153.001D);  27.            timeseries.add(new Month(9, 2001), 142.999D);  28.            timeseries.add(new Month(10, 2001), 123.2D);  29.            timeseries.add(new Month(11, 2001), 131.001D);  30.            timeseries.add(new Month(12, 2001), 139.999D);  31.            timeseries.add(new Month(1, 2002), 142.001D);  32.            timeseries.add(new Month(2, 2002), 138.999D);  33.            timeseries.add(new Month(3, 2002), 137.001D);  34.            timeseries.add(new Month(4, 2002), 143.001D);  35.            timeseries.add(new Month(5, 2002), 139.001D);  ... ..1.            timeseries.add(new Month(6, 2002), 137D);  2.            timeseries.add(new Month(7, 2002), 132.001D);  3.            TimeSeries timeseries1 = new TimeSeries("legal & general英国指数信任",  4.                    org.jfree.data.time.Month.class);  5.            timeseries1.add(new Month(2, 2001), 129.999D);  6.            timeseries1.add(new Month(3, 2001), 123.2D);  7.            timeseries1.add(new Month(4, 2001), 117.2D);  8.            timeseries1.add(new Month(5, 2001), 124.999D);  9.            timeseries1.add(new Month(6, 2001), 122.999D);  10.            timeseries1.add(new Month(7, 2001), 119.2D);  11.            timeseries1.add(new Month(8, 2001), 116.5D);  12.            timeseries1.add(new Month(9, 2001), 112.7D);  13.            timeseries1.add(new Month(10, 2001), 101.5D);  14.            timeseries1.add(new Month(11, 2001), 106.999D);  15.            timeseries1.add(new Month(12, 2001), 110.3D);  16.            timeseries1.add(new Month(1, 2002), 111.7D);  17.            timeseries1.add(new Month(2, 2002), 111D);  18.            timeseries1.add(new Month(3, 2002), 109.999D);  19.            timeseries1.add(new Month(4, 2002), 113.2D);  20.            timeseries1.add(new Month(5, 2002), 111.999D);  21.            timeseries1.add(new Month(6, 2002), 108.8D);  22.            timeseries1.add(new Month(7, 2002), 101.999D);  23.            TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();  24.            timeseriescollection.addSeries(timeseries);  25.            timeseriescollection.addSeries(timeseries1);  26.            return timeseriescollection;  27.        }  28.      public ChartPanel getChartPanel(){  29.            return frame1;  30.              31.        }  32.}   效果图如下:... .. 再来看一下主方法:[plain] viewplaincopy1.import java.awt.GridLayout;  2.  3.import javax.swing.JFrame;  4.  5.public class mainClass {  6.public static void main(String args[]){  7.    JFrame frame=new JFrame("Java数据统计图");  8.    frame.setLayout(new GridLayout(2,2,10,10));  9.    frame.add(new BarChart().getChartPanel());           //添加柱形图  10.    frame.add(new BarChart1().getChartPanel());          //添加柱形图的另一种效果  11.    frame.add(new PieChart().getChartPanel());           //添加饼状图  12.    frame.add(new TimeSeriesChart().getChartPanel());    //添加折线图  13.    frame.setBounds(50, 50, 800, 600);  14.    frame.setVisible(true);  15.}  ... ..1.}   五,             总结 以上都是一个简单的例子去实现了,想了解更深的同学可自行查询资料,其实以上代码都通俗易懂,只要结合自己的实际情况,便可开发出属于自己的Application,大家可以看出我这里是在Application上实现的,其实更多情况数据统计图在javaweb上应用更多,大家也可自行了解。ps:如运行本文工程项目是出现错误,请参考博文:blog.csdn.net/pzhtpf/article/details/7506135... ..JFreeChart入学教程  2011-08-0814:55:19|  分类: 技术篇|举报|字号 订阅JFreeChart是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。它能够用在Swing和Web等中制作自定义的图表或报表,并且得到广泛的应用。本文将通过引领读者学习在JFreeChart中饼图、柱状图和曲线图的进阶应用,来达到熟练使用JFreeChart的目的。 一.下载与环境配置 1.下载JFreeChart JFreeChart是开放源代码的免费软件,但是它的支持文档需要付费才能得到。其下载地址为:sourceforge.net/project/showfiles.php?group_id=15494,当前最新版本为1.0.13。笔者下载的是1.0.13最新版。 说明:1)source目录:为jfreechart的源码目录;        2)lib目录:为包目录,我们需要关注的包为jfreechart-1.0.13.jar、gnujaxp.jar和jcommon-1.0.16.jar这三个包;        3)根目录下的jfreechart-1.0.13-demo.jar是例子程序,大家双击后可看到其中有很多例子的运行结果。 2.环境配置       笔者的开发环境如下:       JDK:1.6       MyEclipse:6.6       Tomcat:6.0.18为了后续的“用JFreeChart创建基于Web的图表”的一个例子的展示,我们在MyEclipse中创建一个名为jfreechart的Web工程。将下载的JFreeChart1.0.6下lib目录下的jar包拷贝到WebRoot/WEB-INF/lib目录下。另外还需要在web.xml文件中增加如下配置:  DisplayChart ... ..org.jfree.chart.servlet.DisplayChart   DisplayChart /DisplayChart  二.  柱状图 在WebRoot目录下建立bar目录,用来存放柱状图的各个例子。首先在该目录下建立一个sample1.jsp文件,让我们来看一个简单的柱状图的例子,修改后的sample1.jsp的容如下所示: <%pagecontentType="text/html;charset=GBK"%><%pageimport="org.jfree.chart.ChartFactory, org.jfree.chart.JFreeChart, org.jfree.chart.plot.PlotOrientation, org.jfree.chart.servlet.ServletUtilities, org.jfree.data.category.DefaultCategoryDataset"%><% DefaultCategoryDatasetdataset=newDefaultCategoryDataset(); dataset.addValue(610,"Guangzhou","Pig");dataset.addValue(220,"Guangzhou","Beef");dataset.addValue(530,"Guangzhou","Chicken");dataset.addValue(340,"Guangzhou","Fish");JFreeChartchart=ChartFactory.createBarChart3D("肉类销量统计图", "type", "amount", dataset, PlotOrientation.VERTICAL, false, false, ... ..false); Stringfilename=ServletUtilities.saveChartAsPNG(chart,500,300,null,session); StringgraphURL=request.getContextPath()+"/DisplayChart?filename="+filename; %> "width=500height=300border=0usemap="#<%=filename%>"> 在浏览器中输入地址:localhost:8080/jfreechart/bar/sample1.jsp,可看到如下柱状图:   上面的这个柱状图比较简单,稍显单调,在有些情况下,我们需要用不同颜色来表示不同的种类,或者在种类上标上具体数值,亦或需要加上3D水晶效果。下面让我们来做更深一步的探讨。接下来让我们看一个用不同颜色来表示不通种类的例子。在WebRoot的bar目录下新建sample2.jsp页面,将其代码修改如下: <%pagecontentType="text/html;charset=GBK"%>... ..<%pageimport="org.jfree.chart.ChartFactory, org.jfree.chart.JFreeChart, org.jfree.chart.plot.PlotOrientation, org.jfree.chart.servlet.ServletUtilities, org.jfree.data.category.CategoryDataset, org.jfree.data.general.DatasetUtilities"%><% double[][]data=newdouble[][]{{1310},{720},{1130},{440}}; String[]rowKeys={"pig","beef","chicken","fish"};String[]columnKeys={""}; CategoryDatasetdataset=DatasetUtilities.createCategoryDataset(rowKeys,columnKeys,data); JFreeChartchart=ChartFactory.createBarChart3D("肉类销量统计图", "type", "amount", dataset, PlotOrientation.VERTICAL, true, false, false); Stringfilename=ServletUtilities.saveChartAsPNG(chart,500,300,null,session); StringgraphURL=request.getContextPath()+"/DisplayChart?filename="+filename; %> "width=500height=300border=0usemap="#<%=filename%>"> 该页面的运行效果如下图所示: ... ..  对比该例与前例,可看出createBarChart3D的倒数第三个参数修改成了true,该参数可用来显示下方的方框。上两例我们显示的只是一个城市的肉类销量,有时候我们有对比显示多个城市的不同肉类,只要将上例稍作修改即可。例如要在图中表示、、、四个城市的四个肉类的销售情况,只需要将如下三句稍做修改: double[][]data=newdouble[][]{{1310},{720},{1130},{440}}; String[]rowKeys={"pig","beef","chicken","fish"}; String[]columnKeys={""}; 例如修改成: double[][]data=newdouble[][]{{1310,1220,1110,1000}, {720,700,680,640}, {1130,1020,980,800}, {440,400,360,300}}; String[]rowKeys={"pig","beef","chicken","fish"};String[]columnKeys={"Guangzhou","Shenzhen","Dongguan","Foshan"}; 在运行该jsp页面,可看到如下界面: ... ..     在上述几例中,在某个柱子上都没有显示相应的数值,下面让我们为每个柱子都加上它的数值,我们新建一个sample4.jsp页面,其容如下: <%pagecontentType="text/html;charset=GBK"%><%pageimport="org.jfree.chart.ChartFactory, org.jfree.chart.JFreeChart, org.jfree.chart.plot.PlotOrientation, org.jfree.chart.servlet.ServletUtilities, org.jfree.data.category.CategoryDataset, org.jfree.data.general.DatasetUtilities, org.jfree.chart.plot.*, org.jfree.chart.labels.*, org.jfree.chart.renderer.category.BarRenderer3D, java.awt.*, org.jfree.ui.*, org.jfree.chart.axis.AxisLocation"%><% double[][]data=newdouble[][]{{1310,1220,1110,1000}, {720,700,680,640}, {1130,1020,980,800}, {440,400,360,300}}; ... ..String[]rowKeys={"pig","beef","chicken","fish"};  String[]columnKeys={"Guangzhou","Shenzhen","Dongguan","Foshan"}; CategoryDatasetdataset=DatasetUtilities.createCategoryDataset(rowKeys,columnKeys,data); JFreeChartchart=ChartFactory.createBarChart3D("肉类销量统计图", "type", "amount", dataset, PlotOrientation.VERTICAL, true, true, false); CategoryPlotplot=chart.getCategoryPlot(); //设置网格背景颜色 plot.setBackgroundPaint(Color.white); //设置网格竖线颜色 plot.setDomainGridlinePaint(Color.pink); //设置网格横线颜色 plot.setRangeGridlinePaint(Color.pink); //显示每个柱的数值,并修改该数值的字体属性 BarRenderer3Drenderer=newBarRenderer3D(); renderer.setBaseItemLabelGenerator(newStandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); //默认的数字显示在柱子中,通过如下两句可调整数字的显示 //注意:此句很关键,若无此句,那数字的显示会被覆盖,给人数字没有显示出来的问题 renderer.setBasePositiveItemLabelPosition(newItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT));renderer.setItemLabelAnchorOffset(10D); //设置每个地区所包含的平行柱的之间距离 ... ..//renderer.setItemMargin(0.3); plot.setRenderer(renderer); //设置地区、销量的显示位置 //将下方的“肉类”放到上方 plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); //将默认放在左边的“销量”放到右方 plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); Stringfilename=ServletUtilities.saveChartAsPNG(chart,700,400,null,session); StringgraphURL=request.getContextPath()+"/DisplayChart?filename="+filename; %> "width=700height=400border=0usemap="#<%=filename%>"> 运行效果如下所示: ... .. 注意:jfreechart的很多版本不兼容,请大家在运行此例时确认下载了对应的版本。 三. 饼图 在WebRoot目录下建立名为pie的子目录,用来存放本教程中饼图的实例jsp页面。下面让我们来看一个简单的三维饼图。首先在pie目录下建立一个名为sample1.jsp的页面。 在JFreeChart中,与饼图绘制密切相关的类如下: 1) PiePlot 饼图绘制类,可以用来设置饼图的相关属性。例如: PiePlotpieplot=(PiePlot)jfreechart.getPlot(); pieplot.setLabelFont(newFont("SansSerif",0,12)); pieplot.setNoDataMessage("Nodataavailable"); pieplot.setCircular(false); pieplot.setLabelGap(0.02D); 2) DefaultPieDataset 默认的饼图数据集类,用来存储饼图显示的相关数据信息。例如: DefaultPieDatasetdataset=newDefaultPieDataset(); dataset.setValue("品德",newDouble(0.2D)); dataset.setValue("体育",newDouble(0.2D)); dataset.setValue("音乐",newDouble(0.2D)); dataset.setValue("其余成绩",newDouble(0.4D)); 3) ChartFactory 可利用该制图工厂类createPieChart来创建一个饼图的JFreeChart对象,例如: JFreeChartjfreechart=ChartFactory.createPieChart("饼图示例",dataset,true,true,false);       下面让我们看一个简单的例子,修改sample1.jsp的容如下: <%pagecontentType="text/html;charset=GBK"%> <%pageimport="org.jfree.chart.*, org.jfree.chart.plot.PiePlot, org.jfree.data.general.DefaultPieDataset, org.jfree.chart.servlet.ServletUtilities, java.awt.*"%> <% ... ..//设置数据集 DefaultPieDatasetdataset=newDefaultPieDataset(); dataset.setValue("初中高级程序员",0.55); dataset.setValue("项目经理",0.1); dataset.setValue("系统分析师",0.1); dataset.setValue("软件架构师",0.1); dataset.setValue("其他",0.2); //通过工厂类生成JFreeChart对象 JFreeChartchart=ChartFactory.createPieChart3D("IT行业职业分布图",dataset,true,false,false); PiePlotpieplot=(PiePlot)chart.getPlot(); pieplot.setLabelFont(newFont("宋体",0,12)); //没有数据的时候显示的容 pieplot.setNoDataMessage("无数据显示"); pieplot.setCircular(false); pieplot.setLabelGap(0.02D); Stringfilename=ServletUtilities.saveChartAsPNG(chart,500,300,null,session); StringgraphURL=request.getContextPath()+"/DisplayChart?filename="+filename; %> "width=500height=300border=0usemap="#<%=filename%>"> 可以看出,饼图的绘制与柱状图的绘制类似,该例的运行效果如下: ... ..通过JFreeChart还可以提供漂亮的水晶饼图效果,接着让我们新建一个sample3.jsp页面来体验一下超炫美图吧。修改sample3.jsp页面如下: <%pagecontentType="text/html;charset=GBK"%> <%pageimport="org.jfree.chart.*,                 org.jfree.chart.servlet.ServletUtilities,                 org.jfree.util.Rotation,                 org.jfree.data.general.DefaultPieDataset,                 org.jfree.chart.plot.PiePlot3D"%> <% //设置数据集 DefaultPieDatasetdataset=newDefaultPieDataset(); dataset.setValue("初中高级程序员",0.55); dataset.setValue("项目经理",0.1); dataset.setValue("系统分析师",0.1); dataset.setValue("软件架构师",0.1); dataset.setValue("其他",0.2); //通过工厂类生成JFreeChart对象 JFreeChartchart=ChartFactory.createPieChart3D("IT行业职业分布图",dataset,true,true,false); //获得3D的水晶饼图对象 ... ..PiePlot3Dpieplot3d=(PiePlot3D)chart.getPlot(); //设置开始角度 pieplot3d.setStartAngle(150D); //设置方向为”顺时针方向“ pieplot3d.setDirection(Rotation.CLOCKWISE); //设置透明度,0.5F为半透明,1为不透明,0为全透明 pieplot3d.setForegroundAlpha(0.5F); pieplot3d.setNoDataMessage("无数据显示");        Stringfilename=ServletUtilities.saveChartAsPNG(chart,500,300,null,session); StringgraphURL=request.getContextPath()+"/DisplayChart?filename="+filename; %> "width=500height=300border=0usemap="#<%=filename%>">利用setForegroundAlpha()方法可以设置3D饼图的透明度,利用setStartAngle()可以设置其开始角度,利用setDirection()方法可以设置其方向。该例的运行效果如下图所示: ... .. 四.曲线图 接着我们来介绍曲线图的使用。在笔者日常的开发工作中,曲线图用得最多,它可以用来绘制趋势图、统计分析等。首先我们在WebRoot下建立一个line目录,用来存放曲线图实例的jsp页面。我们在该目录下建立sample1.jsp页面来做一个简单的曲线图的例子。在开始编码前,让我们来看看与画曲线图密切相关的几个类: 1)TimeSeriesCollection 曲线数据的集合。 2)TimeSeries 曲线信息序列。 3)ChartFactory 可以利用该类的createTimeSeriesChart方法来创建曲线的JFreeChart对象。 在下例中,我们显示阿蜜果的blog在2007年度各月份的访问量情况,修改后的sample1.jsp的容如下: <%pagecontentType="text/html;charset=GBK"%> <%pageimport="org.jfree.chart.ChartFactory,              org.jfree.chart.JFreeChart, ... ..             org.jfree.chart.servlet.ServletUtilities,              org.jfree.chart.title.TextTitle,              org.jfree.data.time.TimeSeries,              org.jfree.data.time.Month,              org.jfree.data.time.TimeSeriesCollection,              java.awt.Font"%> <% //访问量统计时间线 TimeSeriestimeSeries=newTimeSeries("阿蜜果blog访问量统计",Month.class);//时间曲线数据集合 TimeSeriesCollectionlineDataset=newTimeSeriesCollection(); //构造数据集合 timeSeries.add(newMonth(1,2007),11200); timeSeries.add(newMonth(2,2007),9000); timeSeries.add(newMonth(3,2007),6200); timeSeries.add(newMonth(4,2007),8200); timeSeries.add(newMonth(5,2007),8200); timeSeries.add(newMonth(6,2007),12200); timeSeries.add(newMonth(7,2007),13200); timeSeries.add(newMonth(8,2007),8300); timeSeries.add(newMonth(9,2007),12400); timeSeries.add(newMonth(10,2007),12500); timeSeries.add(newMonth(11,2007),13600); timeSeries.add(newMonth(12,2007),12500); lineDataset.addSeries(timeSeries); JFreeChartchart=ChartFactory.createTimeSeriesChart("访问量统计时间线","month","visitamount",lineDataset,true,true,true); //设置子标题 TextTitlesubtitle=newTextTitle("2007年度",newFont("黑体",Font.BOLD,12)); ... ..chart.addSubtitle(subtitle); //设置主标题 chart.setTitle(newTextTitle("阿蜜果blog访问量统计",newFont("隶书",Font.ITALIC,15))); chart.setAntiAlias(true); Stringfilename=ServletUtilities.saveChartAsPNG(chart,500,300,null,session); StringgraphURL=request.getContextPath()+"/DisplayChart?filename="+filename; %> "width=500height=300border=0usemap="#<%=filename%>"> 运行后的曲线效果如下图所示:   有时我们需要显示各数据点及其数值,这是我们需要对上例进行一点改动,在JFreeChartchart=ChartFactory.createTimeSeriesChart……后,TextTitlesubtitle=newTextTitle……前加上如下的代码: XYPlotplot=(XYPlot)chart.getPlot(); XYLineAndShapeRendererxylineandshaperenderer=(XYLineAndShapeRenderer)plot.getRenderer(); ... ..//设置网格背景颜色 plot.setBackgroundPaint(Color.white); //设置网格竖线颜色 plot.setDomainGridlinePaint(Color.pink); //设置网格横线颜色 plot.setRangeGridlinePaint(Color.pink); //设置曲线图与xy轴的距离 plot.setAxisOffset(newRectangleInsets(0D,0D,0D,10D)); //设置曲线是否显示数据点 xylineandshaperenderer.setBaseShapesVisible(true); //设置曲线显示各数据点的值 XYItemRendererxyitem=plot.getRenderer();   xyitem.setBaseItemLabelsVisible(true);   xyitem.setBasePositiveItemLabelPosition(newItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT));xyitem.setBaseItemLabelGenerator(newStandardXYItemLabelGenerator()); xyitem.setBaseItemLabelFont(newFont("Dialog",1,14)); plot.setRenderer(xyitem);    并引入了一些另外的包,引入包的语句变成: <%pageimport="org.jfree.chart.ChartFactory,              org.jfree.chart.title.TextTitle,              org.jfree.data.time.TimeSeries,              org.jfree.data.time.Month,              org.jfree.data.time.TimeSeriesCollection,              org.jfree.chart.plot.XYPlot,              org.jfree.chart.renderer.xy.XYLineAndShapeRenderer,              java.awt.Color,              org.jfree.ui.RectangleInsets,              java.awt.Font,              org.jfree.chart.renderer.xy.XYItemRenderer,              org.jfree.chart.JFreeChart,              org.jfree.chart.servlet.ServletUtilities, ... ..             org.jfree.chart.labels.*,              org.jfree.ui.*"%>       运行该实例,效果如下所示:  上面两例的曲线图都是但曲线的,有时候我们对两个曲线进行比较,例如对阿蜜果在2006年度和2007年度的blog访问量进行比较,在此种情况下,我们需要在一个曲线图中显示两个曲线。在此种情况下,我们只需要在sample1.jsp的基础上新建一个TimeSeries对象,给它添加数据后,将其添加到TimeSeriesCollection型数据集合对象中,修改后的程序主体部分如下所示: //访问量统计时间线 TimeSeriestimeSeries2006=newTimeSeries("2006年度",Month.class); TimeSeriestimeSeries2007=newTimeSeries("2007年度",Month.class); //时间曲线数据集合 TimeSeriesCollectionlineDataset=newTimeSeriesCollection(); //构造数据集合 timeSeries2006.add(newMonth(1,2007),7200); timeSeries2006.add(newMonth(2,2007),7000); timeSeries2006.add(newMonth(3,2007),4200); timeSeries2006.add(newMonth(4,2007),8200); timeSeries2006.add(newMonth(5,2007),7300); ... ..timeSeries2006.add(newMonth(6,2007),8200); timeSeries2006.add(newMonth(7,2007),9200); timeSeries2006.add(newMonth(8,2007),7300); timeSeries2006.add(newMonth(9,2007),9400); timeSeries2006.add(newMonth(10,2007),7500); timeSeries2006.add(newMonth(11,2007),6600); timeSeries2006.add(newMonth(12,2007),3500); timeSeries2007.add(newMonth(1,2007),10200); timeSeries2007.add(newMonth(2,2007),9000); timeSeries2007.add(newMonth(3,2007),6200); timeSeries2007.add(newMonth(4,2007),8200); timeSeries2007.add(newMonth(5,2007),8200); timeSeries2007.add(newMonth(6,2007),11200); timeSeries2007.add(newMonth(7,2007),13200); timeSeries2007.add(newMonth(8,2007),8300); timeSeries2007.add(newMonth(9,2007),10400); timeSeries2007.add(newMonth(10,2007),12500); timeSeries2007.add(newMonth(11,2007),10600); timeSeries2007.add(newMonth(12,2007),10500); lineDataset.addSeries(timeSeries2006); lineDataset.addSeries(timeSeries2007); JFreeChartchart=ChartFactory.createTimeSeriesChart("访问量统计时间线","month","visitamount",lineDataset,true,true,true); //设置子标题 TextTitlesubtitle=newTextTitle("2006/2007年度访问量对比",newFont("黑体",Font.BOLD,12)); chart.addSubtitle(subtitle); //设置主标题 chart.setTitle(newTextTitle("阿蜜果blog访问量统计",newFont("隶书",Font.ITALIC,15))); chart.setAntiAlias(true); 该例的运行效果如下: ... .. 五.   总结 本文通过详尽的实例讲述了如何利用JFreeChart开发常用的柱状图、饼图和曲线图。从这些实例中可以看出,JFreeChart是我们开发图表或报表的理想选择,它简单易用,并且容易理解,是我们开发的利刃。但由于笔者刚刚接触,现图中的乱码问题还没解决,如有人已解决这一类的问题请赐教一下。TextTitletextTitle=chart.getTitle();textTitle.setFont(newFont("黑体",Font.BOLD,15)); 加入这段代码,就中文不乱码了。...