JFreeChart制作数据图表_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JFreeChart制作数据图表

JFreeChart制作数据图表

 2013/11/5 21:36:45  wokao159  程序员俱乐部  我要评论(0)
  • 摘要:JFreeChart项目简介JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的要求。为了减少篇幅本文主要介绍前面三种类型的图表,读者可以触类旁通去开发其他样式的图表。下面几个是JFreeChart产生的这三种类型图表的结果
  • 标签:数据

JFreeChart 项目简介

JFreeChart 是开放源代码站点 SourceForge.net 上的一个 JAVA 项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图 ( 普通柱状图以及堆栈柱状图 )、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的要求。为了减少篇幅本文主要介绍前面三种类型的图表,读者可以触类旁通去开发其他样式的图表。下面几个是 JFreeChart 产生的这三种类型图表的结果:

JFreeChart 使用方法

下载的时候需要注意的是必须下载两个文件:JFreeChart 以及 Jcommon。目前最新配套版本是:JFreeChart 0.9.11 Jcommon 0.8.6

需要注意的是:在使用 Eclipse 开发的时候会报一个莫名其妙的错误,错误可能指向某个类文件的第一行。遇到这样的问题一般是因为没有把 Jcommon 的 jar 包设置到项目的类路径中的缘故。具体的原因不祥。

使用JFreeChart绘图的基本流程:?
1、定义数据源?
2、填充数据?
3、定义JFreeChart实例?
4、设置Chart属性?
5、导出到JPG或实例化一个Frame显示?

基本流程都是一致的,只是画各种不同的图的时候各项设置和各个类有细微差别。?
使用JFreeChart,有几个概念需要理解,?
chart——整个图表,包含一个plot?
plot——图表数据的载体?
dataset——数据集合

?

下面我们来介绍 JFreeChart 中几个核心的对象类:

类名 类的作用以及简单描述 JFreeChart 图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart 引擎本身提供了一个工厂类用于创建不同类型的图表对象 XXXXXDataset 数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类 XXXXXPlot 图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要 Axis、Renderer 以及数据集对象的支持 XXXXXAxis 用于处理图表的两个轴:纵轴和横轴 XXXXXRenderer 负责如何显示一个图表对象 XXXXXURLGenerator 用于生成 Web 图表中每个项目的鼠标点击链接 XXXXXToolTipGenerator 用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类

基本上我认为 JFreeChart 项目本身的类结构的设计并不是很好,首先在创建图表的时候用到了大量的工厂方法,这样做虽然可以简化创建图表对象的代码,但是对项目本身或者开发人员来讲自行扩展一种新的图表都仍然是一件很麻烦的事情;其次除图表对象本身外其余的类过于复杂,使用者必须去了解每个类型的图表对象应该对应哪些 Axis、Plot、Renderer 类,并且必须非常熟悉这些类的构造函数中每个参数的具体含义。这些问题都大大困扰很多初学者。不过,虽然存在很多问题,但是 JFreeChart 本身仍不失为一个非常优秀的图表引擎,况且项目本身也在逐渐的发展中。

在非常简略的介绍了 JFreeChart 本身的代码结构后,下面我们开始动手试验几个常用的图表并把他们放到 web 上。

?

?

JFreeChart 实例

1 柱状图

