JFreeChart 好文收集


柱状图: bar charts (regular and stacked, with an optional 3D effect),用到的主要类如下:

 org.jfree.chart.JFreeChart:图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象

 org.jfree.data.category.CategoryDataset:数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类

 org.jfree.chart.plot.CategoryPlot:图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持

 org.jfree.chart.axis.CategoryAxis:用于处理图表的两个轴:纵轴和横轴

 org.jfree.chart.render.CategoryRender:负责如何显示一个图表对象

 org.jfree.chart.urls.CategoryURLGenerator:用于生成Web图表中每个项目的鼠标点击链接

 CategoryToolTipGenerator:用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类

 org.jfree.chart.axis.ValueAxis:用于处理图表中的柱

14:35  |   永久链接  |   浏览 (715)  |   评论 (1)  |    收藏  |   jfreechart  |    
评论    共 1 条 发表评论
laiseeme     2007-07-26 14:36

 

代码
  1. /**   
  2.   
  3. * 类库   
  4.   
  5. * 1、jfreechart-1.0.5.jar、jcommon-1.0.9.jar、gnujaxp.jar   
  6. * 2、jbcl.jar、dx.jar、beandt.jar 由JBuilder2006的lib下提供   
  7.   
  8. */   
  9.   
  10. package org.jfree.demo;   
  11.   
  12. import java.io.*;   
  13.   
  14. import org.jfree.data.*;   
  15.   
  16. import org.jfree.chart.*;   
  17.   
  18. import org.jfree.chart.plot.*;   
  19.   
  20. import org.jfree.data.category.*;   
  21.   
  22. import java.awt.Color;   
  23.   
  24. import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;   
  25.   
  26. import java.awt.Font;   
  27.   
  28. import org.jfree.chart.axis.AxisLocation;   
  29.   
  30. import java.awt.event.WindowAdapter;   
  31.   
  32. import java.awt.event.WindowEvent;   
  33.   
  34. import java.awt.Toolkit;   
  35.   
  36. import java.awt.Dimension;   
  37.   
  38. /**   
  39.   
  40. <p>Title: Java开发手册</p>  
  41.   
  42. *   
  43.   
  44. <p>Description: 适合中高级使用者</p>  
  45.   
  46. *   
  47.   
  48. <p>Copyright: Copyright (c) 2007</p>  
  49.   
  50. *   
  51.   
  52. <p>Company: lingbrother</p>  
  53.   
  54. *   
  55.   
  56. * @author lingbrother   
  57.   
  58. * @version 1.0   
  59.   
  60. */   
  61.   
  62. public class BarChartDemo {   
  63.   
  64.   public BarChartDemo() {   
  65.   
  66.     super();   
  67.   
  68.   }   
  69.   
  70.   public static void main(String[] args) throws IOException{   
  71.   
  72.           CategoryDataset dataset = getDataSet();   
  73.   
  74.           JFreeChart chart = ChartFactory.createBarChart3D(   
  75.   
  76.                                                   "招生信息总览", // 图表标题   
  77.   
  78.                                                   "应报与实报对照", // 目录轴的显示标签   
  79.   
  80.                                                   "人数", // 数值轴的显示标签   
  81.   
  82.                                                   dataset, // 数据集   
  83.   
  84.                                                   PlotOrientation.VERTICAL, // 图表方向:水平、垂直   
  85.   
  86.                                                   true,  // 是否显示图例(对于简单的柱状图必须是false)   
  87.   
  88.                                                   true,  // 是否生成工具   
  89.   
  90.                                                   true  // 是否生成URL链接   
  91.   
  92.                                                   );   
  93.   
  94.           CategoryPlot plot = chart.getCategoryPlot();//获得图表区域对象   
  95.   
  96.           //设置图表的纵轴和横轴org.jfree.chart.axis.CategoryAxis   
  97.   
  98.           org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();   
  99.   
  100.           domainAxis.setLowerMargin(0.1);//设置距离图片左端距离此时为10%   
  101.   
  102.           domainAxis.setUpperMargin(0.1);//设置距离图片右端距离此时为百分之10   
  103.   
  104.           domainAxis.setCategoryLabelPositionOffset(10);//图表横轴与标签的距离(10像素)   
  105.   
  106.           domainAxis.setCategoryMargin(0.2);//横轴标签之间的距离20%   
  107.   
  108.           //domainAxis.setMaximumCategoryLabelLines(1);   
  109.   
  110.           //domainAxis.setMaximumCategoryLabelWidthRatio(0);   
  111.   
  112.           //设定柱子的属性   
  113.   
  114.           org.jfree.chart.axis.ValueAxis rangeAxis = plot.getRangeAxis();   
  115.   
  116.           rangeAxis.setUpperMargin(0.1);//设置最高的一个柱与图片顶端的距离(最高柱的10%)   
  117.   
  118.           //设置图表的颜色   
  119.   
  120.           org.jfree.chart.renderer.category.BarRenderer3D renderer;   
  121.   
  122.           renderer = new org.jfree.chart.renderer.category.BarRenderer3D();   
  123.   
  124.           renderer.setBaseOutlinePaint(Color.red);   
  125.   
  126.           renderer.setSeriesPaint(0, new Color(0, 255, 255));//计划柱子的颜色为青色   
  127.   
  128.           renderer.setSeriesOutlinePaint(0,Color.BLACK);//边框为黑色   
  129.   
  130.           renderer.setSeriesPaint(1, new Color(0, 255, 0));//实报柱子的颜色为绿色   
  131.   
  132.           renderer.setSeriesOutlinePaint(1,Color.red);//边框为红色   
  133.   
  134.           renderer.setItemMargin(0.1);//组内柱子间隔为组宽的10%   
  135.   
  136.           //显示每个柱的数值,并修改该数值的字体属性   
  137.   
  138.           renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());   
  139.   
  140.           renderer.setItemLabelFont(new Font("黑体",Font.BOLD,12));//12号黑体加粗   
  141.   
  142.           renderer.setItemLabelPaint(Color.black);//字体为黑色   
  143.   
  144.           renderer.setItemLabelsVisible(true);   
  145.   
  146.           plot.setRenderer(renderer);//使用我们设计的效果   
  147.   
  148.           //设置纵横坐标的显示位置   
  149.   
  150.           plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);//学校显示在下端(柱子竖直)或左侧(柱子水平)   
  151.   
  152.           plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); //人数显示在下端(柱子水平)或左侧(柱子竖直)   
  153.   
  154.           try {   
  155.   
  156.             File file = new File("c:/student.png");   
  157.   
  158.             ChartUtilities.saveChartAsPNG(file,chart,400,300);//把报表保存为文件   
  159.   
  160.           }catch (Exception e) {   
  161.   
  162.                     String s = e.getLocalizedMessage();   
  163.   
  164.                     s = e.getMessage();   
  165.   
  166.                     s = e.toString();   
  167.   
  168.           }   
  169.   
  170.       //将生成的报表放到预览窗口中   
  171.   
  172.       final ChartFrame preview = new ChartFrame("招生信息",chart);   
  173.   
  174.        preview.addWindowListener(new WindowAdapter() {   
  175.   
  176.          public void windowClosing(final WindowEvent event) {   
  177.   
  178.            preview.dispose();   
  179.   
  180.          }   
  181.   
  182.        });   
  183.   
  184.        preview.pack();   
  185.   
  186.        //调整预览窗口的大小和位置,适合屏幕,并且居中   
  187.   
  188.        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();   
  189.   
  190.        preview.setSize(screenSize.width,screenSize.height-50);//适合屏幕,50表示把工具栏要考虑在内   
  191.   
  192.        Dimension frameSize = preview.getSize();   
  193.   
  194.        if (frameSize.height > screenSize.height) {   
  195.   
  196.          frameSize.height = screenSize.height;   
  197.   
  198.        }   
  199.   
  200.        if (frameSize.width > screenSize.width) {   
  201.   
  202.          frameSize.width = screenSize.width;   
  203.   
  204.        }   
  205.   
  206.        preview.setLocation( (screenSize.width - frameSize.width) / 2,   
  207.   
  208.                   (screenSize.height - frameSize.height-50) / 2);   
  209.   
  210.        //显示报表预览窗口   
  211.   
  212.        preview.setVisible(true);   
  213.   
  214.   }   
  215.   
  216.   /**   
  217.   
  218.    * 获取一个演示用的组合数据集对象   
  219.   
  220.    * @return   
  221.   
  222.    */   
  223.   
  224.   private static CategoryDataset getDataSet() {   
  225.   
  226.           DefaultCategoryDataset dataset = new DefaultCategoryDataset();   
  227.   
  228.           dataset.addValue(200, "计划", "清华大学");   
  229.   
  230.           dataset.addValue(400, "实报", "清华大学");   
  231.   
  232.           dataset.addValue(100, "计划", "天津大学");   
  233.   
  234.           dataset.addValue(205, "实报", "天津大学");   
  235.   
  236.           dataset.addValue(200, "计划", "郑州大学");   
  237.   
  238.           dataset.addValue(285, "实报", "郑州大学");   
  239.   
  240.           return dataset;   
  241.   
  242.   }   
  243.   
  244. }    

 


