重點使用JFreeChart畫混合圖及相關柱狀圖﹑折線圖

这篇博客详细介绍了如何利用JFreeChart库在Java中绘制混合图表,包括柱状图和折线图的组合。通过示例代码展示了如何创建数据集、设置图表样式和标签,以及处理不同类型的图表数据,帮助开发者掌握JFreeChart的使用技巧。
 

使用JFreeChart畫多種圖

示例一﹕

混合圖(柱狀圖+折線圖)

混合圖中﹐數據集自修改﹗如是練習﹐可先查看后面單獨的柱狀圖和折線圖后﹐再回頭練習。

與單獨創建單獨的圖形區別重點在映射折線數據集(紅色部分)。在最后示例四中﹐將會附上可以單獨直接制圖的方法(直接帶數據集)

 

        public void getpic3(HttpServletResponse response,List<BadListVo> badlist,Integer sumCountErrorNum){

                //創建柱狀圖數據集

                DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();

                for(int i=0;i<badlist.size();i++){

                        BadListVo badlistvo = new BadListVo();

                        badlistvo = badlist.get(i);                             dataset2.addValue(Double.valueOf(badlistvo.getCountErrorNum()),"",badlistvo.getProId());

                }

                  Font labelFont = new Font("宋体", Font.BOLD, 12);

                  JFreeChart chart = ChartFactory.createBarChart3D("不良柏拉圖","", "不合格批數", dataset2, PlotOrientation.VERTICAL,true,true,true);     

                  CategoryPlot plot = chart.getCategoryPlot();//獲得圖表區域對象

          org.jfree.chart.renderer.category.BarRenderer3D renderer;

          renderer = new org.jfree.chart.renderer.category.BarRenderer3D();        

          renderer.setItemLabelsVisible(true);

//        y軸設置

          ValueAxis rangeAxis = plot.getRangeAxis();

          rangeAxis.setLabelFont(labelFont);

          rangeAxis.setTickLabelFont(labelFont);

          rangeAxis.setUpperBound(sumCountErrorNum);//設置Y軸數值 最大 sumCountErrorNum

          rangeAxis.setLowerMargin(0.05); //         設置最低的一個Item與圖片底端的距離

          rangeAxis.setUpperMargin(0.05);

          plot.setRangeAxis(rangeAxis);        

          renderer.setMaxBarWidth(0.1);//設置柱體寬度

          //顯示柱體的數值

          renderer.setItemLabelGenerator( new  StandardCategoryItemLabelGenerator());

          renderer.setItemLabelsVisible( true );

          //renderer.setMinimumBarLength(0.5);//設置柱體高度

          plot.setRenderer(renderer);

          //設置圖表的縱軸和橫軸org.jfree.chart.axis.CategoryAxis

          org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();

          domainAxis.setTickLabelFont(labelFont);//

          domainAxis.setCategoryMargin(0.1);//橫軸標簽之間的距離10%

          domainAxis.setMaximumCategoryLabelWidthRatio(4f);// 橫軸上的 Lable 是否完整顯示

          domainAxis.setUpperMargin(0.05);

          domainAxis.setLowerMargin(0.05);

//        LableMath.PI/3.0)度傾斜

          domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 7.0));   

                  chart.setAntiAlias(true);

                  chart.setBackgroundPaint(Color.WHITE);

                  chart.setBorderPaint(Color.BLACK);

                  chart.setBorderVisible(true);

                 

                        //創建折線圖數據集

                        DefaultCategoryDataset dataset = new DefaultCategoryDataset();

                          Double errorR = 0.0;

                          String proId = null;

                                for(int i=0;i<badlist.size();i++){

 

                                        BadListVo badlistvo = new BadListVo();

                                        badlistvo = badlist.get(i);

                                        errorR = errorR+Double.valueOf(badlistvo.getErrorRate());

                                        proId = badlistvo.getProId();

                                        dataset.addValue(errorR, "", proId);                     

                                }

