之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了。这里使用Jfreechart实现这些统计图的绘制。首先看一下Jfreechart的基本用法,只有知道了它的基本用法才有可能实现对更为复杂的统计图的绘制。

这里主要使用了它的三种绘制方式,绘制饼图、折线图和柱状图

源代码地址:https://github.com/kdyzm/day74_jfreechartDemo

一、准备工作

  首先去官网下载相关jar包:http://www.jfree.org/jfreechart/download.html

  实际下载地址:http://sourceforge.net/projects/jfreechart/files/

  这里我使用了1.0.14版本的。

  解压jar包之后在lib目录下找到以下三个jar包添加到classpath:

 

  然后就能进行下一步了。

二、饼状图的生成

  1.定义统计图的标题

String title="各大公司Java EE AS 市场占有率调查";

  2.创建数据源,JFreechart使用DefaultPieDataset对象封装所有需要统计的数据。

 DefaultPieDataset dpd=new DefaultPieDataset();
dpd.setValue("IBM", 25);
dpd.setValue("Oracle", 25);
dpd.setValue("JBoss", 25);
dpd.setValue("用友", 25);

  3.使用最简单的绘图方式创建JFreechart对象

JFreeChart chart=ChartFactory.createPieChart(title, dpd, true, false, false);

  很明显参数1是标题,参数2是数据源,参数三是legend(图例),即是否显示图例,所谓图例就是对统计图中的不同部分加以说明的部分。

  4.最后保存到文件

ChartUtilities.saveChartAsJPEG(new File("D://a.jpg"), chart, 800, 500);

  使用ChartUtilities保存到文件,800是宽度,500是长度。

  5.到D盘下查看生成的结果(a.jpg):

  

  我们发现中文的部分全部变成乱码了。统计图中有三处乱码,这三处乱码应当分别给予解决,但是解决方法是一模一样的,那就是设置中文字体,在jfreechart中所有乱码都是没有设置好字引起的。

  6.解决中文乱码

  JFreechart中的统计图可以大致分为两部分,一部分是绘图区(plot),另一部分是非绘图区(有点废话),绘图区很明显就是图中的圆形盘子,而非绘图区就包括了title、legend等部分。

    (1)解决绘图区乱码问题,首先获取绘图区对象,然后设置标签为中文字体即可。

PiePlot plot = (PiePlot)chart.getPlot();
plot.setLabelFont(new Font("宋体",Font.BOLD,15));

    (2)非绘图区中文乱码问题

      解决title中文乱码:

chart.getTitle().setFont(new Font("宋体", Font.BOLD, 30));

      解决legend中文乱码

chart.getLegend().setItemFont(new Font("微软雅黑", Font.PLAIN, 15));

    注意设置字体一定要在ChartUtilities.saveChartAsJPEG方法之前,否则肯定是没有效果的。

    解决完成中文乱码问题之后效果:

   

   虽然问题是解决了,但是要注意,一旦使用中文字体之后生成统计图的速度就会降低很多,这大概和程序需要获取系统字体有关系吧。

  7.设置3D效果,设置3D效果非常简单只需要讲之前的createPieChart方法替换成为createPieChart3D方法即可。

    

    当然这个效果比较难看,是因为没有设置透明度的问题,设置透明度

plot.setForegroundAlpha(0.7F);

    

    这样就显得有立体效果了。

  8.定制绘图区标签,绘图区标签只是显示了公司的名称,但是并没有将各个公司所占的份额和百分比显示出来,我们大多数还想知道总数是多少等等,这就需要我们定制标签了。

plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}/{1}/{2}/{3}"));

  通过向StandardPieSectionLabelGenerator类的构造方法传入一个字符串,我们可以定制标签的内容,这里设置的{}参数只有四种:

    {0},标签名称

    {1},实际的数量

    {2},占的百分比

    {3},总的数量

    如果超出了这个范围,则直接不给解析如果加上了{4},则直接打印{4}

  

  9.其余效果

    (1)设置图表区和绘图区背景,这个使用的不多

 //设置图表区背景
chart.setBackgroundImage(ImageIO.read(new File("C:/Users/kdyzm/Pictures/IA.full.1795695.jpg")));
//设置绘图区背景
plot.setBackgroundImage(ImageIO.read(new File("C:/Users/kdyzm/Pictures/IA.full.1787513.jpg")));

    (2)设置分裂效果

