关闭

使用jfreeChart生成柱状图,折线图,饼图等

标签: jfreeChart柱状图折线图饼图
181人阅读 评论(0) 收藏 举报
分类:

                                一些项目可能会使用图形报表方式让产品销售,人员分布,以及其他各种需要统计的东西更加的清晰直观的表现出来,这里介绍如何使用jfreechart生成图形报表,

 

                     首先,你需要下载jfreeChart的包,导入其中的jar包,主要导入以下的jar包

                                       


                        这样就可以使用JfreeChart,首先从柱状图开始

                           一,柱状图


                                                                       显示的图形如下所示

                                                                         

                                            现在贴上代码如下

  public static void main(String[] args) {
		   
		    //构建数据集合
		     DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		     dataset.addValue(9, "中国","北京");
		     dataset.addValue(11, "中国","上海");
		     dataset.addValue(6, "中国","深圳");
		     
		     //创建主张图表
		    JFreeChart chart =  ChartFactory.createBarChart3D(
		    		     "用户统计报表",//图形的主标题
		    		     "所属单位的名称",//种类轴标签
		    		     "数量",//值轴的标签
		    		     dataset, //图形的数据集合
		    		     PlotOrientation.VERTICAL,//图形的显示样式(水平和垂直)
		    		     true,//是否显示子标题
		    		     true,//是否生产数据提示
		    		    true);//是否生产url链接
		    
		     //处理主标题乱码
		    
		    chart.getTitle().setFont(new Font("宋体",Font.BOLD,15));
		    //处理子标题乱码
		    chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
		    
		    //获取图表区域对象
		     /**
		      * 三种获取图标对象的方法
		      *  1.debug
		      *  2.输出(system.out.println())
		      *  3.api文档
		      */
		    
		     CategoryPlot categoryPlot = chart.getCategoryPlot();
		     
		      //取得x轴的对象
		     CategoryAxis categoryAxis = categoryPlot.getDomainAxis(); 
		     //取得y轴的对象
		      ValueAxis valueAxis = categoryPlot.getRangeAxis();
		      
		      //解决x轴上的乱码问题
		      categoryAxis.setTickLabelFont(new Font("宋体",Font.BOLD,15));
		      //解决x轴外的乱码问题
		      categoryAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
		      
		      //解决y轴上的乱码问题
		      valueAxis.setTickLabelFont(new Font("宋体",Font.BOLD,15));
		      //解决y轴外的乱码问题
		      valueAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
		      
		      //设置y轴上的刻度
		      NumberAxis3D numberAxis3D = (NumberAxis3D) valueAxis;
		       numberAxis3D.setAutoTickUnitSelection(false);//设置手动设置刻度
		       //设置刻度从1开始
		       NumberTickUnit unit  = new  NumberTickUnit(1);
		       
		       //设置新刻度
		      numberAxis3D.setTickUnit(unit);
		    
		    
		   
		      
		      //获取绘图区域对象
		       BarRenderer3D barRenderer3D = (BarRenderer3D) categoryPlot.getRenderer();
		       
		       //让图形苗条些
		       barRenderer3D.setMaximumBarWidth(0.08);
		       
		       //在图形上产生数字
		       barRenderer3D.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		       barRenderer3D.setBaseItemLabelsVisible(true);
		       barRenderer3D.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));
		        
		     /**
		      * 在d:\下生产图片
		      * 
		      */
		        File file = new File("D:/chart.png");
		        try {
					ChartUtilities.saveChartAsJPEG(file, chart, 600, 500);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		        
		        //使用Rrame加载图形
			    ChartFrame chartFrame = new ChartFrame("xyz",chart);

			      chartFrame.setVisible(true);
			      
			      //输出图形
			      chartFrame.pack();
	}

                                   解释下上面的代码,首先创建数据集合dataset,给数据集合放入值,比如我放入了,9, "中国","北京"等其他值,9表示数值,显示在值轴的,中国,表示种类中的名字,而北京表示改种类下的一个具体种类,你可尝试加入不同种类看效果,然后使用ChartFactory来生成柱状图的图标对象,这里也说明,jfreeChart是使用工厂模式

来生成各种图形对象的,现在就可以输出图形了,使用ChartFrame来加载图形即可,然后用pack()方法输出图形,但是如果你是使用中文写的标题,或者,x,y轴的名称,那么

你需要处理中文的乱码问题,处理方式,看代码就好了



                             二,折线图

                                   

                            

                              折线图和柱状图差不多,不过是将ChartFactory生成的柱状图换成了折线图,然后我们看到设置不同属性类图形所表现的区别,代码如下

                             

