JfreeChart 画图

 ----------------------------柱状图

   String xml = "";
     xml = dao.getHyXml2();
     CategoryDataset dataset = common.getDataSetHy(xml);//柱状图数据
        JFreeChart  chart = FreeChartCommon.createBarChartCommon(dataset,"营业税改增值税分行业税收完成情况(万元)");
        StandardEntityCollection sec = new StandardEntityCollection();
        ChartRenderingInfo info = new ChartRenderingInfo(sec);
        String filename2 = ServletUtilities.saveChartAsPNG(chart, Integer.parseInt(widtht), Integer.parseInt(heightt) ,info, request.getSession());
        String graphURL = request.getContextPath()
        + "/servlet/DisplayChart?filename=" + filename2;

 

 public  CategoryDataset getDataSetHy(String xml) {
   DefaultCategoryDataset dataset = new DefaultCategoryDataset();
   try {
    System.out.println("xml++=="+xml);
    if(xml.indexOf("<ROWSET>")!=-1){//如果有数据
     xml=xml.split("<ROWSET>")[1];
     xml=xml.split("</ROWSET>")[0];
     //xml=xml.split("ROW")[1];
     xml = "<ROOT>" + xml + "</ROOT>";
     Document document = DocumentHelper.parseText(xml);
     // 读取ITEM
     List list = document.selectNodes("//ROW");
     // 获取NODE细节
     Iterator it = list.iterator();
     //横轴标记
       String series1 = "本年累计数";
     while (it.hasNext()) {
      
      Node node = (Node) it.next();
      String sz = Tools.nullToSpace(node.valueOf("HY")).trim();
      dataset.addValue(Double.parseDouble(node.valueOf("LJ")),
        Tools.nullToSpace(series1),
        sz);
//      dataset.addValue(Double.parseDouble(node.valueOf("ZF")),
//        Tools.nullToSpace(series3),
//        sz);
     
     }
    }
     
   } catch (Exception e) {
    
     e.printStackTrace();
    
   }
   
   return dataset;
  }


 /**
 /**
    * 柱形图(公共方法)
    * @param xml
    * @param sz
    * @return
    */ 
    public static JFreeChart createBarChartCommon(CategoryDataset dataset,String  title){
        JFreeChart chart = ChartFactory.createBarChart(title, // 图表标题
      "", // 目录轴的显示标签
      "", // 数值轴的显示标签
      dataset, // 数据集
      PlotOrientation.VERTICAL, // 图表方向:水平、垂直
      true, // 是否显示图例(对于简单的柱状图必须是false)
      true, // 是否生成工具
      true // 是否生成URL链接
      );
        // 设置总的背景颜色
        //  chart.setBackgroundPaint(ChartColor.WHITE);
        // 设置标题颜色
        chart.getTitle().setPaint(ChartColor.black);
     //显示每个柱的数值,并修改该数值的字体属性
     chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
        chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
         
        CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
         // 设置表格线为实线
        plot.setDomainGridlineStroke(new BasicStroke());
        plot.setRangeGridlineStroke(new BasicStroke());
         // 设置图的背景颜色
        plot.setBackgroundPaint(ChartColor.WHITE);
         // 设置表格线颜色
        plot.setRangeGridlinePaint(Color.gray.lightGray);
        CategoryAxis domainAxis=plot.getDomainAxis();
           //水平底部列表
        domainAxis.setLabelFont(new Font("宋体",Font.BOLD,14));
           //水平底部标题
        domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));
        domainAxis.setCategoryMargin(0.3);//
           //垂直标题
        ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
        rangeAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
        rangeAxis.setUpperMargin(0.2);
        plot.setNoDataMessage("无对应的数据,请重新查询。");
        BarRenderer renderer  =   new  BarRenderer();//背景立体控制
      // renderer.setItemLabelAnchorOffset(10D);
        renderer.setSeriesPaint(0, Color.decode("#F8D661"));// 给series1 Bar
        renderer.setSeriesPaint(1, Color.decode("#0000FF")); // 给series2 Bar
             renderer.setShadowVisible(false); // 柱状图不显示阴影
            //数据下钻用,给每个柱子做一个连接,指向
            //  renderer.setBaseItemURLGenerator(new StandardCategoryURLGenerator("kkhzAction.do?sz="+sz+"&qx_swjgdm="+qx_swjgdm, "kkzt", "a"));
            plot.setRenderer(renderer);
            //控制数据显示
       renderer.setItemLabelGenerator( new  StandardCategoryItemLabelGenerator());
            renderer.setItemLabelsVisible( true );
            return chart;
  } 