plot.setExplodePercent("IBM", 0.3D);
plot.setExplodePercent("Oracle", 0.1D);

  10.完整代码

 package com.kdyzm.test.pie;

 import java.awt.Font;
import java.io.File; import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset; /**
* 测试饼状图的生成
* @author kdyzm
*
* 需要注意的一点就是为了解决中文乱码问题,一定要在将流写入文件之前设置字体。
*
*/
public class TestPie {
public static void main(String[] args) throws Exception {
String title="各大公司Java EE AS 市场占有率调查";
DefaultPieDataset dpd=new DefaultPieDataset();
dpd.setValue("IBM", 25);
dpd.setValue("Oracle", 25);
dpd.setValue("JBoss", 25);
dpd.setValue("用友", 25); //使用最简单的绘图方式
JFreeChart chart=ChartFactory.createPieChart3D(title, dpd, true, false, false);
//解决标题中文乱码问题
chart.getTitle().setFont(new Font("宋体", Font.BOLD, 30));
//解决底部bar中中文乱码问题
chart.getLegend().setItemFont(new Font("微软雅黑", Font.PLAIN, 15));
PiePlot plot = (PiePlot)chart.getPlot();
// plot.setExplodePercent("IBM", 0.3D);
// plot.setExplodePercent("Oracle", 0.1D);
plot.setLabelFont(new Font("宋体",Font.BOLD,15));
plot.setForegroundAlpha(0.3F);
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}/{1}/{2}/{3}"));
//绘图区
/**
* 这里设置的{}参数只有四种
* {0},标签名称
* {1},实际的数量
* {2},占的百分比
* {3},总的数量
* 如果超出了这个范围,则直接不给解析如果加上了{4},则直接打印{4}
*/
// //设置图表区背景
// chart.setBackgroundImage(ImageIO.read(new File("C:/Users/kdyzm/Pictures/IA.full.1795695.jpg")));
// //设置绘图区背景
// plot.setBackgroundImage(ImageIO.read(new File("C:/Users/kdyzm/Pictures/IA.full.1787513.jpg"))); //设置分裂效果
ChartUtilities.saveChartAsJPEG(new File("D://a.jpg"), chart, 800, 500);
//解决每个扇形区域中中文乱码问题
System.out.println("打印完成!");
}
}

三、柱状统计图的实现

  有了之前的饼状图的实现,再学习柱状统计图的实现就简单了很多,虽然有很多地方不一样,但是解决思路却是有很多相似之处。

package com.kdyzm.test.bar;

import java.awt.Font;
import java.io.File; import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset; /**
* 测试柱状图的生成
* @author kdyzm
*
*/
public class BarTest {
public static void main(String[] args) throws Exception {
//提供数据集合
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
dataset.addValue(100,"IBM", "第一季度");
dataset.addValue(103,"Oracle", "第一季度");
dataset.addValue(1000,"JBoss", "第一季度");
dataset.addValue(208,"用友", "第一季度"); dataset.addValue(2477,"IBM", "第二季度");
dataset.addValue(2343,"Oracle", "第二季度");
dataset.addValue(987,"JBoss", "第二季度");
dataset.addValue(3473,"用友", "第二季度"); dataset.addValue(1890,"IBM", "第三季度");
dataset.addValue(2980,"Oracle", "第三季度");
dataset.addValue(3889,"JBoss", "第三季度");
dataset.addValue(2890,"用友", "第三季度"); dataset.addValue(2347,"IBM", "第四季度");
dataset.addValue(1340,"Oracle", "第四季度");
dataset.addValue(2340,"JBoss", "第四季度");
dataset.addValue(3000,"用友", "第四季度"); //生成图表的进程
String title="一年之中各大公司Java EE AS销售统计";
JFreeChart chart=ChartFactory.createBarChart3D(title, "季度", "销量(万台)", dataset, PlotOrientation.VERTICAL, true, false, false); //集中解决中文乱码问题
chart.getTitle().setFont(new Font("微软雅黑", Font.BOLD, 30));
//设置底部bar中的字体样式
chart.getLegend().setItemFont(new Font("微软雅黑", Font.ITALIC, 20)); CategoryPlot categoryPlot=chart.getCategoryPlot();
//设置横坐标字体的样式
categoryPlot.getDomainAxis().setLabelFont(new Font("微软雅黑", Font.PLAIN, 15));
//设置横坐标小字体标题的样式
categoryPlot.getDomainAxis().setTickLabelFont(new Font("微软雅黑",Font.PLAIN,14)); //设置纵坐标标题的字体样式
categoryPlot.getRangeAxis().setLabelFont(new Font("微软雅黑",Font.PLAIN,15));
//设置前景色透明度
categoryPlot.setForegroundAlpha(0.7F); ChartUtilities.saveChartAsJPEG(new File("d:/bar.jpg"), chart, 800, 500);
System.out.println("图表生成完毕");
}
}

  效果图:

  代码说明:

    和饼状统计图相比生成柱状统计图有几处不一样的地方

    1.创建JFreechart对象对象使用的方法不一样了

