jfreechart学习

 

这几天需要使用jfreechart,在网上找了很多的资料,但是感觉有点乱,所以自己就在这儿写一下对于jfreechart的学习心得。

 

***********需要说明一点,我的这个是web开发的,不是C/S模式下的***********

 

一,环境配置。

        1,建立一个web工程。  以我的为例:jfreechart工程

2,将  jfreechart-1.0.13\lib  目录下的3个jar包(gnujaxp.jar,jcommon-1.0.16.jar,jfreechart-1.0.13.jar),复制到:jfreechart\WebRoot\WEB-INF\lib里面。(呵呵,这里也可以直接把所有的jar包全部复制到工程根目录下的lib之内)

3,配置web.xml。将以下内容复制到web.xml之内。

 

<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/DisplayChart</url-pattern>
</servlet-mapping>

  4,添加jsp文件。

WebRoot目录之下,建立一个bar包,在bar包之下建立一个sample1.jsp

 

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="org.jfree.chart.ChartFactory,
				org.jfree.chart.JFreeChart,
				org.jfree.chart.plot.PlotOrientation,
				org.jfree.chart.servlet.ServletUtilities,
				org.jfree.data.category.DefaultCategoryDataset"%>

<%
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
			dataset.addValue(610, "广州", "Hello");
			dataset.addValue(220, "广州", "牛肉");
			dataset.addValue(530, "广州", "鸡肉");
			dataset.addValue(340, "广州", "鱼肉");
		JFreeChart chart = ChartFactory.createBarChart3D("肉类销量统计图","肉类","销量",dataset,PlotOrientation.VERTICAL,false,false,false);
		

		
		
		String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);
		String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;
%>
		<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">
 

然后启动Tomcat,访问:http://localhost:8080/jfreechart/bar/sample1.jsp    就会得到图像了。

 

不足之处: 1,图片中的中文全部是乱码。解决方案可以参考: http://horizonhyg.iteye.com/blog/375689

 

[补充说明]:对于图片中的中文乱码,在今天的测试中,如果将其横坐标和纵坐标之标题和字体进行设置,则图片中的字体,就会由乱码变成需要显示的字体。

 

 

二,后来学习的。参考地址:http://www.iteye.com/topic/201899

 

下面的例子更加具有使用价值,能够在实际的项目中发挥作用。这个例子讲的很详细,但是有两点不足,第一:尽量不要在JSP中内嵌大量的Java代码。 第二:这个仅仅是一个3D的柱状图,其他的可以参考网上其他的资料。

 

 

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.awt.Color,
                org.jfree.chart.ChartFactory,
                org.jfree.chart.JFreeChart,
                org.jfree.chart.plot.PlotOrientation,
                org.jfree.chart.servlet.ServletUtilities,
                org.jfree.data.category.CategoryDataset,
                org.jfree.data.general.*,
                org.jfree.chart.plot.CategoryPlot,
                org.jfree.chart.axis.CategoryAxis,
                org.jfree.chart.axis.ValueAxis,
                org.jfree.chart.renderer.category.BarRenderer3D,
                org.jfree.chart.urls.StandardCategoryURLGenerator,
                org.jfree.chart.*,
                org.jfree.chart.entity.*,
                org.jfree.chart.labels.*,
                org.jfree.chart.axis.CategoryLabelPositions,
                java.awt.Font,
                java.awt.GradientPaint,
                org.jfree.ui.TextAnchor,
                org.jfree.chart.axis.NumberAxis,
                org.jfree.chart.axis.NumberTickUnit                
                "%>