------------------------------------------折线图--------------------------
String xml = "";
     xml = dao.getYf();
       CategoryDataset lineDataset = common.getDataSet_3(xml);//
      String title="山东国税税收收入趋势(万元)";
        JFreeChart  chart = FreeChartCommon.generateLineChartCommon(lineDataset,title);
        StandardEntityCollection sec = new StandardEntityCollection();
        ChartRenderingInfo info = new ChartRenderingInfo(sec);
        String filename2 = ServletUtilities.saveChartAsPNG(chart, Integer.parseInt(widtht), Integer.parseInt(heightt) ,info, request.getSession());
        String graphURL = request.getContextPath()
        + "/servlet/DisplayChart?filename=" + filename2;


/**
  * 折线图(公共)
  */
 public static JFreeChart generateLineChartCommon(CategoryDataset dataset,String title) {

  
  JFreeChart chart = ChartFactory.createLineChart(title, // 图表标题
    "", // 目录轴的显示标签
    "", // 数值轴的显示标签
    dataset, // 数据集
    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
    true, // 是否显示图例(对于简单的柱状图必须是false)
    false, // 是否生成工具
    false // 是否生成URL链接
    );
  
  

  /*------------配置图表属性--------------*/
  // 1,设置整个图表背景颜色
  chart.setBackgroundPaint(Color.white);

  /*------------设定Plot参数-------------*/
  CategoryPlot plot = chart.getCategoryPlot();
  // 2,设置详细图表的显示细节部分的背景颜色
  // plot.setBackgroundPaint(Color.PINK);
  // 3,设置垂直网格线颜色
  //plot.setDomainGridlinePaint(Color.gray.lightGray);
  // 4,设置是否显示垂直网格线
  plot.setDomainGridlinesVisible(true);
  plot.setDomainGridlineStroke(new BasicStroke());
  // 5,设置水平网格线颜色
  plot.setRangeGridlinePaint(Color.gray.lightGray);
  // 6,设置是否显示水平网格线
  plot.setRangeGridlinesVisible(true);
  // 7设置图的背景颜色
  plot.setBackgroundPaint(ChartColor.WHITE);
  // 8设置水平网格线实线
  plot.setRangeGridlineStroke(new BasicStroke());
//  // 设置表格线颜色
//  plot.setRangeGridlinePaint(ChartColor.gray);
  /*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/
  //显示每个柱的数值,并修改该数值的字体属性
    chart.getTitle().setFont(new Font("宋体", Font.BOLD, 20));
    chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 10));
    CategoryAxis domainAxis = plot.getDomainAxis();  
    /*------设置X轴坐标上的文字-----------*/
    domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 13));  
    /*------设置X轴的标题文字------------*/
    domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 8)); 
    domainAxis.setMaximumCategoryLabelLines(2); // 这边的4代表最多显示4行字 
    NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();  
    /*------设置Y轴坐标上的文字-----------*/
    numberaxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 14));  
    
    /*------设置Y轴的标题文字------------*/
    numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    numberaxis.setAutoRangeIncludesZero(true);
    numberaxis.setUpperMargin(0.20);
    numberaxis.setLabelAngle(Math.PI / 2.0);
       chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
      
//   获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
  LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)plot.getRenderer();
//
  lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
  lineandshaperenderer.setBaseShapesFilled(false);
  lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
  lineandshaperenderer.setSeriesStroke(0, new BasicStroke(3.0F));
  lineandshaperenderer.setSeriesStroke(1, new BasicStroke(3.0F));
  lineandshaperenderer.setSeriesStroke(2, new BasicStroke(3.0F));
  lineandshaperenderer.setSeriesStroke(3, new BasicStroke(3.0F));
   //显示折点数据
//   lineandshaperenderer.setBaseItemLabelGenerator(new
//   StandardCategoryItemLabelGenerator());
//   lineandshaperenderer.setBaseItemLabelsVisible(true);
  
  return chart;
 }

 

 