JFreeChart chart=ChartFactory.createBarChart3D(title, "季度", "销量(万台)", dataset, PlotOrientation.VERTICAL, true, false, false);

    这里季度是横坐标上的说明,销量(万台)是纵坐标上的说明,PlotOrientation.VERTICAL指定了绘图区的方向为垂直方向。

    2.数据源的数据结果不相同,使用DefaultCategoryDataset类进行的数据封装。添加数据的方式变成了

dataset.addValue(100,"IBM", "第一季度");

    第一个参数是数量,第二个参数是名称,第三个参数是“组号”,虽然API上给出的是“columnKey”,但是完全不明所以,从效果上来看确实是“组号”

    3.解决中文乱码的地方需要改变。

    非绘图区的title和legend解决乱码的方式不变,需要改变的是绘图区的乱码解决方式。在JFreechart中横坐标的名称叫做domain,做坐标的名称叫做range,通过CategoryPlot(其实也是Plot)获取横纵坐标对象从而设置字体是解决中文乱码的方式。

CategoryPlot categoryPlot=chart.getCategoryPlot();
//设置横坐标字体的样式
categoryPlot.getDomainAxis().setLabelFont(new Font("微软雅黑", Font.PLAIN, 15));
//设置横坐标小字体标题的样式
categoryPlot.getDomainAxis().setTickLabelFont(new Font("微软雅黑",Font.PLAIN,14)); //设置纵坐标标题的字体样式
categoryPlot.getRangeAxis().setLabelFont(new Font("微软雅黑",Font.PLAIN,15));

    所谓小标题的字体样式指的就是"第一季度"、"第二季度"这样的"组标题"。

四、折线统计图的实现

  折线统计图的实现和柱状统计图的实现几乎完全相同,只需要将创建柱状统计图的方法改变成为创建折线统计图的方法即可。

package com.kdyzm.test.bar;

import java.awt.Font;
import java.io.File; import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset; /**
* 测试柱状图的生成
* @author kdyzm
*
*/
public class BarTest {
public static void main(String[] args) throws Exception {
//提供数据集合
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
dataset.addValue(100,"IBM", "第一季度");
dataset.addValue(103,"Oracle", "第一季度");
dataset.addValue(1000,"JBoss", "第一季度");
dataset.addValue(208,"用友", "第一季度"); dataset.addValue(2477,"IBM", "第二季度");
dataset.addValue(2343,"Oracle", "第二季度");
dataset.addValue(987,"JBoss", "第二季度");
dataset.addValue(3473,"用友", "第二季度"); dataset.addValue(1890,"IBM", "第三季度");
dataset.addValue(2980,"Oracle", "第三季度");
dataset.addValue(3889,"JBoss", "第三季度");
dataset.addValue(2890,"用友", "第三季度"); dataset.addValue(2347,"IBM", "第四季度");
dataset.addValue(1340,"Oracle", "第四季度");
dataset.addValue(2340,"JBoss", "第四季度");
dataset.addValue(3000,"用友", "第四季度"); //生成图表的进程
String title="一年之中各大公司Java EE AS销售统计";
JFreeChart chart=ChartFactory.createLineChart(title, "季度", "销量(万台)", dataset, PlotOrientation.VERTICAL, true, false, false); //集中解决中文乱码问题
chart.getTitle().setFont(new Font("微软雅黑", Font.BOLD, 30));
//设置底部bar中的字体样式
chart.getLegend().setItemFont(new Font("微软雅黑", Font.ITALIC, 20)); CategoryPlot categoryPlot=chart.getCategoryPlot();
//设置横坐标字体的样式
categoryPlot.getDomainAxis().setLabelFont(new Font("微软雅黑", Font.PLAIN, 15));
//设置横坐标小字体标题的样式
categoryPlot.getDomainAxis().setTickLabelFont(new Font("微软雅黑",Font.PLAIN,14)); //设置纵坐标标题的字体样式
categoryPlot.getRangeAxis().setLabelFont(new Font("微软雅黑",Font.PLAIN,15)); ChartUtilities.saveChartAsJPEG(new File("d:/bar.jpg"), chart, 800, 500);
System.out.println("图表生成完毕");
}
}