//映射折線數據集----

                                plot.setDataset(1, dataset);

                                plot.mapDatasetToRangeAxis(1, 1);

                        //CategoryAxis categoryaxis = plot.getDomainAxis();

                       // categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);

                        NumberAxis numberaxis = new NumberAxis("不合格比率");//折線Y軸名稱(右邊)

                        numberaxis.setLabelFont(labelFont);

                        plot.setRangeAxis(1, numberaxis);

                        //定義折線顯示樣式

                        LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();

                        lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());

                        //設置數據點數據顯示

                        lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());

                        lineandshaperenderer.setBaseItemLabelsVisible(true);

                        plot.setRenderer(1, lineandshaperenderer);

                        plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

                        LegendTitle legendtitle = new LegendTitle(plot.getRenderer(0));

                        legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));

                        legendtitle.setBorder(new BlockBorder());

                        LegendTitle legendtitle1 = new LegendTitle(plot.getRenderer(1));

                        legendtitle1.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));

                        legendtitle1.setBorder(new BlockBorder());

                        BlockContainer blockcontainer = new BlockContainer(new BorderArrangement());

                        blockcontainer.add(legendtitle, RectangleEdge.LEFT);

                        blockcontainer.add(legendtitle1, RectangleEdge.RIGHT);

                        blockcontainer.add(new EmptyBlock(2000D, 0.0D));

                        CompositeTitle compositetitle = new CompositeTitle(blockcontainer);

                        compositetitle.setPosition(RectangleEdge.BOTTOM);

                        chart.addSubtitle(compositetitle);

                  try{  

                    // 保存圖片到指定文件夾

                               java.util.Date d = new java.util.Date();

                                String filename = String.valueOf(d.getTime());//368 278

                          ChartUtilities.saveChartAsJPEG(new File("C://tomcat6/webapps/****/images/monthQualityPic/BarChart3.jpg"), chart, 468, 378);

                  } catch (Exception e){

                           System.err.println("Problem occurred creating chart!"+e.getMessage());

                  }

        }

 

示例二﹕

柱狀圖﹕

關于數據集部分﹐請參看其他文章。在這就不做詳細解釋。主要是為了與混合圖中的數據集相對應。

 

public void getpic(HttpServletResponse response,List<BadListVo> badlist,Integer sumCountErrorNum){

                //創建一個柱狀圖

                DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();

                for(int i=0;i<badlist.size();i++){

                        BadListVo badlistvo = new BadListVo();

                        badlistvo = badlist.get(i);

                        dataset2.addValue(Double.valueOf(badlistvo.getErrorRate()),"",badlistvo.getProId());

                }

                Font labelFont = new Font("宋体", Font.BOLD, 12);

                  JFreeChart chart = ChartFactory.createBarChart3D("不良比例圖","料號", "不合格比率", dataset2, PlotOrientation.VERTICAL,true,true,true);             

                  CategoryPlot plot = chart.getCategoryPlot();//獲得圖表區域對象

          org.jfree.chart.renderer.category.BarRenderer3D renderer;

          renderer = new org.jfree.chart.renderer.category.BarRenderer3D();         

          renderer.setItemLabelsVisible(true);

//        y軸設置

          ValueAxis rangeAxis = plot.getRangeAxis();

          rangeAxis.setLabelFont(labelFont);

          rangeAxis.setTickLabelFont(labelFont);

          rangeAxis.setUpperBound(100);//設置Y軸數值 最大100 sumCountErrorNum

          rangeAxis.setLowerMargin(0.15); //         設置最低的一個Item與圖片底端的距離

          plot.setRangeAxis(rangeAxis);         

          renderer.setMaxBarWidth(0.1);//設置柱體寬度

          plot.setRenderer(renderer);

          org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();

          domainAxis.setTickLabelFont(labelFont);//

          domainAxis.setCategoryMargin(0.1);//橫軸標簽之間的距離10%

          domainAxis.setMaximumCategoryLabelWidthRatio(4f);// 橫軸上的 Lable 是否完整顯示

//        LableMath.PI/3.0)度傾斜

          domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 7.0));

                  chart.setAntiAlias(true);

                  chart.setBackgroundPaint(Color.WHITE);

                  chart.setBorderPaint(Color.BLACK);

                  chart.setBorderVisible(true);

                  try{  

                    // 保存圖片到指定文件夾

                               java.util.Date d = new java.util.Date();

                                String filename = String.valueOf(d.getTime());

                          ChartUtilities.saveChartAsJPEG(new File("C://tomcat-6.0.16/webapps/****/images/monthQualityPic/BarChart.jpg"), chart, 368, 278);

                  } catch (Exception e){

                           System.err.println("Problem occurred creating chart!"+e.getMessage());

                  }

        }

 

 