<%
		java.io.PrintWriter pw=new java.io.PrintWriter(out);
		double[][] data = new double[][] {{500}, {200}, {100}, {400}, {600}, {300}};
		String[] rowKeys = {"苹果", "梨子", "葡萄", "桔子", "西瓜", "香蕉"};
		String[] columnKeys = {""};
		CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys,columnKeys,data);
		//createCategoryDataset(Comparable[] arg0, Comparable[] arg1, double[][] arg2)
		/**  上面就是一个***DataSet,即数据集,将数据显示出来
		*
		*/

		JFreeChart chart = ChartFactory.createBarChart3D("水果销量图统计",
				  "水果",  //横坐标名称
                  "销量",  //纵坐标名称
                  dataset,//数据集合
                  PlotOrientation.VERTICAL,//图形位置,水平还是垂直
                  true,
                  false,
                  false);
       chart.setBackgroundPaint(Color.WHITE);   
       //设定背景色为白色
       
       //设置图片顶端的标题!
       chart.setTitle("ABCD");
       
       CategoryPlot categoryPlot = chart.getCategoryPlot();  
       //获得 plot:3dBar为CategoryPlot
       
       categoryPlot.setBackgroundPaint(Color.lightGray); 
       //设定图表数据显示部分背景色
       
       categoryPlot.setDomainGridlinePaint(Color.white); 
       //横坐标网格线白色;   垂直的那根线  *******
       
       categoryPlot.setDomainGridlinesVisible(true); 
       //设置网格线可见
       
       categoryPlot.setRangeGridlinePaint(Color.white); 
       //纵坐标网格线白色;    水平的那些线!  ******
     
       //获取横坐标
       CategoryAxis domainAxis = categoryPlot.getDomainAxis();
       
       //设置 横坐标 垂直显示
       //domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(0.4));
       
       //获取纵坐标
       NumberAxis numberaxis = (NumberAxis)categoryPlot.getRangeAxis();  
       
       //将纵坐标间距设置为50 
       numberaxis.setTickUnit(new NumberTickUnit(50));
       
       //设置纵坐标的标题字体和大小,在此处是:宋体 13号
       numberaxis.setLabelFont(new Font("宋体",Font.PLAIN,13));
       
       //设置横坐标的标题字体和大小,此处是“宋体13号”
       domainAxis.setLabelFont(new Font("宋体",Font.PLAIN,13));
       
       //设置距离图片左端距离,参数为图片的百分比
       domainAxis.setLowerMargin(0.05);
       
       //设置距离图片右端距离
       domainAxis.setUpperMargin(0.05);
           
       //设置横坐标的坐标值的字体
       domainAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,12));
       
       //使横坐标设置生效
       categoryPlot.setDomainAxis(domainAxis); 
            
       ValueAxis rangeAxis = categoryPlot.getRangeAxis();
       //设置最高的一个柱与图片顶端的距离
       rangeAxis.setUpperMargin(0.05);
       
       //设置最低的一个柱与图片底端的距离
       rangeAxis.setLowerMargin(0.05);
       
       //使该功能生效
       categoryPlot.setRangeAxis(rangeAxis); 
       
       //设置竖坐标标签的旋转角度
       rangeAxis.setLabelAngle(0.05);
      
       //重要的类,负责生成各种效果   Renderer的英文的意思就是:渲染,所以BarRenderer3D从这个名称中就可以理解它的意思:3D柱状图的渲染
       BarRenderer3D renderer=(BarRenderer3D) categoryPlot.getRenderer();
      
       //设置 Wall 的颜色
       renderer.setWallPaint(Color.pink);
       
       //设置每个柱的颜色     
       GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue, 0.0F, 0.0F, new Color(0, 0, 64)); //设定特定颜色
       
       GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green, 0.0F, 0.0F, new Color(0, 64, 0));
 
       renderer.setSeriesPaint(0, gradientpaint);
       renderer.setSeriesPaint(1, gradientpaint1);
       
       //设置柱的 Outline 颜色
       renderer.setSeriesOutlinePaint(0, Color.BLACK);
       renderer.setSeriesOutlinePaint(1, Color.BLACK);
       
       //设置每个category所包含的平行柱的之间距离
       renderer.setItemMargin(0.1);
    
       //显示每个柱的数值,并修改该数值的字体属性
       renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());

        //以下设置,将按照指定格式,制定内容显示每个柱的数值。可以显示柱名称,所占百分比
       //renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}",new DecimalFormat("0.0%")));   
 
       //设置柱子上数值的字体
       renderer.setItemLabelFont(new Font("宋体",Font.PLAIN,13)); 
       
       //设置柱子上的字体可见 
       renderer.setItemLabelsVisible(true);
     
       //设置柱子上数据的颜色
       renderer.setItemLabelPaint(Color.RED);
       
       //设置bar的最小宽度,以保证能显示数值
       renderer.setMinimumBarLength(0.05);
       
       //最大宽度
       //renderer.setMaximumBarWidth(0.07);
       
       //设置柱子上比例数值的显示,如果按照默认方式显示,数值为方向正常显示
       //设置柱子上显示的数据旋转90度,最后一个参数为旋转的角度值/3.14
         ItemLabelPosition itemLabelPosition= new ItemLabelPosition(ItemLabelAnchor.INSIDE12,TextAnchor.CENTER_RIGHT,TextAnchor.CENTER_RIGHT,-1.57D);
       
       //下面的设置是为了解决,当柱子的比例过小,而导致表示该柱子比例的数值无法显示的问题
       //设置不能在柱子上正常显示的那些数值的显示方式,将这些数值显示在柱子外面
         ItemLabelPosition itemLabelPositionFallback=new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT,TextAnchor.HALF_ASCENT_LEFT,-1.57D);
       
       //设置正常显示的柱子label的position
       renderer.setPositiveItemLabelPosition(itemLabelPosition);
       renderer.setNegativeItemLabelPosition(itemLabelPosition);
       
       //设置不能正常显示的柱子label的position
       renderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback);
       renderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback);
       
       categoryPlot.setRenderer(renderer);
       //设置柱子的透明度
       categoryPlot.setForegroundAlpha(0.8f);
      

         //为柱图设置“数据挖陷”
         //第一个参数是跳转的连接地址
         renderer.setBaseItemURLGenerator(new StandardCategoryURLGenerator("detail.jsp", "fruit", ""));

        //使设置生效
         renderer.setBaseItemLabelsVisible(true);
        //设置柱的透明度
         categoryPlot.setForegroundAlpha(0.68f);
        //设置地区、销量的显示位置
         //plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
         ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
         //生成图形的名称
         //可以改变ServletUtilities源代码,设置图形统一前缀名称和默认存放路径
         //注意:图形的大小往往都是通过配置文件设置的,不可能所有图形一个大小
         String filename = ServletUtilities.saveChartAsPNG(chart, 800, 600, info, session);
         //调用DisplayChart(配置在webxml中),生成图形
         String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;
         //将MAP信息,写入图形
         ChartUtilities.writeImageMap(pw, filename, info, true);
         pw.flush();
%>
<table width="100%">
    <tr>
        <td align="center">
            <!-- 生成图形 -->
            <img src="<%= graphURL %>" width=800 height=600 border=0 usemap="#<%= filename %>" alt="">
        </td>
    </tr>
</table>
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值