关键字:   JfreeChart    

自己最近学习了JfreeChart的使用,觉得这个冬冬的功能非常强大,总结一下。主要介绍JfreeChart生成图片的几种方式

先从网上找点介绍。
一、简介
WW 的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面。为了能在web浏览器上显示要求用户界面使用 HTML以及图片的方式来展现数据,而传统的一些利用操作系统本身的控件来开发的用户界面无法适应琳琅满目的客户端,因此在这里也变得无能为力。回到本文的题目上来,为了创建一个可以在web浏览器上查看到图表一般有两种做法:第一种就是使用applet利用java本身对图形的支持来显示一个图表;第二 种就是直接在web服务器端生成好图表图片文件后发送给浏览器。第一种方式显然对于客户端要求太高,随着现在主流浏览器放弃对JAVA的支持后,这种方式 只适合一些局域网的应用,而对于因特网的环境就显得不太适合。因此我们下面将介绍一个JAVA的图表引擎JFreeChart用来产生基于WEB的图表。
JFreeChart 项目简介 JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普 通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的要求。

二、JFreeChart获取。

JFreeChart 是JFreeChart公司在开源网站SourceForge.net上的一个项目,该公司的主要产品有如下:
1.JFreeReport :报表解决工具
2.JFreeChart:Java 图形解决方案(Application/Applet/Servlet/Jsp)
3.JCommon :JFreeReport和JFreeChart的公共类库
4.JFreeDesigner :JFreeReport的报表设计工具
我们可以从jfree官方网站上获取最新版本和相关资料(但是jfree的document需要40美金才能获取),
获取地址:http://www.jfree.org/jfreechart/index.html(同时可以获得简明介绍)
我们以当前最新版本:jfreechart-1.0.1.zip为例子进行说明。