----------------------------------------------------------饼图--------------------------

  xml = dao.getSsFsz(bn,by);
       PieDataset datasetPie = common.getDataSetSzPie(xml);
          JFreeChart  chart2 = FreeChartCommon.createPieChartCommon(datasetPie,"累计入库数分税种占比");
          StandardEntityCollection sec2 = new StandardEntityCollection();
          ChartRenderingInfo info2 = new ChartRenderingInfo(sec2);
          String filename3 = ServletUtilities.saveChartAsPNG(chart2, Integer.parseInt(widtht), Integer.parseInt(heightt) ,info2, request.getSession());
         //  ChartUtilities.writeImageMap(out, "map0", info, false); //我们在IMG标签中加入usemap="#map0"就可以为饼图的每一部分加入链接。
          String graphURL2 = request.getContextPath()
         + "/servlet/DisplayChart?filename=" + filename3;

  /**
   * 获取一个饼图数据集对象
   *
   * @return
   */
  public PieDataset getDataSetSzPie(String xml) {
   DefaultPieDataset dataset = new DefaultPieDataset();
   try {
    System.out.println("xml++=="+xml);
    if(xml.indexOf("<ROWSET>")!=-1){//如果有数据
     xml=xml.split("<ROWSET>")[1];
     xml=xml.split("</ROWSET>")[0];
     //xml=xml.split("ROW")[1];
     xml = "<ROOT>" + xml + "</ROOT>";
     Document document = DocumentHelper.parseText(xml);
     java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00"); 
     // 读取ITEM
     List list = document.selectNodes("//ROW");
     // 获取NODE细节
     Iterator it = list.iterator();
       String series1 = "增值税";
       String series3 = "企业所得税";
       String series2 = "消费税";
       String series5 = "车辆购置税";
       String series4 = "个人所得税";
//     
      int i=0;
     while (it.hasNext()) {
      String a[] = {series1,series2,series3,series4,series5};
      Node node = (Node) it.next();
      System.out.println("a[i]=="+a[i]);
      dataset.setValue(a[i],Double.parseDouble(df.format(Double.parseDouble(node.valueOf("BNLJ")))));
      i++;
     }
    }
    List list = dataset.getKeys(); 
    System.out.println("list=="+list);
   } catch (Exception e) {
    
     e.printStackTrace();
    
   }
  
  return dataset;
 }
 /**
    * 饼图公共方法
    */
   public static JFreeChart createPieChartCommon(PieDataset dataset,String title){
    //   PieDataset dataset = getDataSetSzPie(xml);//饼图
    //  JFreeChart chart = ChartFactory.createPieChart("截止"+year+"年"+month+"月"+day+"日"+hour+"点税收完成情况\n山东国税局分税种税收完成情况(万元/%)", // 图表标题
      JFreeChart chart = ChartFactory.createPieChart(title, // 图表标题
    dataset, // 数据集
    true, // 是否显示图例(对于简单的柱状图必须是false)
    true, // 是否生成工具
    false // 是否生成URL链接
    );
     // 设置总的背景颜色
       chart.setBackgroundPaint(ChartColor.WHITE);
     // 设置标题颜色
    chart.getTitle().setPaint(ChartColor.black);
   chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
        chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
       
           PiePlot plot = (PiePlot) chart.getPlot();//获取图表区域对象
           plot.setBackgroundPaint(ChartColor.WHITE);
     plot.setLabelFont(new Font("宋体",Font.PLAIN,12));
     plot.setLabelGap(0.01D);//间距
  plot.setNoDataMessage("无对应的数据,请重新查询。");
   //设置无数据时的信息显示颜色
  plot.setNoDataMessagePaint(Color.red);
   // 图片中显示百分比:默认方式
    plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
      StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
    // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值,
    //{2} 表示所占比例 ,小数点后两位
    plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
      "{0}:{2}", NumberFormat.getNumberInstance(),//{0}:{1}({2})
      new DecimalFormat("0.00%")));
    // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
    plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
        "{0}"));
    // 指定图片的透明度(0.0-1.0)
    plot.setForegroundAlpha(1.0f);
    // 指定显示的饼图上圆形(true)还椭圆形(false)
    plot.setCircular(true);
    // 设置图上分类标签label的字体,解决中文乱码
    //plot.setLabelFont(new Font("黑体", Font.PLAIN, 12));
    // 设置图上分类标签label的最大宽度,相对与plot的百分比
    plot.setMaximumLabelWidth(0.2);
    //设置起始角度,默认值为90,当为0时,起始值在3点钟方向
    plot.setStartAngle(45);
      plot.setShadowYOffset(0);//设置阴影对于y轴相对位移为0;
            plot.setShadowXOffset(0);//设置阴影对于 x轴相对位移为 0;
    // 增加url
