- 719.25 KB
- 2023-01-15 11:51:34 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话: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包与本文实例的工程(代码)一同压缩上传了,有兴趣的同学可以下载,下载地址:http://download.csdn.net/detail/pzhtpf/4327700 接下来,我们一步步来实现本程序。 一,前期准备工作,也就把这三个第三方包添加进本文工程,添加过程特别简单,前面写过一篇博客,讲的是java如何读取Excel表格中的数据(有兴趣的同学可以看一看:http://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( 18. "水果", // 图表标题 19. "水果种类", // 目录轴的显示标签
1. "数量", // 数值轴的显示标签 2. dataset, // 数据集 3. PlotOrientation.VERTICAL, // 图表方向:水平、垂直 4. true, // 是否显示图例(对于简单的柱状图必须是false) 5. false, // 是否生成工具 6. false // 是否生成URL链接 7. ); 8. 9. //从这里开始 10. CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象 11. CategoryAxis domainAxis=plot.getDomainAxis(); //水平底部列表 12. domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题 13. domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题 14. ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状 15. rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15)); 16. chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15)); 17. chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体 18. 19. //到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题 20. 21. frame1=new ChartPanel(chart,true); //这里也可以用chartFrame,可以直接生成一个独立的Frame 22. 23. } 24. private static CategoryDataset getDataSet() { 25. DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 26. dataset.addValue(100, "北京", "苹果"); 27. dataset.addValue(100, "上海", "苹果"); 28. dataset.addValue(100, "广州", "苹果"); 29. dataset.addValue(200, "北京", "梨子"); 30. dataset.addValue(200, "上海", "梨子"); 31. dataset.addValue(200, "广州", "梨子"); 32. dataset.addValue(300, "北京", "葡萄"); 33. dataset.addValue(300, "上海", "葡萄"); 34. dataset.addValue(300, "广州", "葡萄"); 35. dataset.addValue(400, "北京", "香蕉"); 36. dataset.addValue(400, "上海", "香蕉"); 37. dataset.addValue(400, "广州", "香蕉"); 38. dataset.addValue(500, "北京", "荔枝");
1. dataset.addValue(500, "上海", "荔枝"); 2. dataset.addValue(500, "广州", "荔枝"); 3. return dataset; 4.} 5.public ChartPanel getChartPanel(){ 6. return frame1; 7. 8.} 9.} 效果图如下: 但我们把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, "香蕉", "香蕉");
1. dataset.addValue(500, "荔枝", "荔枝"); 2. return dataset; 3.} 效果图如下: 三, 实现饼状图的java代码:[plain] viewplaincopy1. package com.njue.testJFreeChart; 2. 3.import java.awt.Font; 4.import java.text.DecimalFormat; 5.import java.text.NumberFormat; 6. 7.import javax.swing.JPanel; 8. 9.import org.jfree.chart.ChartFactory; 10.import org.jfree.chart.ChartPanel; 11.import org.jfree.chart.JFreeChart; 12.import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
1.import org.jfree.chart.plot.PiePlot; 2.import org.jfree.data.general.DefaultPieDataset; 3. 4.public class PieChart { 5. ChartPanel frame1; 6. public PieChart(){ 7. DefaultPieDataset data = getDataSet(); 8. JFreeChart chart = ChartFactory.createPieChart3D("水果产量",data,true,false,false); 9. //设置百分比 10. PiePlot pieplot = (PiePlot) chart.getPlot(); 11. DecimalFormat df = new DecimalFormat("0.00%");//获得一个DecimalFormat对象,主要是设置小数问题 12. NumberFormat nf = NumberFormat.getNumberInstance();//获得一个NumberFormat对象 13. StandardPieSectionLabelGenerator sp1 = new StandardPieSectionLabelGenerator("{0} {2}", nf, df);//获得StandardPieSectionLabelGenerator对象 14. pieplot.setLabelGenerator(sp1);//设置饼图显示百分比 15. 16. //没有数据的时候显示的内容 17. pieplot.setNoDataMessage("无数据显示"); 18. pieplot.setCircular(false); 19. pieplot.setLabelGap(0.02D); 20. 21. pieplot.setIgnoreNullValues(true);//设置不显示空值 22. pieplot.setIgnoreZeroValues(true);//设置不显示负值 23. frame1=new ChartPanel (chart,true); 24. chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体 25. PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象 26. piePlot.setLabelFont(new Font("宋体",Font.BOLD,10));//解决乱码 27. chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,10)); 28. } 29. private static DefaultPieDataset getDataSet() { 30. DefaultPieDataset dataset = new DefaultPieDataset(); 31. dataset.setValue("苹果",100); 32. dataset.setValue("梨子",200); 33. dataset.setValue("葡萄",300); 34. dataset.setValue("香蕉",400); 35. dataset.setValue("荔枝",500); 36. return dataset; 37.} 38. public ChartPanel getChartPanel(){ 39. return frame1;
1. 2. } 3.} 效果图如下: 四, 实现折线图的java代码: [plain] viewplaincopy1.package com.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;
1.import org.jfree.chart.axis.ValueAxis; 2.import org.jfree.chart.plot.XYPlot; 3.import org.jfree.data.time.Month; 4.import org.jfree.data.time.TimeSeries; 5.import org.jfree.data.time.TimeSeriesCollection; 6.import org.jfree.data.xy.XYDataset; 7. 8.public class TimeSeriesChart { 9. ChartPanel frame1; 10. public TimeSeriesChart(){ 11. XYDataset xydataset = createDataset(); 12. JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("Legal & General单位信托基金价格", "日期", "价格",xydataset, true, true, true); 13. XYPlot xyplot = (XYPlot) jfreechart.getPlot(); 14. DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis(); 15. dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy")); 16. frame1=new ChartPanel(jfreechart,true); 17. dateaxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题 18. dateaxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题 19. ValueAxis rangeAxis=xyplot.getRangeAxis();//获取柱状 20. rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15)); 21. jfreechart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15)); 22. jfreechart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体 23. 24. } 25. private static XYDataset createDataset() { //这个数据集有点多,但都不难理解 26. TimeSeries timeseries = new TimeSeries("legal & general欧洲指数信任", 27. org.jfree.data.time.Month.class); 28. timeseries.add(new Month(2, 2001), 181.80000000000001D); 29. timeseries.add(new Month(3, 2001), 167.30000000000001D); 30. timeseries.add(new Month(4, 2001), 153.80000000000001D); 31. timeseries.add(new Month(5, 2001), 167.59999999999999D); 32. timeseries.add(new Month(6, 2001), 158.80000000000001D); 33. timeseries.add(new Month(7, 2001), 148.30000000000001D); 34. timeseries.add(new Month(8, 2001), 153.90000000000001D); 35. timeseries.add(new Month(9, 2001), 142.69999999999999D); 36. timeseries.add(new Month(10, 2001), 123.2D); 37. timeseries.add(new Month(11, 2001), 131.80000000000001D);
1. timeseries.add(new Month(12, 2001), 139.59999999999999D); 2. timeseries.add(new Month(1, 2002), 142.90000000000001D); 3. timeseries.add(new Month(2, 2002), 138.69999999999999D); 4. timeseries.add(new Month(3, 2002), 137.30000000000001D); 5. timeseries.add(new Month(4, 2002), 143.90000000000001D); 6. timeseries.add(new Month(5, 2002), 139.80000000000001D); 7. timeseries.add(new Month(6, 2002), 137D); 8. timeseries.add(new Month(7, 2002), 132.80000000000001D); 9. TimeSeries timeseries1 = new TimeSeries("legal & general英国指数信任", 10. org.jfree.data.time.Month.class); 11. timeseries1.add(new Month(2, 2001), 129.59999999999999D); 12. timeseries1.add(new Month(3, 2001), 123.2D); 13. timeseries1.add(new Month(4, 2001), 117.2D); 14. timeseries1.add(new Month(5, 2001), 124.09999999999999D); 15. timeseries1.add(new Month(6, 2001), 122.59999999999999D); 16. timeseries1.add(new Month(7, 2001), 119.2D); 17. timeseries1.add(new Month(8, 2001), 116.5D); 18. timeseries1.add(new Month(9, 2001), 112.7D); 19. timeseries1.add(new Month(10, 2001), 101.5D); 20. timeseries1.add(new Month(11, 2001), 106.09999999999999D); 21. timeseries1.add(new Month(12, 2001), 110.3D); 22. timeseries1.add(new Month(1, 2002), 111.7D); 23. timeseries1.add(new Month(2, 2002), 111D); 24. timeseries1.add(new Month(3, 2002), 109.59999999999999D); 25. timeseries1.add(new Month(4, 2002), 113.2D); 26. timeseries1.add(new Month(5, 2002), 111.59999999999999D); 27. timeseries1.add(new Month(6, 2002), 108.8D); 28. timeseries1.add(new Month(7, 2002), 101.59999999999999D); 29. TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(); 30. timeseriescollection.addSeries(timeseries); 31. timeseriescollection.addSeries(timeseries1); 32. return timeseriescollection; 33. } 34. public ChartPanel getChartPanel(){ 35. return frame1; 36. 37. } 38.} 效果图如下:
再来看一下主方法:[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.} 16.}
五, 总结 以上都是一个简单的例子去实现了,想了解更深的同学可自行查询资料,其实以上代码都通俗易懂,只要结合自己的实际情况,便可开发出属于自己的Application,大家可以看出我这里是在Application上实现的,其实更多情况数据统计图在javaweb上应用更多,大家也可自行了解。ps:如运行本文工程项目是出现错误,请参考博文:http://blog.csdn.net/pzhtpf/article/details/7506135
JFreeChart入学教程 2011-08-0814:55:19| 分类: 技术篇|举报|字号 订阅JFreeChart是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。它能够用在Swing和Web等中制作自定义的图表或报表,并且得到广泛的应用。本文将通过引领读者学习在JFreeChart中饼图、柱状图和曲线图的进阶应用,来达到熟练使用JFreeChart的目的。 一.下载与环境配置 1.下载JFreeChart JFreeChart是开放源代码的免费软件,但是它的支持文档需要付费才能得到。其下载地址为:http://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%>"> 在浏览器中输入地址:http://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)); 加入这段代码,就中文不乱码了。