效果图如下:

  

    线条不够明显,解决方法就是加粗线条。

 LineAndShapeRenderer renderer=(LineAndShapeRenderer) categoryPlot.getRenderer();
renderer.setSeriesStroke(0, new BasicStroke(3F));
renderer.setSeriesStroke(1, new BasicStroke(3F));
renderer.setSeriesStroke(2, new BasicStroke(3F));
renderer.setSeriesStroke(3, new BasicStroke(3F));

    加粗线条之后的效果图:

   

    试试3D效果:设置3D效果之后设置线条粗细就无效了。

JFreeChart chart=ChartFactory.createLineChart3D(title, "季度", "销量(万台)", dataset, PlotOrientation.VERTICAL, true, false, false);

    

    这是设置了前景色透明度为0.8的效果。

categoryPlot.setForegroundAlpha(0.8F);

    实现的完整代码:

 package com.kdyzm.test.appline;

 import java.awt.BasicStroke;
import java.awt.Font;
import java.io.File; import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
/**
* 折线图的生成方式和柱状图的生成方式几乎没有区别,但是最好设置一下线条的粗细,否则很难看
* @author kdyzm
*
*/
public class AppLine {
public static void main(String[] args) throws Exception {
//提供数据集合
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
dataset.addValue(100,"IBM", "第一季度");
dataset.addValue(103,"Oracle", "第一季度");
dataset.addValue(1000,"JBoss", "第一季度");
dataset.addValue(208,"用友", "第一季度"); dataset.addValue(2477,"IBM", "第二季度");
dataset.addValue(2343,"Oracle", "第二季度");
dataset.addValue(987,"JBoss", "第二季度");
dataset.addValue(3473,"用友", "第二季度"); dataset.addValue(1890,"IBM", "第三季度");
dataset.addValue(2980,"Oracle", "第三季度");
dataset.addValue(3889,"JBoss", "第三季度");
dataset.addValue(2890,"用友", "第三季度"); dataset.addValue(2347,"IBM", "第四季度");
dataset.addValue(1340,"Oracle", "第四季度");
dataset.addValue(2340,"JBoss", "第四季度");
dataset.addValue(3000,"用友", "第四季度"); //生成图表的进程
String title="一年之中各大公司Java EE AS销售统计";
JFreeChart chart=ChartFactory.createLineChart3D(title, "季度", "销量(万台)", dataset, PlotOrientation.VERTICAL, true, false, false); //集中解决中文乱码问题
chart.getTitle().setFont(new Font("微软雅黑", Font.BOLD, 30));
//设置底部bar中的字体样式
chart.getLegend().setItemFont(new Font("微软雅黑", Font.ITALIC, 14));
CategoryPlot categoryPlot=chart.getCategoryPlot();
//设置横坐标字体的样式
categoryPlot.getDomainAxis().setLabelFont(new Font("微软雅黑", Font.PLAIN, 15));
//设置横坐标小字体标题的样式
categoryPlot.getDomainAxis().setTickLabelFont(new Font("微软雅黑",Font.PLAIN,14)); //设置纵坐标标题的字体样式
categoryPlot.getRangeAxis().setLabelFont(new Font("微软雅黑",Font.PLAIN,15));
//设置前景色透明度
categoryPlot.setForegroundAlpha(0.8F); //设置折线粗细
/*LineAndShapeRenderer renderer=(LineAndShapeRenderer) categoryPlot.getRenderer();
renderer.setSeriesStroke(0, new BasicStroke(3F));
renderer.setSeriesStroke(1, new BasicStroke(3F));
renderer.setSeriesStroke(2, new BasicStroke(3F));
renderer.setSeriesStroke(3, new BasicStroke(3F));*/ ChartUtilities.saveChartAsJPEG(new File("d:/appLine.jpg"), chart, 800, 500);
System.out.println("折线图表生成完毕");
}
}