//    plot.setURLGenerator(new StandardPieURLGenerator("kkhzAction.do?sz="+sz+"&qx_swjgdm="+qx_swjgdm, "kkzt"));
 
    // 设置图标题的字体,解决中文乱码
    TextTitle textTitle = chart.getTitle();
    textTitle.setFont(new Font("黑体", Font.PLAIN, 20));
 
    // 设置背景色为白色
    chart.setBackgroundPaint(Color.white);
    // 设置Legend部分字体,解决中文乱码
    chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
       return chart;
}

----------------------------------------------------------柱状图与折线图综合图--------------------------

 String xml = "";
         xml = dao.getSs();
         CategoryDataset dataset = common.getDataSetSz(xml);//柱状图数据
         CategoryDataset lineDataset =  common.getDataSetSzZfGn(xml);//增幅数据
            // JFreeChart  chart = FreeChartCommon.createBarChartSzwc(xml);
            JFreeChart  chart = FreeChartCommon.createBarLineChartCommon(dataset,lineDataset,"");
            StandardEntityCollection sec = new StandardEntityCollection();
            ChartRenderingInfo info = new ChartRenderingInfo(sec);
            //320是图片长度,240是图片高度
            String filename2 = ServletUtilities.saveChartAsPNG(chart, Integer.parseInt(widtht), Integer.parseInt(heightt) ,info, request.getSession

());
           //  ChartUtilities.writeImageMap(out, "map0", info, false); //我们在IMG标签中加入usemap="#map0"就可以为饼图的每一部分加入链接。
            String graphURL = request.getContextPath()
           + "/servlet/DisplayChart?filename=" + filename2;

 

/**
   * 获取一个柱状图数据集对象
   *
   * @return
   */
  public CategoryDataset getDataSetSz(String xml) {
   DefaultCategoryDataset dataset = new DefaultCategoryDataset();
   try {
    System.out.println("xml++=="+xml);
    if(xml.indexOf("<ROWSET>")!=-1){//如果有数据
     xml=xml.split("<ROWSET>")[1];
     xml=xml.split("</ROWSET>")[0];
     //xml=xml.split("ROW")[1];
     xml = "<ROOT>" + xml + "</ROOT>";
     Document document = DocumentHelper.parseText(xml);
     java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00"); 
     // 读取ITEM
     List list = document.selectNodes("//ROW");
     // 获取NODE细节
     Iterator it = list.iterator();
       String series1 = "累计入库数(万元)";
     while (it.hasNext()) {

      Node node = (Node) it.next();
      String sz = Tools.nullToSpace(node.valueOf("SZ")).trim();
      dataset.addValue(Double.parseDouble(df.format(Double.parseDouble(node.valueOf("BNLJ")))),
        Tools.nullToSpace(series1),
        sz);
//      dataset.addValue(Double.parseDouble(df.format(Double.parseDouble(node.valueOf("BNRK")))),
//        Tools.nullToSpace(series2),
//        sz);
     
     }
    }
     
   } catch (Exception e) {
    
     e.printStackTrace();
    
   }
  
  return dataset;
 } 

 

 /**
   * 柱形图线形图 综合图(公共)
   * @param xml
   * @param sz
   * @return
   */ 
   public static JFreeChart createBarLineChartCommon(CategoryDataset dataset,CategoryDataset lineDataset,String  title){
     
      
       JFreeChart chart = ChartFactory.createBarChart(title, // 图表标题
     "", // 目录轴的显示标签
     "", // 数值轴的显示标签
     dataset, // 数据集
     PlotOrientation.VERTICAL, // 图表方向:水平、垂直
     true, // 是否显示图例(对于简单的柱状图必须是false)
     true, // 是否生成工具
     true // 是否生成URL链接
     );
      // 设置总的背景颜色
      //  chart.setBackgroundPaint(ChartColor.WHITE);
      // 设置标题颜色
       chart.getTitle().setPaint(ChartColor.black);
    //显示每个柱的数值,并修改该数值的字体属性
    chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
       chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
        
         CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
        // 设置表格线为实线
        plot.setDomainGridlineStroke(new BasicStroke());
        plot.setRangeGridlineStroke(new BasicStroke());
        // 设置图的背景颜色
        plot.setBackgroundPaint(ChartColor.WHITE);
        // 设置表格线颜色
        plot.setRangeGridlinePaint(Color.gray.lightGray);
          CategoryAxis domainAxis=plot.getDomainAxis();
          //水平底部列表
          domainAxis.setLabelFont(new Font("宋体",Font.BOLD,14));
          //水平底部标题
          domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));