三、JFreeChart配置安装
1 、解压jfreechart-1.0.1.zip.zip到指定位置,其中source是jfreechart的源码,jfreechart-1.0.1-demo.jar 是例子程序,可以先运行一下看看各种效果,就知道他的nb之处了。
2 、为了配置成功,我们需要关注的文件有如下三个:
设置classpath。加入下面三个jar包。
jfreechart-1.0.1.jar 、jcommon-1.0.0.jar、gnujaxp.jar
加上第三个jar包有时web.xml会报错,把它去掉就好了。
至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类
结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。如果是中文显示的时候可能依据观感需要改变源码的字体。

四、JFreeChart功能介绍
JFreeChart 目前是最好的java图形解决方案,基本能够解决目前的图形方面的需求,主要包括如下几个方面:
pie charts (2D and 3D) :饼图(平面和立体)
bar charts (regular and stacked, with an optional 3D effect) :柱状图
line and area charts :曲线图
scatter plots and bubble charts
time series, high/low/open/close charts and candle stick charts :时序图
combination charts :复合图
Pareto charts
Gantt charts :甘特图
wind plots, meter charts and symbol charts
wafer map charts
( 态图表,饼图(二维和三维) , 柱状图 ( 水平,垂直),线图,点图,时间变化图,甘特图, 股票行情图,混和图, 温度计图, 刻度图等常用商用图表)
图形可以导出成PNG和JPEG格式,同时还可以与PDF和EXCEL关联
JFreeChart 核心类库介绍:
研究jfreechart源码发现源码的主要由两个大的包组成:org.jfree.chart,org.jfree.data。其中前者主要与图形
本身有关,后者与图形显示的数据有关。具体研究如果大家有兴趣的话可以自己研究 。
核心类主要有:
org.jfree.chart.JFreeChart :图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
org.jfree.data.category.XXXDataSet: 数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
org.jfree.chart.plot.XXXPlot :图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持
org.jfree.chart.axis.XXXAxis :用于处理图表的两个轴:纵轴和横轴
org.jfree.chart.render.XXXRender :负责如何显示一个图表对象
org.jfree.chart.urls.XXXURLGenerator: 用于生成Web图表中每个项目的鼠标点击链接
XXXXXToolTipGenerator: 用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类

个人感觉JFreeChart可以满足大部分图片创建的需要,美中不足的是:对字体的设置做的不够好,特别是使用中文的时候字体很不清晰。因为这个原因建议你自己去修改他的源代码,最好使用properties文件去设置字体.还有就是文档要钱所以要多花点时间去看源代码。或多上社区.