【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】的更多相关文章

  1. 【Java EE 学习 74 下】【数据采集系统第六天】【使用Jfreechart的统计图实现】【将JFreechart整合到项目中】

    之前说了JFreechart的基本使用方法,包括生成饼图.柱状统计图和折线统计图的方法.现在需要将其整合到数据采集系统中根据调查结果生成三种不同的统计图. 一.统计模型的分析和设计 实现统计图显示的流 ...

  2. 【Java EE 学习 80 上】【WebService】

    一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...

  3. 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】

    一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...

  4. 【Java EE 学习 25 上】【网上图书商城项目实战】

    一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理 ...

  5. 【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】

    一.需求分析 调查问卷中或许每一个单击动作都会引发大量的数据库访问,特别是在参与调查的过程中,只是单击“上一页”或者“下一页”的按钮就会引发大量的查询,必须对这种问题进行优化才行.使用缓存策略进行查询 ...

  6. 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】

    一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...

  7. 【Java EE 学习 76 上】【数据采集系统第八天】【角色授权】【用户授权】【权限的粗粒度控制】【权限的细粒度控制】

    一.角色管理 单击导航栏上的"角色管理"超链接,跳转到角色管理界面,在该界面上显示所有角色,并提供角色的增加和删除.修改超链接. 1.增加新角色(角色授权) 流程:单击增加新角色超 ...

  8. 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】

    增加logo的技术点:文件上传,国际化 文件上传的功能在struts2中是使用文件上传拦截器完成的. 1.首先需要在页面上添加一个文件上传的超链接. 点击该超链接能够跳转到文件上传页面.我给该表单页面 ...

  9. 【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】

    一.权限计算相关分析 1.如何存储权限 首先说一下权限保存的问题,一个系统中最多有多少权限呢?一个大的系统中可能有成百上千个权限需要管理.怎么保存这么多的权限?首先,我们使用一个数字中的一位保存一种权 ...

随机推荐

  1. wpf 异常处理和关闭进程

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  2. Python Day11

    RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  3. SharePoint Online 申请试用链接地址

    SharePoint Online 申请试用链接地址: https://products.office.com/en-us/business/compare-office-365-for-busine ...

  4. PHP基础之PDO

    简介 PDO(PHP Data Object)是指PHP数据对象,它定义了一个轻量级的一致接口来统一操作各种数据库.PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方 ...

  5. GetViewUrl

    <f:TemplateField HeaderText="名称" ColumnID="Name" ExpandUnusedSpace="true ...

  6. 扩展 jquery miniui 组件实现自动查询数据

    主题 之前写过一篇文章分享了公司basecode查找数据后台是怎么实现的(http://www.cnblogs.com/abcwt112/p/6085335.html).今天想分享一下公司前台是怎么扩 ...

  7. 如何保存gnome的linux的 会话?相当于windows下的休眠?

    在关机前, 你进行的所有操作, 的集合, 就叫做你跟 linux系统 机器间的 一次 会话, 一个session. linux 可以 在关机时保存 这些session, 保存这些打开的窗口 和程序. ...

  8. 使用xib封装一个view的步骤

    1.新建一个xib文件描述一个view的内部结构(假设叫做SSTgCell.xib) 2.新建一个自定义的类 (自定义类需要继承自系统自带的view, 继承自哪个类,  取决于xib根对象的Class ...

  9. db2、Oracle存储过程引号用法

      在存储过程中,单引号有两个作用,一是字符串是由单引号引用,二是转义.单引号的使用是就近配对,即就近原则.而在单引号充当转义角色时相对不好理解     1.从第二个单引号开始被视为转义符,如果第二个 ...

  10. MPMoviePlayerViewController

    MPMoviePlayerViewController        注意:需要添加MediaPlayer.framework    带有视频播放器的控制器(能够播放mp3.mp4.avi.mov格式 ...