//         domainAxis.setMaximumCategoryLabelLines(2); // 这边的4代表最多显示4行字
         domainAxis.setCategoryMargin(0.3);//
          //domainAxis.setMaximumCategoryLabelLines(5);
        // domainAxis.setCategoryMargin(20);
         //domainAxis.setLowerMargin(0.3);
          //垂直标题
          ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
          rangeAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
          rangeAxis.setUpperMargin(0.2);
//         rangeAxis.setAutoRangeMinimumSize(10);
//        rangeAxis.setAutoRange(false);
        
       
//        rangeAxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定(默认为true)
//        rangeAxis.setStandardTickUnits(rangeAxis.getStandardTickUnits());//数据轴的数据标签
//        rangeAxis.setLowerBound(0.0); //数据轴上的显示最小值;
//        rangeAxis.setAutoRangeMinimumSize(100000);//1为一个间隔单位
//        plot.setRangeAxis(rangeAxis);
       
       // 得到坐标设置字体解决乱码  
   //CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
   plot.setNoDataMessage("无对应的数据,请重新查询。");
     
        //画折线图
   plot.setDataset(1, lineDataset);//放折线图数据
   plot.mapDatasetToRangeAxis(1, 1);  //折线图与右坐标关联
   plot.setOutlinePaint(Color.white);  //设置图片边框颜色,去掉边框 
       LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
       lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
       plot.setRenderer(1, lineandshaperenderer);
       plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
       LegendTitle legendtitle = new LegendTitle(plot.getRenderer(1));
           
              //右边Y轴,相关属性设置   ,坐标设置
            //  double unit=0.2d;//刻度的长度   
               NumberAxis numberaxis1 = new NumberAxis(""); 
               numberaxis1.setUpperMargin(0.2);
//               unit=Math.floor(50);//刻度的长度   
//              NumberTickUnit ntu= new NumberTickUnit(unit);   
//               numberaxis1.setTickUnit(ntu);   
//              numberaxis1.setRange(0.00,500);//刻度范围   
              plot.setRangeAxis(1, numberaxis1);
              BlockContainer blockcontainer = new BlockContainer(new BorderArrangement());   
              blockcontainer.add(legendtitle, RectangleEdge.RIGHT); 

      BarRenderer renderer  =   new  BarRenderer();//背景立体控制
     // renderer.setItemLabelAnchorOffset(10D);
      renderer.setSeriesPaint(0, Color.decode("#F8D661"));// 给series1 Bar
      renderer.setSeriesPaint(1, Color.decode("#0000FF")); // 给series2 Bar
        renderer.setShadowVisible(false); // 柱状图不显示阴影
         //数据下钻用,给每个柱子做一个连接,指向
       //  renderer.setBaseItemURLGenerator(new StandardCategoryURLGenerator("kkhzAction.do?sz="+sz+"&qx_swjgdm="+qx_swjgdm, "kkzt", "a"));
         plot.setRenderer(renderer);
         //控制数据显示
     //  renderer.setItemLabelGenerator( new  StandardCategoryItemLabelGenerator());
       //  renderer.setItemLabelsVisible( true );
       return chart;
 }

 

本文由站长原创或收集,不代表本站立场,如若转载,请注明出处:http://www.swzhinan.com/post/19.html

共有 3 条评论

  1. avatar

    点我收录您

    能画统计图?

回复给

欢迎点评

联系我们

站长QQ:384827360

站长邮件:384827360@qq.com

工作时间:周一至周五,9:30-15:30,节假日休息

QR code