class="displaycode"> package lius.chart.demo; 
 import java.io.*; 
 import org.jfree.data.*; 
 import org.jfree.chart.*; 
 import org.jfree.chart.plot.*; 
 /** 
 * 该类用于演示最简单的柱状图生成
 * @author Winter Lau 
 */ 
 public class BarChartDemo { 
     public static void main(String[] args) throws IOException{ 
         CategoryDataset dataset = getDataSet2(); 
         JFreeChart chart = ChartFactory.createBarChart3D( 
                            "水果产量图", // 图表标题
                            "水果", // 目录轴的显示标签
                            "产量", // 数值轴的显示标签
                             dataset, // 数据集
                             PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                             true,  // 是否显示图例(对于简单的柱状图必须是 false)
                             false, // 是否生成工具
                             false  // 是否生成 URL 链接
                             ); 
                            
         FileOutputStream fos_jpg = null; 
         try { 
             fos_jpg = new FileOutputStream("D:\\fruit.jpg"); 
             ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); 
         } finally { 
             try { 
                 fos_jpg.close(); 
             } catch (Exception e) {} 
         } 
     } 
     /** 
     * 获取一个演示用的简单数据集对象
     * @return 
     */ 
     private static CategoryDataset getDataSet() { 
         DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
         dataset.addValue(100, null, "苹果"); 
         dataset.addValue(200, null, "梨子"); 
         dataset.addValue(300, null, "葡萄"); 
         dataset.addValue(400, null, "香蕉"); 
         dataset.addValue(500, null, "荔枝"); 
         return dataset; 
     } 
     /** 
     * 获取一个演示用的组合数据集对象
     * @return 
     */ 
     private static CategoryDataset getDataSet2() { 
         DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
         dataset.addValue(100, "北京", "苹果"); 
         dataset.addValue(100, "上海", "苹果"); 
         dataset.addValue(100, "广州", "苹果"); 
         dataset.addValue(200, "北京", "梨子"); 
         dataset.addValue(200, "上海", "梨子"); 
         dataset.addValue(200, "广州", "梨子"); 
         dataset.addValue(300, "北京", "葡萄"); 
         dataset.addValue(300, "上海", "葡萄"); 
         dataset.addValue(300, "广州", "葡萄"); 
         dataset.addValue(400, "北京", "香蕉"); 
         dataset.addValue(400, "上海", "香蕉"); 
         dataset.addValue(400, "广州", "香蕉"); 
         dataset.addValue(500, "北京", "荔枝"); 
         dataset.addValue(500, "上海", "荔枝"); 
         dataset.addValue(500, "广州", "荔枝"); 
         return dataset; 
     } 
 } 

?

程序运行结束后生成的图片文件效果如下图所示:

?

如果是使用简单的数据即使用 getDataSet 方法获取数据集时产生的图片文件如下:

?

2 饼图

对于饼图而言,数据集的获取用的不是同一个数据集类,另外饼图不支持同一个类别的项目中还有子项目这样的数据。我们只给出创建饼图的代码,至于写图表到一个文件则与柱状图一致,无需重复。

 package lius.chart.demo; 
 import java.io.*; 
 import org.jfree.data.*; 
 import org.jfree.chart.*; 
 /** 
 * 用于演示饼图的生成
 * @author Winter Lau 
 */ 
 public class PieChartDemo { 
	 public static void main(String[] args) throws IOException{ 
		 DefaultPieDataset data = getDataSet(); 
		 JFreeChart chart = ChartFactory.createPie3DChart("水果产量图",  // 图表标题
		 data, 
		 true, // 是否显示图例
		 false, 
		 false 
		 ); 
		 // 写图表对象到文件,参照柱状图生成源码
	 } 
	 /** 
	 * 获取一个演示用的简单数据集对象
	 * @return 
	 */ 
	 private static DefaultPieDataset getDataSet() { 
		 DefaultPieDataset dataset = new DefaultPieDataset(); 
		 dataset.setValue("苹果",100); 
		 dataset.setValue("梨子",200); 
		 dataset.setValue("葡萄",300); 
		 dataset.setValue("香蕉",400); 
		 dataset.setValue("荔枝",500); 
		 return dataset; 
	 } 
 } 

?

生成的饼图文件效果如下:

?

?

将生成的图表移到浏览器上

为了将生成的图表直接传给客户端浏览器,只需要将前面两个例子中的文件流换成是通过 HttpServletResponse 对象获取到的输出流,详细代码清单如下:

 package lius.chart.demo; 
 import java.io.IOException; 
 import javax.servlet.*; 
 import javax.servlet.http.HttpServlet; 
 import org.jfree.data.*; 
 import org.jfree.chart.*; 
 /** 
 * 演示通过 servlet 直接输出图表
 * @author Winter Lau 
 */ 
 public class ChartDemoServlet extends HttpServlet { 
	 public void service(ServletRequest req, ServletResponse res) 
		 throws ServletException, IOException 
	 { 
		 res.setContentType("image/jpeg"); 
		 DefaultPieDataset data = getDataSet(); 
		 JFreeChart chart = ChartFactory.createPie3DChart("水果产量图", 
		 data, 
		 true, 
		 false, 
		 false 
		 ); 
				
		 ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 
			 100,chart,400,300,null); 
	 } 
	 /** 
	 * 获取一个演示用的简单数据集对象
	 * @return 
	 */ 
	 private static DefaultPieDataset getDataSet() { 
		 DefaultPieDataset dataset = new DefaultPieDataset(); 
		 dataset.setValue("苹果",100); 
		 dataset.setValue("梨子",200); 
		 dataset.setValue("葡萄",300); 
		 dataset.setValue("香蕉",400); 
		 dataset.setValue("荔枝",500); 
		 return dataset; 
	 } 
 } 

?

?

?

发表评论
用户名: 匿名