示例三﹕

折線圖

 

        public void getpic2(HttpServletResponse response,List<BadListVo> badlist){

          //曲線圖/

                String title = "不良柏拉圖";//曲線圖標題

                String domain = "料號";//X

                String range = "不合格比率";//Y

                String subtitleStr = "月品質分析";//曲線圖自標題       

                DefaultCategoryDataset dataset = new DefaultCategoryDataset();

                  Double errorR = 0.0;

                  String proId = null;

                        for(int i=0;i<badlist.size();i++){

 

                                BadListVo badlistvo = new BadListVo();

                                badlistvo = badlist.get(i);

                                errorR = errorR+Double.valueOf(badlistvo.getErrorRate());

                                proId = badlistvo.getProId();

                                dataset.addValue(errorR, "", proId);                     

                        }

                        JFreeChart chart2 = ChartFactory.createLineChart(

                                        title, // title

                                        domain, // x-axis label

                                        range, // y-axis label

                                        dataset, // data

                                        PlotOrientation.VERTICAL,

                                        true, // create legend?

                                        true, // generate tooltips?

                                        false // generate URLs?

                                        );

                          CategoryPlot plot = chart2.getCategoryPlot();//獲得圖表區域對象

                  Font labelFont = new Font("宋体", Font.BOLD, 12);

                  //x // 分類X軸網絡是否可見

                  plot.setDomainGridlinesVisible(true);

                  //y軸設置

                  ValueAxis rangeAxis = plot.getRangeAxis();

                  rangeAxis.setLabelFont(labelFont);

                  rangeAxis.setTickLabelFont(labelFont);

                  //             分類Y軸網絡是否可見

                  plot.setRangeGridlinesVisible(true);

                  plot.setRangeAxis(rangeAxis);

 

                  //設置圖表的縱軸和橫軸org.jfree.chart.axis.CategoryAxis

                  org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();

                  domainAxis.setTickLabelFont(labelFont);//

                  domainAxis.setCategoryMargin(0.1);//橫軸標簽之間的距離10%

                  domainAxis.setMaximumCategoryLabelWidthRatio(4f);// 橫軸上的 Lable 是否完整顯示

//                LableMath.PI/3.0)度傾斜

                  domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 7.0));

                           

                  NumberAxis numberaxis = (NumberAxis)plot.getRangeAxis();

                  numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

                  numberaxis.setAutoRangeIncludesZero(true);

                  LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)plot.getRenderer();

                  lineandshaperenderer.setBaseItemLabelsVisible(true);

                  lineandshaperenderer.setBaseCreateEntities(true);

                  lineandshaperenderer.setLinesVisible(true);//設置數據點聯線

                  lineandshaperenderer.setShapesVisible(true);//設置顯示數據點

                  //設置數據點數據顯示

                  lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());

                  lineandshaperenderer.setBaseItemLabelsVisible(true);

                          chart2.setAntiAlias(true);

                          chart2.setBackgroundPaint(Color.WHITE);

                          chart2.setBorderPaint(Color.BLACK);

                          chart2.setBorderVisible(true);

                          XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();

                        try{  

                                // 保存圖片到指定文件夾

                                java.util.Date d = new java.util.Date();

                                String filename = String.valueOf(d.getTime());

                                ChartUtilities.saveChartAsJPEG(new File("C://tomcat-6.0.16/webapps/****/images/monthQualityPic/BarChart2.jpg"), chart2, 368, 278);

                                }catch(Exception e){

                                        System.err.println("Problem occurred creating chart.");

                                }

        }

 

 

示例四﹕

混合圖(帶數據集)可以直接使用看圖片效果

 