public static void main(String[] args) {
		   
		    //构建数据集合
		     DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		     dataset.addValue(12, "中国","北京");
		     dataset.addValue(10, "中国","上海");
		     dataset.addValue(6, "中国","深圳");
		     dataset.addValue(12, "美国","西雅图");
		     dataset.addValue(10, "美国","纽约");
		     dataset.addValue(6, "美国","华盛顿");
		     dataset.addValue(7, "中国","天津");
		     dataset.addValue(9, "中国","南京");
		     dataset.addValue(11, "中国","江苏");
		     
		     //创建主张图表
		    JFreeChart chart =  ChartFactory.createLineChart(
		    		     "用户统计报表",//图形的主标题
		    		     "所属单位的名称",//种类轴标签
		    		     "数量",//值轴的标签
		    		     dataset, //图形的数据集合
		    		     PlotOrientation.VERTICAL,//图形的显示样式(水平和垂直)
		    		     true,//是否显示子标题
		    		     true,//是否生产数据提示
		    		    true);//是否生产url链接
		    
		     //处理主标题乱码
		    
		    chart.getTitle().setFont(new Font("宋体",Font.BOLD,15));
		    //处理子标题乱码
		    chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
		    
		    //获取图表区域对象
		     /**
		      * 三种获取图标对象的方法
		      *  1.debug
		      *  2.输出(system.out.println())
		      *  3.api文档
		      */
		    
		     CategoryPlot categoryPlot = chart.getCategoryPlot();
		     
		      //取得x轴的对象
		    CategoryAxis categoryAxis = categoryPlot.getDomainAxis(); 
		     //取得y轴的对象
		      ValueAxis valueAxis = categoryPlot.getRangeAxis();
		      
		      //解决x轴上的乱码问题
		      categoryAxis.setTickLabelFont(new Font("宋体",Font.BOLD,15));
		      //解决x轴外的乱码问题
		     categoryAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
		      
		      //解决y轴上的乱码问题
		     valueAxis.setTickLabelFont(new Font("宋体",Font.BOLD,15));
		      //解决y轴外的乱码问题
		      valueAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
		      
		      //设置y轴上的刻度
		    NumberAxis numberAxis = (NumberAxis) valueAxis;
		      numberAxis.setAutoTickUnitSelection(false);//设置手动设置刻度
		       //设置刻度从1开始
		      NumberTickUnit unit  = new  NumberTickUnit(1);
		       
		       //设置新刻度
		      numberAxis.setTickUnit(unit);
		    
		    
		   
		      
		      //获取绘图区域对象
		      LineAndShapeRenderer lineAndShapeRenderer =  (LineAndShapeRenderer) categoryPlot.getRenderer();
		       
		       
		       
		       //在图形上产生数字
		      lineAndShapeRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		      lineAndShapeRenderer.setBaseItemLabelsVisible(true);
		      lineAndShapeRenderer.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));
		      
		      
		      //设置转折点
		        Shape shape = new  Rectangle(10,10);
		        lineAndShapeRenderer.setSeriesShape(0, shape);//第一个参数从第几条线开始,默认从第0条
		        lineAndShapeRenderer.setSeriesShapesVisible(0, true);
		        lineAndShapeRenderer.setSeriesShape(1, shape);//第一个参数从第几条线开始,默认从第0条
		        lineAndShapeRenderer.setSeriesShapesVisible(1, true);
		        lineAndShapeRenderer.setSeriesShape(2, shape);//第一个参数从第几条线开始,默认从第0条
		        lineAndShapeRenderer.setSeriesShapesVisible(2, true);
		        
		     /*
		      * 在d:\下生产图片
		      * 
		      */
		       /* File file = new File("D:/chart.png");
		        try {
					ChartUtilities.saveChartAsJPEG(file, chart, 600, 500);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}*/
		        
		        //使用Rrame加载图形
			    ChartFrame chartFrame = new ChartFrame("xyz",chart);

			      chartFrame.setVisible(true);
			      
			      //输出图形
			      chartFrame.pack();
	}
               代码基本差不多,注意的是如何在图形上生成一个方形来表示转折,这里,其实是使用了java中awt包的Rectangle(方形)类来制作的方形,所以可以查出,jfreeChart

还是很依赖java中awt这个类的,或者说他依赖于jdk的


                                   三,扇形图(饼图)

                                   

                                                饼图比起上面两个图还要简单,因为饼图没有x,y轴,下面是代码

                       

 public static void main(String[] args) {
		   
		    //构建数据集合
		  DefaultPieDataset dataset = new DefaultPieDataset();
		     dataset.setValue("北京",25);
		     dataset.setValue("上海",45);
		     dataset.setValue("深圳",30);
		     
		     //创建主张图表
		    JFreeChart chart =  ChartFactory.createPieChart3D(
		    		     "用户统计报表",//图形的主标题
		    		     dataset, //图形的数据集合
		    		     true,//是否显示子标题
		    		     true,//是否生产数据提示
		    		    true);//是否生产url链接
		    
		     //处理主标题乱码
		    
		    chart.getTitle().setFont(new Font("宋体",Font.BOLD,15));
		    //处理子标题乱码
     	    chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
		    
		    //获取图表区域对象
	     /**
	      * 三种获取图标对象的方法
	      *  1.debug
	      *  2.输出(system.out.println())
	      *  3.api文档
	      */
	    
     	   PiePlot3D piePlot3D = (PiePlot3D) chart.getPlot();
		    
     	    //处理图形上显示的乱码问题
     	    piePlot3D.setLabelFont(new Font("宋体",Font.BOLD,15));
		    
	      
     	    
     	      //在图形上显示数值(格式:北京  12 (60%))
     	    String labelFormat  = "{0},{1},({2})";
     	       piePlot3D.setLabelGenerator(new StandardPieSectionLabelGenerator(labelFormat));
				
		        
		        //使用Rrame加载图形
			    ChartFrame chartFrame = new ChartFrame("xyz",chart);

			      chartFrame.setVisible(true);
			      
			      //输出图形
			      chartFrame.pack();
	}

                                  注意是如何在图形上显示如:北京,12 (60%)这种格式数据的,以上就是jfreeChart,三种基本图形生成的方式

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7266次
    • 积分:391
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:4篇
    • 译文:0篇
    • 评论:3条
    文章分类
    文章存档
    最新评论