五.开始开发
对JfreeChart有了初步了解并做好准备工作之后,开始作例子程序试验。在这里我只介绍饼图的做法,而这张图采用不同的方式进行输出,其他类型的图片可以参考jfreechart提供的例子,做法都差不多。

1) 直接生成图片

代码
  1. public class PieChartPicture {   
  2. public static void main(String[] args)    
  3. {   
  4.  PieDataset dataset = getDataSet();   
  5.  JFreeChart chart = ChartFactory.createPieChart3D(   
  6.     " 项目进度分布"// chart title   
  7.     dataset,// data   
  8.     true,// include legend   
  9.     true,   
  10.     false  
  11.    );   
  12.   PiePlot3D  plot=(PiePlot3D)chart.getPlot();   
  13.     // 图片中显示百分比:默认方式   
  14.     //plot.setLabelGenerator(new           StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));   
  15. // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位   
  16.  plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));    
  17. // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例                   
  18.  plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));    
  19. // 设置背景色为白色    
  20. chart.setBackgroundPaint(Color.white);    
  21. // 指定图片的透明度(0.0-1.0)    
  22.  plot.setForegroundAlpha(1.0f);    
  23. // 指定显示的饼图上圆形(false)还椭圆形(true)    
  24. plot.setCircular(true);    
  25. // 设置图标题的字体    
  26. Font font = new Font(" 黑体",Font.CENTER_BASELINE,20);    
  27. TextTitle title = new TextTitle(" 项目状态分布");    
  28. title.setFont(font);     
  29. chart.setTitle(title);    
  30. FileOutputStream fos_jpg = null;    
  31. try {    
  32.      fos_jpg=new FileOutputStream("D:\\ 项目状态分布.jpg");    
  33.      ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,640,480,null);    
  34.      fos_jpg.close();    
  35. catch (Exception e) {    
  36.  }    
  37. }    
  38. private static PieDataset getDataSet() {    
  39. DefaultPieDataset dataset = new DefaultPieDataset();    
  40. dataset.setValue(" 市场前期"new Double(10));    
  41. dataset.setValue(" 立项"new Double(15));    
  42. dataset.setValue(" 计划"new Double(10));    
  43. dataset.setValue(" 需求与设计"new Double(10));    
  44. dataset.setValue(" 执行控制"new Double(35));    
  45. dataset.setValue(" 收尾"new Double(10));    
  46. dataset.setValue(" 运维",new Double(10));    
  47. return dataset;           
  48. }   
  49. }   
<script>render_code();</script>

 

2) 采用servlet和struts的action方式输出
采用这种方式输出,不用生成图片。
A .servlet输出

代码
  1. public class PieByServlet extends HttpServlet{    
  2. public void service(ServletRequest req, ServletResponse res)    
  3. throws ServletException, IOException    
  4. {    
  5.    res.setContentType("image/jpeg");    
  6.    PieDataset dataset = getDataSet();    
  7.    JFreeChart chart = ChartFactory.createPieChart3D(    
  8.    " 水果饼图"// chart title    
  9.    dataset,// data    
  10.    true// include legend    
  11.    true,    
  12.    false );    
  13.    //设置图表属性   
  14. // 输出图片    
  15.  ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,800,600,null);    
  16. }   
<script>render_code();</script>
B .struts的action方式输出
只将这条语句加上try catch即可,并返回null。
代码
  1. try{          
  2. ChartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null);    
  3.  } catch (Exception e) {    
  4. }   
  5. return null;   
<script>render_code();</script>

 

其实采用这两种方式与生成图片的方式改动并不大
加上语句response.setContentType("image/jpeg");
ChartUtilities.writeChartAsJPEG(new FileOutputStream("D:\\ 项目状态分布.jpg");,100,chart,640,480,null);
文件流改成response的输出流就可以了
hartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null);

3)jsp+servlet+javabean方式
1. Create ChartViewer servlet

代码
  1. public class ChartViewer extends HttpServlet {    
  2. public void init() throws ServletException {   
  3. }    
  4. //Process the HTTP Get request   
  5. public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {    
  6. // get the chart from session   
  7. HttpSession session = request.getSession();    
  8. BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");    
  9. // set the content type so the browser can see this as a picture    
  10. response.setContentType("image/png");    
  11. // send the picture    
  12. PngEncoder encoder = new PngEncoder(chartImage, false09);    
  13. response.getOutputStream().write(encoder.pngEncode());   
  14. }    
  15. //Process the HTTP Post request    
  16. public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值