public void getpic4(HttpServletResponse response,List<BadListVo> badlist,Integer sumCountErrorNum){

 

        String s = "S1";

        String s1 = "S2";

        String s2 = "S3";

 

        String s3 = "Cate 1";

        String s4 = "Cate 2";

        String s5 = "Cate 3";

        String s6 = "Cate 4";

        String s7 = "Cate 5";

        String s8 = "Cate 6";

        String s9 = "Cate 7";

        String s10 = "Cate 8";

 

        DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();

        defaultcategorydataset.addValue(1.0D, s, s3);

        defaultcategorydataset.addValue(4D, s, s4);

        defaultcategorydataset.addValue(3D, s, s5);

        defaultcategorydataset.addValue(5D, s, s6);

        defaultcategorydataset.addValue(5D, s, s7);

        defaultcategorydataset.addValue(7D, s, s8);

        defaultcategorydataset.addValue(7D, s, s9);

        defaultcategorydataset.addValue(8D, s, s10);

        defaultcategorydataset.addValue(5D, s1, s3);

        defaultcategorydataset.addValue(7D, s1, s4);

        defaultcategorydataset.addValue(6D, s1, s5);

        defaultcategorydataset.addValue(8D, s1, s6);

        defaultcategorydataset.addValue(4D, s1, s7);

        defaultcategorydataset.addValue(4D, s1, s8);

        defaultcategorydataset.addValue(2D, s1, s9);

        defaultcategorydataset.addValue(1.0D, s1, s10);

        defaultcategorydataset.addValue(4D, s2, s3);

        defaultcategorydataset.addValue(3D, s2, s4);

        defaultcategorydataset.addValue(2D, s2, s5);

        defaultcategorydataset.addValue(3D, s2, s6);

        defaultcategorydataset.addValue(6D, s2, s7);

        defaultcategorydataset.addValue(3D, s2, s8);

        defaultcategorydataset.addValue(4D, s2, s9);

        defaultcategorydataset.addValue(3D, s2, s10);

 

//--chart--------------

        JFreeChart jfreechart = ChartFactory.createBarChart("Dual Axis Chart", "Category", "Value", defaultcategorydataset ,      PlotOrientation.VERTICAL, false, true, false);

        jfreechart.setBackgroundPaint(Color.white);

        CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();

        categoryplot.setBackgroundPaint(new Color(238, 238, 255));

        categoryplot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

//---------------------------------------

 

        DefaultCategoryDataset defaultcategorydataset2 = new DefaultCategoryDataset();

        defaultcategorydataset2.addValue(15D, "S4", "Cate1");

        defaultcategorydataset2.addValue(24D, "S4", "Cate2");

        defaultcategorydataset2.addValue(31D, "S4", "Cate3");

        defaultcategorydataset2.addValue(25D, "S4", "Cate4");

        defaultcategorydataset2.addValue(56D, "S4", "Cate5");

        defaultcategorydataset2.addValue(37D, "S4", "Cate6");

        defaultcategorydataset2.addValue(77D, "S4", "Cate7");

        defaultcategorydataset2.addValue(18D, "S4", "Cate8");

  

        categoryplot.setDataset(1, defaultcategorydataset2);

        categoryplot.mapDatasetToRangeAxis(1, 1);

        CategoryAxis categoryaxis = categoryplot.getDomainAxis();

        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);

        NumberAxis numberaxis = new NumberAxis("Secondary");

        categoryplot.setRangeAxis(1, numberaxis);

 

        LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();

        lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());

        categoryplot.setRenderer(1, lineandshaperenderer);

        categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

        LegendTitle legendtitle = new LegendTitle(categoryplot.getRenderer(0));

        legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));

        legendtitle.setBorder(new BlockBorder());

        LegendTitle legendtitle1 = new LegendTitle(categoryplot.getRenderer(1));

        legendtitle1.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));

        legendtitle1.setBorder(new BlockBorder());

        BlockContainer blockcontainer = new BlockContainer(new BorderArrangement());

        blockcontainer.add(legendtitle, RectangleEdge.LEFT);

        blockcontainer.add(legendtitle1, RectangleEdge.RIGHT);

        blockcontainer.add(new EmptyBlock(2000D, 0.0D));

        CompositeTitle compositetitle = new CompositeTitle(blockcontainer);

        compositetitle.setPosition(RectangleEdge.BOTTOM);

        jfreechart.addSubtitle(compositetitle);

          try{

                    // 保存圖片到指定文件夾

                               java.util.Date d = new java.util.Date();

                                String filename = String.valueOf(d.getTime());

                          ChartUtilities.saveChartAsJPEG(new File("C://tomcat-6.0.16/webapps/racherVDRS/images/monthQualityPic/BarChart4.jpg"), jfreechart, 368, 278);

                    //ChartUtilities.saveChartAsJPEG(new File("F://BarChart.jpg"), chart, 368, 278);

                  } catch (Exception e){

                           System.err.println("Problem occurred creating chart!"+e.getMessage());

                  }

        }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值