1.使用JFreeChart绘图环境配置
1.1下载JFreeChart
JFreeChart是一款开源的java图表绘制工具,是JFreeChart公司在开源网站SourceForge.net上的一个项目——Java图形解决方案,其图表种类丰富,接口通俗易懂,支持多种显示方式,如Application、Applets、Servlet和JSP。
我们可以从jfree官方网站上获取最新版本和相关资料;
获取地址:http://www.jfree.org/jfreechart/index.html(同时可以获得简明介绍)。
本文实验所采用的版本为JFreeChart-1.0.19.zip,下文将以此版本展开开发介绍。
1.2MyEclipse中的环境配置
具体步骤如下:
1新建一个javaWeb工程;
2)解压下载的JFreeChart包(本文实验为JFreeChart-1.0.19.zip);
3)将JFreeChart-1.0.19\lib目录下的jar文件复制到新建的Javaweb工程的WebRoot\WEB-INF\lib目录下,如图4-14所示。
图4-14 复制JFreeChart类库到JavaWeb项目lib目录
1.3在web.xml文件中配置
JFreeChart组件提供了一个Servlet文件用于获取生成的图表,此Servlet文件储存在JFreeChart组件的包中,所以在使用过程中,需要将其配置到Web.xml文件中。
1. <?xml version="1.0"encoding="gb2312"?>
2. <web-app version="3.0"
3. xmlns="http://java.sun.com/xml/ns/javaee"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
7. <servlet>
8. <servlet-name>DisplayChart</servlet-name>
9. <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
10. </servlet>
11. <servlet-mapping>
12. <servlet-name>DisplayChart</servlet-name>
13. <url-pattern>/DisplayChart</url-pattern>
14. </servlet-mapping>
15. </web-app>
org.jfree.chart.servlet.DisplayChart是JFreeChart一个重要的类,它负责将图形画出,它同时也是一个Servlet。至此,JFreeChart的配置就完成了,下面就可以进行JFreeChart的开发了。
2.基于JfreeChart的javaWeb图表绘制
2.1饼图
1.普通饼图
本实例在MyEclipse新建一个名为PieChart的Java Web项目,此实例用于统计软件1班学生的英语成绩,并用饼图予以直观的呈现出来。
1.创建ChartUtil类,使用DefaultPieDataset方法可以创建饼图的数据集合,使用setValue()方法可以为数据集合添加数据。代码如下:
2. ChartFactory是一个图形工厂,我们使用createPieChart()方法根据饼图数据集合创建一个JFreeChart对象。新建一个JFreeChart()方法,使用ChartFactory类根据饼图的数据集合创建一个JFreeChart对象。代码如下:
3.编写setPiePoltFont(JFreeChart chart)方法设置饼图图表,标题和图例的字体,以使得其支持显示中文。其代码如下:
4.使用PiePot类的setExplodePercent()方法可以指定要分离的饼图扇形区域,编写createPiePlot(JFreeChart chart)方法将学生英语成绩优秀的区域分离。代码如下:
5.在默认情况下,JFreeChart图表中显示类别名称而不显示数值,我们使用StandardPieSectionLabelGenerator的构造函数可以重新生成图表标签。创建setPiePoltNum(JFreeChart chart)方法来设置饼图要显示的数值。代码如下:
6.创建index.jsp文件(创建javaweb项目时系统已经默认创建),用于显示图表。其关键代码如下:
在浏览器中访问http://localhost:8080/PieChart/index.jsp,运行结果如图4-15所示。其详细代码参见附录1。
图 4-15 普通饼图实例运行效果图
2.3D饼图
普通饼图都是平面的,可能给人一种平面的死板的感觉,与此相比,3D饼图则更具立体感,本实例通过ChartFactory类的createPieChart3D()方法创建3D饼图(与普通饼图相比只需将createPieChart ()方法换成createPieChart3D()方法即可)。
在3D饼图里,我们使用PiePlot类的setForegroundAlpha()方法来设置图的透明度。其代码如下:
此实例的运行效果图如图4-16所示,其具体源代码参加附录1。
图4-16 3D饼图实例运行效果图
3.多饼图
利用JFreeChart提供的图表功能可以建立多饼图,本实例将软件工程1班和2班创建1-4月份英语成绩不及格人数的统计图。
1. DatasetUtilities类中包含有创建分类数据集的方法为createCategoryDataset (),创建ChartUtil类,编写createDataset()方法,在该方法中设置图表数据,创建一个CategoryDataset对象。其代码如下:
2.创建getJFreeChart()方法,在该方法中根据数据集生成多饼图的JFreeChart对象,并且指明其排序方式为行排列。同样,我们可以使用ChartFactory类提供的createMultiplePieChart3D()创建3D多饼图(createMultiplePieChart()方法创建普通多饼图)。其代码如下:
3.创建createPiePlot(JFreeChart chart)方法,通过修改相应字体来解决乱码问题。其代码如下:
4.创建index.jsp文件用于在网页上显示图表,本实例的运行效果图如图4-17所示,其具体代码参加附录2。
图4-17 3D多饼图实例运行效果图
2.2 柱形图
1.简单柱形图
本实例在MyEclipse新建一个名为BarChart的Java Web项目,使用JFreeChart绘制一个反应软件1班英语成绩情况的简单柱形图。其主要利用DatasetUtilities类提供的createCategoryDataset()方法。
1.创建ChartUtil类,编写getCategoryDataset()方法,在该方法内部创建一个普通柱形图的数据集合。其代码如下:
2.创建getJFreeChart()方法,在该方法中获取数据集,通过数据集创建柱形图的JFreeChart对象。其代码如下:
3.创建updateFont(JFreeChart chart)方法,通过修改相应字体来解决中文乱码问题。其代码如下:
图4-18 简单柱形图实例运行效果图
4.创建index.jsp文件用于在网页上显示图表,本实例的运行效果图如图4-18所示,其具体代码参见附录3。
在JFreeChart的PlotOrientation类定义了HORIZONTAL和VERTICAL的图形显示效果,我们可以采用HORIZONTAL将图表设置成横向的,运行效果如图4-19所示,其具体代码参见附录3。
图4-19 横向柱形图运行效果图
同样的,我们可以用createBarChart3D()方法创建3D柱形图,运行效果图如图4-20所示,其具体代码参见附录3。
图4-20 3D柱形图实例运行效果图
2.多系列3D柱形图
单系列的柱形图只能比较单一分类之间的差异,而使用多系列的柱形图可比较多个分类中的差异以及各个分类之间的不同,本实例创建一个名为3DBarCharts的Web项目,分析软件工程各班级英语的成绩分布,以演示如何绘制多系列柱形图。
1.创建ChartUtil类,编写getCategoryDataset()方法,在该方法内部创建多系列的分类数据集合。其代码如下:
2.创建getJFreeChart()方法,在该方法中获取数据集,通过数据集创建柱形图的JFreeChart对象。其代码如下:
3.创建updateFont(JFreeChart chart)方法,通过修改相应字体来解决中文乱码问题。其代码如下:
4.创建index.jsp文件用于在网页上显示图表,本实例的运行效果图如图4-21所示,其具体代码参见附录4。
图4-21 多系列柱形图实例运行效果图
2.3多分类区域图
普通区域图能根据基础数据在图表中绘制一定的区域,通过图表区域的形状和大小体现数据的变化,但其只能显示一个分类的区域信息,而多分类区域图可以更加清楚地显示出不同分类之间的差别,本实例创建一个名为AreaChart的Web项目,绘制软件工程专业4个班的英语成绩多分类区域图。
1.创建ChartUtil类,编写getCategoryDataset()方法,向DefaultCategoryDataset类的实例中添加数据,生成分类数据集。其代码同4.2.2多系列柱形图步骤1。
2.创建getJFreeChart()方法,在该方法中获取数据集合,再使用ChartFactory类的createAreaChart()方法根据数据集合生成一个JFreeChart对象。其代码同4.2.2多系列柱形图步骤2,只需将其createBarChart3D()方法替换成createAreaChart()方法即可。
3.创建updateFont(JFreeChart chart)方法,通过修改相应字体来解决中文乱码问题,方法同4.2.2多系列柱形图步骤3。
4.编写updatePlot(JFreeChart chart)方法设置多分类区域图的透明度。其代码如下:
5.创建index.jsp文件用于在网页上显示图表,本实例的运行效果图如图4-22所示,其具体代码参见附录4。
图4-22 多分类区域图实例运行效果图
2.4折线图
折线图通过数据的线形走势来体现情况的变化趋势,本实例创建一个名为LineChart的web项目,绘制四种编程语言图书在2016年上半年的销售量的折线图。
1.创建ChartUtil类,编写getCategoryDataset()方法,向DefaultCategoryDataset类的实例中添加数据,生成分类数据集。其代码同4.2.2多系列柱形图步骤1。
2.创建getJFreeChart()方法,在该方法中获取数据集合,再使用ChartFactory类的createLineChart()方法根据数据集合生成一个JFreeChart对象。其代码同4.2.2多系列柱形图步骤2,只需将其createBarChart3D()方法替换成createLineChart()方法即可。
3.创建updateFont(JFreeChart chart)方法,通过修改相应字体来解决中文乱码问题,方法同4.2.2多系列柱形图步骤3。
4.编写updatePlot(JFreeChart chart)方法。在其中
使用LineAndShapeRenderer类的setSeriesStroke()方法可以设置折线图的笔触,加粗需要加粗的折线。
使用LineAndShapeRenderer类的setSeriesShapesVisible()方法可以设置是否显示折线图的节点。
使用LineAndShapeRenderer类的setSeriesPaint()方法可以修改折线图的颜色。
此方法代码如下:
5.创建index.jsp文件用于在网页上显示图表,本实例的运行效果图如图4-23所示,其具体代码参见附录5。
图4-23 折线图实例运行效果图
同样的,我们可以将createLineChart()方法换成createLineChart3D()方法以创建更具立体感的3D折线图,其运行效果图如图4-24所示,其具体代码参见附录5。
图4-24 3D折线图实例运行效果图
2.5 时序图
时序图是一种数据与日期、时间联系非常紧密的图表,常用于金融和财经类的图标绘制,其使用时间轴表示某个分类的进展状况,本实例创建一个名为TimeSeriesChart的web项目,并使用Random()方法来产生随机数以模拟股票价格的走势。
本实例在X轴添加标签数据时应用了DateAxis类,该类的对象用于设置日期时间类型的数据,首先创建SimpleDateFormat对象,然后创建DateTickUnit对象,并将SimpleDateFormat对象作为DateTickUnit的构造方法参数;接下来通过DateAxis类的setTickUnit()方法应用设置日期格式;最后调用XYPlot对象的setDomainAxis()方法设置为图表的X轴刻度值。
1.创建ChartUtil类,编写getDataset()方法。时序图的数据集合TimeSeriesCollection类型,通过TimeSeriesCollection类实例对象的addSeries(TimeSeries timeseries)方法可以向数据集合中添加TimeSeries类型的数据。其代码如下:
2.创建getTimeSeriesChart()方法,在该方法中获取数据集合,再使用ChartFactory类的createTimeSeriesChart()方法根据数据集合生成一个JFreeChart时序图对象。同时设置字体以便于显示中文,其关键代码如下:
3.创建index.jsp文件用于在网页上显示图表,本实例的运行效果图如图4-25所示,其具体代码参见附录6。
图4-25 时序图实例运行效果图
2.6 联合分类图
在实际应用中,常常需要显示两张或者两张以上图表组合而成的图表,即联合分类图,其通过不同的图表展示同一个数据集。本实例创建一个名为CombinedDomainChart的web项目,绘制一个关于2016年上半年几种不同编程语言图书的销量情况的折线图与柱形图的联合分类图。
1.创建ChartUtil类,编写getCategoryDataset()方法,向DefaultCategoryDataset类的实例中添加数据,生成分类数据集。其代码同4.2.2多系列柱形图步骤1。
2.创建getJFreeChart()方法,在该方法中创建LineAndShapeRenderer和BarRenderer实例,然后分别使用这两个实例渲染生成两个Plot,再把这两个Plot添加到CombineDomainCategoryPlot实例中,最后生成JFreeChart对象。代码如下:
3.创建updateFont(JFreeChart chart)方法,通过修改相应字体来解决中文乱码问题,方法同4.2.2多系列柱形图步骤3。
4.创建index.jsp文件用于在网页上显示图表,本实例的运行效果图如图4-26所示,其具体代码参见附录7。
图4-26 联合分类图实例运行效果图
附录1:运行效果图15/16(普通饼图/3D饼图)具体源代码
1. package com.guojiawei.java.jfreechartTest;
2. import org.jfree.chart.ChartFactory;
3. import java.awt.BasicStroke;
4. import java.awt.Color;
5. import java.awt.Font;
6. import org.jfree.chart.JFreeChart;
7. importorg.jfree.chart.labels.StandardPieSectionLabelGenerator;
8. import org.jfree.chart.plot.PiePlot;
9. import org.jfree.chart.title.LegendTitle;
10. import org.jfree.chart.title.TextTitle;
11. importorg.jfree.data.general.DefaultPieDataset;
12. import org.jfree.data.general.PieDataset;
13. public class ChartUtil {
14. privatestatic PieDataset getPieDataset(){
15. //创建一个饼图表的数据集
16. DefaultPieDatasetdataset = new DefaultPieDataset();
17. //向饼图表的数据集添加数据
18. dataset.setValue("优秀(90-100)", 23);
19. dataset.setValue("良好(80-90)",45 );
20. dataset.setValue("中等(70-80)", 34);
21. dataset.setValue("及格(60-70)", 20);
22. dataset.setValue("不及格(60分以下)", 12);
23. returndataset;
24. }
25. publicstatic JFreeChart getJFreeChart(){
26. //获取数据集
27. PieDatasetdataset = getPieDataset();
28. //生成JFreeChart对象
29. JFreeChartchart = ChartFactory.createPieChart("软件1班英语成绩分布图",
30. dataset,true, true, false);
31. //使用createPieChart3D方法创建3D饼图
32. setPiePoltFont(chart);
33. setLegendTitle(chart);
34. setPiePoltNum(chart);
35. createPiePlot(chart);
36. //关闭抗锯齿
37. chart.setAntiAlias(false);
38. returnchart;
39. }
40. publicstatic void setLegendTitle(JFreeChart chart){
41. LegendTitlelegendTitle = chart.getLegend();
42. //设置图示颜色
43. legendTitle.setItemPaint(Color.MAGENTA);
44. }
45. //设置图表字体
46. publicstatic void setPiePoltFont(JFreeChart chart){
47. //图表(饼图)
48. PiePlotpiePlot =(PiePlot)chart.getPlot();
49. //设置图表字体
50. piePlot.setLabelFont(newFont("宋体",Font.PLAIN,14));
51. //标题
52. TextTitletextTitle = chart.getTitle();
53. textTitle.setFont(newFont("宋体",Font.BOLD,22));
54. //图例
55. LegendTitlelegendTitle = chart.getLegend();
56. legendTitle.setItemFont(newFont("宋体",Font.PLAIN,16));
57. }
58. publicstatic void setPiePoltNum(JFreeChart chart){
59. PiePlotpiePlot = (PiePlot)chart.getPlot();
60. piePlot.setLabelGenerator(newStandardPieSectionLabelGenerator("{1}人,占{2}"));
61. }
62. publicstatic void createPiePlot(JFreeChart chart){
63. PiePlotpiePlot = (PiePlot)chart.getPlot();
64. //将饼图的制定分类区域分离,需要分离的分类
65. piePlot.setExplodePercent("优秀(90-100)", 0.1);
66. //加粗边框
67. piePlot.setSectionOutlineStroke("优秀(90-100)",new BasicStroke(3f));
68. }
69. /*创建3DB饼图,此方法设置其透明度
70. publicstatic void createPiePlot(JFreeChart chart){
71. PiePlotpiePlot = (PiePlot)chart.getPlot();
72. piePlot.setForegroundAlpha(0.9f); //设置透明度
73. }
74. */
75. }
附录2:运行效果图17(3D多饼图)具体源代码
1. package com.guojiawei.java.jfreechartTest;
2. import org.jfree.chart.ChartFactory;
3. import java.awt.Font;
4. import org.jfree.chart.JFreeChart;
5. import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
6. importorg.jfree.chart.plot.MultiplePiePlot;
7. import org.jfree.chart.plot.PiePlot;
8. import org.jfree.chart.title.LegendTitle;
9. import org.jfree.chart.title.TextTitle;
10. import org.jfree.data.category.CategoryDataset;
11. importorg.jfree.data.general.DatasetUtilities;
12. import org.jfree.util.TableOrder;
13. public class ChartUtil {
14. privatestatic CategoryDataset createDataset(){
15. double[][] data = new double[][]{
16. {4,5,3,7},
17. {6,8,4,9}
18. };
19. CategoryDatasetdataset = DatasetUtilities.createCategoryDataset(
20. "班级", "月份",data);
21. returndataset;
22. }
23. publicstatic JFreeChart getJFreeChart(){
24. //获取数据集
25. CategoryDatasetdataset = createDataset();
26. //生成JFreeChart对象
27. JFreeChartchart = ChartFactory.createMultiplePieChart3D(
28. "软件工程1-4月份英语成绩不及格人数统计表",
29. dataset,
30. TableOrder.BY_ROW,
31. true,true,false);
32. createPiePlot(chart);
33. returnchart;
34. }
35. publicstatic void createPiePlot(JFreeChart chart){
36. //窗体标题
37. TextTitletextTitle = chart.getTitle();
38. textTitle.setFont(newFont("宋体",Font.BOLD,22));
39. //图例
40. LegendTitlelegendTitle = chart.getLegend();
41. legendTitle.setItemFont(newFont("宋体",Font.PLAIN,16));
42. //获取多饼图
43. MultiplePiePlotmultiplePiePlot = (MultiplePiePlot)chart.getPlot();
44. JFreeChartjFreeChart = multiplePiePlot.getPieChart();
45. //图表标签
46. PiePlotpiePlot =(PiePlot)jFreeChart.getPlot();
47. piePlot.setLabelFont(newFont("宋体",Font.PLAIN,14));
48. piePlot.setLabelGenerator(newStandardPieSectionLabelGenerator("{1}人,占{2}"));
49. //图表标题
50. TextTitletextTitle2 = jFreeChart.getTitle();
51. textTitle2.setFont(newFont("宋体",Font.BOLD,22));
52. }
附录3:运行效果图18/19/20(简单柱形图/3D柱形图)具体源代码
1. package com.guojiawei.java.jfreechartTest;
2. import org.jfree.chart.ChartFactory;
3. import java.awt.Font;
4. import org.jfree.chart.JFreeChart;
5. import org.jfree.chart.axis.CategoryAxis;
6. import org.jfree.chart.axis.ValueAxis;
7. import org.jfree.chart.plot.CategoryPlot;
8. importorg.jfree.chart.plot.PlotOrientation;
9. import org.jfree.chart.title.TextTitle;
10. import org.jfree.data.DefaultKeyedValues;
11. importorg.jfree.data.category.CategoryDataset;
12. importorg.jfree.data.general.DatasetUtilities;