• 1. 动态图表JFreeChart金晓杰 日期:2012-08
  • 2. 1页简介 JFreeChart是Java中开源的制图组件,主要用于生成各种动态图表。在Java的图形报表技术中,JFreeChart组件提供了方便、快捷、灵活的制图方法。 作为一个功能强大的图形报表组件,JFreeChart为Java的图形报表技术提供了解决方案。在Java项目的应用中,JFreeChart组件几乎可以满足目前图形报表的所有需求。 JFreeChart组件可以生成各种各样的图形报表,如常用的柱形图、区域图、饼形图、折线图、时序图、甘特图等;而对于同一种类型的图表,JFreeChart组件还提供了不同的表现方式。
  • 3. 2页JFreeChart的下载与使用 JFreeChart是开放源代码的图形报表组件(开源站点SourceForge.net上的一个Jave项目),其主页为http://www.jfree.org/jfreechart/index.html。
  • 4. 3页 JFreeChart 的主要类和接口1、JFreeChart 类 在生成图形报表时,制图对象JFreeChart是必不可少的对象,它可以直接通过new关键字进行实例化,也可以通过制图工厂ChartFactory类进行实例化。当使用new关键字进行实例化时,需要设置大量的属性信息,因为JFreeChart组件提供的图表种类很多,对于每一种图表都要进行特殊的设置,非常繁琐。因此在使用过程中,一般都使用制图工厂ChartFactory类进行创建。 2、ChartFactory 类 制图工厂ChartFactory是一个抽象类,它不能被实例化,但提供了创建各种制图对象的方法,如创建柱形图对象、区域图对象、饼形图对象、折线图对象等方法,这些方法都是静态的方法,可直接创建JFreeChart对象,并且是属于某一种具体的图表类型的JFreeChart对象,使用非常方便。
  • 5. 4页ChartFactory常用方法及说明如下:图 表 类 型方 法说 明柱形图public static JFreeChart createBarChart()创建一个常规的柱形图对象public static JFreeChart createBarChart3D()创建一个3D效果的柱形图对象饼形图public static JFreeChart createPieChart()创建一个常规的饼形图对象public static JFreeChart createPieChart3D()创建一个3D效果的饼形图对象折线图public static JFreeChart createLineChart()创建一个常规的折线图对象public static JFreeChart reateLineChart3D()创建一个3D效果的折线图对象
  • 6. 5页 JFreeChart 的主要类和接口3、XXXXXDataset 数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类。常用的数据集对象有:柱状图数据集对象 DefaultCategoryDataset、饼图数据集对象DefauldPieDataset和曲线图数据集对象 DefaultTableXYDataset 。 4、XXXXXPlot 图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持。常用的Plot对象有:柱状图CategoryPlot、饼图PiePlot和曲线图XYPlot。 5、XXXXXAxis 用于处理图表的两个轴:纵轴和横轴。常用的有NumberAxis数据轴,DateAxis日期轴。
  • 7. 8页 JFreeChart 的主要类和接口6、 XXXXXRenderer 负责如何显示一个图表对象。常用的Renderer有DefaultCategoryItemRenderer 柱状图显示器StandardXYItemRenderer曲线图显示器。饼图的Renderer 7、XXXXXURLGenerator 用于生成Web图表中每个项目的鼠标点击链接。常用的URLCenerator有StandardCategoryURLGenerator 、StandardPieURLGenerator StandardXYURLGenerator 8、ChartUtilities 图表工具类,用于输出各种图表 writeChartAsPNG(params…) writeChartAsJPEG(params…) saveChartAsPNG(params…) saveChartAsJPEG(params…)
  • 8. 9页JfreeChart中的常见包 org.jfree.chart.servlet.DisplayChart 这个包中的DisplayChart继承自Httpservlet 用于处理显示图象。 org.jfree.chart.servlet.ServletUtilities 这个包中的ServletUtilitie类有一系列方法,例如,saveChartAs*;saveChartAs*是把图表按照不同的形式存储为图象;sendTempFile方法被重载了很多 次,用于把文件流发送response。
  • 9. 10页JfreeChart中的常见包org.jfree.chart 这个包包含JfreeChart类库中主要的类和接口 org.jfree.chart.axis 这个包包含所有轴有关的类和接口: a.CategoryPlot 和 XYPlot 操作两个轴(默认),我们叫他们domain轴和range轴。这些专用名词是建立这些地图可视化地把domain轴的值映射到value轴上的概念之上。 效果上,domain轴作为x轴,range作为y轴,但我们更热衷与专用名词 b.轴类提供的默认设置基本适合大多数程序的需要,但是,有很多通过JFreeChartAPI改变属性来定制轴的特性。一定要通过读API来熟悉可以定制的选项。 c.JFreeChart的一个更强大的功能是同一个Chart可以提供多个domain轴和多个value轴 轴类是可克隆和可串行化的。
  • 10. 11页
  • 11. 12页
  • 12. 13页
  • 13. 14页创建数据集(DefaultCategoryDataset) 创建JFreeChart 设置属性 图形输出开发流程
  • 14. 15页1.饼图饼状图是图形报表中最为简单和基础的图形,它又是jfreechart中封装最为好的报表,有很多接口和方法专门为它设计,所以饼状图是学习jfreechart首先的,同时也是非常重要的
  • 15. 18页 PieDataset(接口):用于生成圆饼图的数据集类型 DefaultPieDataset:实现PieDataset接口,并用于绘制圆饼图的必需数据集,它主要用于存储一些手动添加的数据集 defaultpiedataset.setValue(key, value) 用于向数据集中添加数据 key:一般为该数据的来源名称 value:一般为double类型的数据 Pie 所用的数据集:
  • 16. 17页Pie chart 常用类介绍JFreeChart 具体的图表类,可由ChartFactory创建不同的图表对象 通过该类提供的方法可以对JFreeChart对象图片标题字体、背景图片、背景颜色、边框等进行设置。 ChartFactory 图表工厂,用于创建各种图表(JFreeChart)对象 普通效果的饼状图: ChartFactory.createPieChart() 3D 效果的饼状图: ChartFactory.createPieChart3D()方 法说 明public void setAntiAlias(boolean flag)设置字体模糊边界public void setBackgroundImage(Image image)设置背景图片public void setBackgroundImageAlignment(int alignment)设置背景图片对齐方式,其参数常量定义在Align类中public void setBackgroundImageAlpha(float alpha)设置背景图片透明度public void setBackgroundPaint(Paint paint)设置背景颜色public void setBorderPaint(Paint paint)设置边界线条颜色public void setBorderVisible(boolean visible)设置边界线条是否可见
  • 17. 21页Plot(接口)plot.setBackgroundAlpha(0.5F);//设置透明度 plot.setBackgroundPaint(Color.blue);//设置背景色 plot.setCircular(false);//指定显示的饼图上圆形(false)还椭圆形(true) plot.setLabelFont(new Font("宋体", 0, 12)); //设置分类标签字体 plot.setLabelGap(0.09D); //设置字体间的距离 plot.setExplodePercent("JavaSE", 0.5D); //把XXX(JavaSE)这个数据块 分离出来 plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({2} percent)")); //设显示值的样式,{0}表示 data的KEY {1}表示:value ;{2}表示站圆饼的百分比
  • 18. 22页2 、柱状图
  • 19. 23页2.1得到并填充结果集addValue方法 用來設置默認結果集中值 对象.addValue(参数1,参数2,参数3); 对象.addValue(参数1,参数2,参数3); 对象.addValue(参数1,参数2,参数3); 对象.addValue(参数1,参数2,参数3); 对象.addValue(参数1,参数2,参数3);dataset.addValue(1, "First", "Category 1"); dataset.addValue(5, "second", "Category 2"); dataset.addValue(3, "three", "Category 3"); dataset.addValue(4, "four", "Category 4"); 得到默認結果集的類 往結果集中添加值DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  • 20. 24页2.2 得到Chart工厂(ChartFactory)chart工厂类方法 方法名:createBarChart 参数:title, 横坐标, 纵坐标, 数据集, PlotOrientation (垂直显示), legend, tooltips, urlsJFreeChart chart = ChartFactory.createBarChart(标题,横坐标,纵坐标,数据集,显示方向,legend, tooltips, urls);JFreeChart chart = ChartFactory.createBarChart("xin", "Categry", "Value", getDataset(), PlotOrientation.VERTICAL, true, true, true);
  • 21. 25页2.3、属性JFreeChart chart = ChartFactory.createBarChart("统计", "Categry", "Value", getDataset(), PlotOrientation.VERTICAL, true, true, true); CategoryPlot是Plot类的子类,类主要用于描述CategoryDataset数据集合类型的图表,它支持折线图、区域图等,其常用方法及说明: CategoryPlot cgplot = chart.getCategoryPlot(); //设置图表显示背景 cgplot.setBackgroundPaint(Color.blue); //横坐标网格线红色 cgplot.setDomainGridlinePaint(Color.red); //显示为可见 cgplot.setDomainGridlinesVisible(true); //纵坐标网格线红色 cgplot.setRangeGridlinePaint(Color.red); //设置横坐标与纵坐标的显示位置; cgplot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); cgplot.setRangeAxisLocation(AxisLocation.TOP_OR_RIGHT);
  • 22. 26页2.3属性(CateGory和ValueAxis)CategoryAxis类是Axis类的子类,主要用于对分类轴的相关属性进行设置,其常用方法及说明: CategoryPlot cgplot = chart.getCategoryPlot(); //取得横轴 CategoryAxis cAxis = cgplot.getDomainAxis(); // 设置距离图片左、右端距离 cAxis.setLowerMargin(0.05); //距左端的距离 cAxis.setUpperMargin(0.1); //距右端的距离 //设置横柱上Label倾斜45度 cAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); //设置字体 cAxis.setLabelFont(new Font("宋体",Font.BOLD,12)); cAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); cgplot.setDomainAxis(cAxis ); ValueAxis类是Axis类的子类,也是NumberAxis类与DateAxis类的父类,主要用于对数据轴的相关属性进行设置,其常用方法及说明 ValueAxis rangeAxis = plot.getRangeAxis(); //设置最高的一个柱与图片顶端的距离 rangeAxis.setUpperMargin(0.15); //设置最低的一个柱与图片底端的距离 rangeAxis.setLowerMargin(0.15); Cgplot .setRangeAxis(rangeAxis);
  • 23. 27页2.4属性(NumberAxis)NumberAxis类是ValueAxis类的子类,主要用于对数值类型数据轴的相关属性进行设置,其常用方法及说明: //取得纵轴 NumberAxis nAxis = (NumberAxis) cPlot.getRangeAxis(); //设置横轴标签字体 nAxis.setLabelFont(new Font("宋体",Font.BOLD,12)); nAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //使纵坐标的最小单位格为整数 nAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
  • 24. 28页得到多柱柱状图的数据集语法 DefaultCategoryDataset dataset = (DefaultCategoryDataset) DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);Data是一个二维数组,第一维数组与columnkeys的大小相对应,第二维数组与rowkeys的大小相对应,值为rowkeys的取值;
  • 25. 29页数据示例double[][] data = new double[][] { { 672, 766, 223, 540, 126 }, { 325, 521, 210, 340, 106 }, { 332, 256, 523, 240, 526 }, { 600, 706, 203, 500, 106 } }; //对应X柱上的每个值显示的数据的列数,与之对应的data的内层数组的大小要与rowKeys的大小一致 String[] rowKeys = { "苹果", "梨子", "葡萄", "橘子"}; //对应X柱上的值, columnKeys的大小为多少,与之对应的data的最外层大小就为多少 String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" }; //创建数据集 DefaultCategoryDataset dataset = (DefaultCategoryDataset)DatasetUtilities .createCategoryDataset(rowKeys, columnKeys, data); FreeChart chart = ChartFactory.createBarChart3D("华腾水果统计图", "Categroy","Value", getDataset(), PlotOrientation.VERTICAL, true, true, true);
  • 26. 30页设置柱子上的属性BarRenderer3D renderer = (BarRenderer3D) cgplot.getRenderer(); renderer.setBaseOutlinePaint(Color.BLACK); //设置 Wall 的颜色 renderer.setWallPaint(Color.red); //设置每种水果代表的柱的颜色 renderer.setSeriesPaint(0, new Color(0, 0, 255)); renderer.setSeriesPaint(1, new Color(0, 100, 255)); renderer.setSeriesPaint(2, Color.GREEN); //设置每个地区所包含的平行柱的之间距离 renderer.setItemMargin(0.05); //设置数据柱外轮廓线 renderer.setDrawBarOutline(true); //最后把render对象放在区域对象中 cgplot.setRenderer(renderer);
  • 27. 31页 //以窗体的形式显示1 ChartFrame cf = new ChartFrame("水果",getChart()); cf.pack(); cf.setVisible(true); //以窗体的形式显示2 CategoryJFreeChart js = new CategoryJFreeChart(); ChartPanel p=new ChartPanel(js.getChart()); JFrame frame=new JFrame(); Container c=frame.getContentPane(); c.add(p, BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true);显示结果
  • 28. 32页小结柱状图美化过程步骤 1)创建区域表对象 CategoryPlot plot = chart.getCategoryPlot(); 2)创建CategoryAxis 橫柱 对象 CategoryAxis domainAxis = plot.getDomainAxis(); 3)创建NumberAxis 纵柱对象 CategoryAxis domainAxis = plot.getDomainAxis(); 4)创建BarRenderer3D对象 BarRenderer3D renderer = new BarRenderer3D(); 最后将render对象放在区域表对象中 plot.setRenderer(renderer);
  • 29. 33页3、折线图
  • 30. 34页3.1 得到并填充结果集addValue方法 用來設置默認結果集中值 参数: 1、数据(纵坐标显示值), 2、折线名,3、横坐标显示值 对象.addValue(参数1,参数2,参数3); 对象.addValue(参数1,参数2,参数3); 对象.addValue(参数1,参数2,参数3); 对象.addValue(参数1,参数2,参数3); 对象.addValue(参数1,参数2,参数3);DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(2.0,"aa","t1"); dataset.addValue(4.0,"aa","t2"); dataset.addValue(3.0,"aa","t3"); dataset.addValue(1.0, "bb", "t1"); dataset.addValue(3.0,"bb","t2"); dataset.addValue(2.0,"bb","t3"); 得到默認結果集的類 往結果集中添加值DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  • 31. 35页3.2 得到Chart工厂(ChartFactory)chart工厂类方法 方法名:createLineChart 参数:title, 横坐标, 纵坐标, 数据集, PlotOrientation (垂直显示), legend, tooltips, urlsJFreeChart chart = ChartFactory.createLineChart(标题,横坐标,纵坐标,数据集,垂直显示,legend, tooltips, urls);JFreeChart chart = ChartFactory.createLineChart("xin", "Categry", "Value", getDataset(), PlotOrientation.VERTICAL, true, true, true);
  • 32. 36页//图标以外的背景 chart.setBackgroundPaint(Color.red); CategoryPlot plot = chart.getCategoryPlot(); //图表数据部分背景 plot.setBackgroundPaint(Color.red); //图表纵坐标网格线颜色 plot.setRangeGridlinePaint(Color.red); LineAndShapeRenderer renderer = (LineAndShapeRenderer) //虚线显示 renderer.setSeriesStroke(0, new BasicStroke(2.0F,1,1,1.0F,new float[]{10F,6F},0.0F)); plot.getRenderer();3.2 属性
  • 33. 37页小结创建数据集(DefaultCategoryDataset) 创建JFreeChart(createLineChart) 设置属性 图形输出
  • 34. 38页谢谢观看