Java jfreechart 中顯示多個不同類型圖表

本來想在同一個freechart中畫出不同類型的圖表。比如說一個是XYAreaRender一個是XYLinerender.

本例參考例程http://www.java2s.com/Code/Java/Chart/JFreeChartOverlaidXYPlotDemo.htm

實現效果如圖:


代碼如下:

 private JFreeChart createChart() {
       
        // create plot 1 
	//創建XYarea數據,新建XYAreaRenderer實例,並添加至XYplot
        final XYDataset  data1 = createAreaDataset();
        final XYItemRenderer AreaRenderer = new XYAreaRenderer();
        AreaRenderer.setBaseToolTipGenerator(
            new StandardXYToolTipGenerator(
                StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
                new DecimalFormat("##0"), new DecimalFormat("#,##0.00")
            )
        );
	// areadomainAxis指的是橫座標,areaRangeAxis指的是縱座標。
        final ValueAxis areaDomainAxis = new NumberAxis("same x axis");
        final ValueAxis areaRangeAxis = new NumberAxis("axis 1");
        areaDomainAxis.setLowerMargin(0.0);
        areaDomainAxis.setUpperMargin(0.0);
        final XYPlot plot = new XYPlot(data1, areaDomainAxis, areaRangeAxis, AreaRenderer);
        
        // insert a text 
        final double x = new Day(9, SerialDate.MARCH, 2002).getMiddleMillisecond();
        final XYTextAnnotation annotation = new XYTextAnnotation("Hello!", x, 10000.0);
        annotation.setFont(new Font("SansSerif", Font.PLAIN, 9));
        plot.addAnnotation(annotation);

        // add a second XYlineRenderer...
	// 創建XYline數據,設置座標,setAutoRange指的是,座標軸2自動調整範圍與座標軸一分開。
        final XYDataset TransferKey = createTransferDataset();
	// 將dataset指給xyplot,index編號爲1
        plot.setDataset(1, TransferKey);
        final ValueAxis TransferRangeAxis = new NumberAxis("axis 2");
        TransferRangeAxis.setAutoRange(true);
	//將新建的座標軸屬性指給index爲1的座標軸,即本例的右側座標軸,設置位置。
        plot.setRangeAxis(1,TransferRangeAxis);
        plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_RIGHT);
	//新建XYRenderer,並一同加入同一個xyplot,注意SetRender時的座標軸編號。
        final XYItemRenderer Linerenderer = new StandardXYItemRenderer();
        Linerenderer.setBaseToolTipGenerator(
            new StandardXYToolTipGenerator(
                StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
                new DecimalFormat("##0"), new DecimalFormat("0.00")
            )
        );
        
        plot.setRenderer(1, Linerenderer);
	//這句指的是將index爲1 的數據指定給index爲1的座標軸。如果沒有這句的話,第二個數據的座標將按第一個座標軸進行畫圖。
        plot.mapDatasetToRangeAxis(1, 1);
        
        plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

        // return a new chart containing the overlaid plot...
        return new JFreeChart("Transfer Func", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
    }
    
    /**
     * Creates a sample dataset.
     *
     * @return The dataset.
     */
    private XYDataset createAreaDataset() {

        // create dataset 1...
        final XYSeries AreaSeries = new XYSeries("AreaData");
        double value;
        for(int i=0;i<256;i++){
            value = 10*Math.random();
            AreaSeries.add(i, value);
        }
            
        return new XYSeriesCollection(AreaSeries);

    }

    // ****************************************************************************
    // * JFREECHART DEVELOPER GUIDE                                               *
    // * The JFreeChart Developer Guide, written by David Gilbert, is available   *
    // * to purchase from Object Refinery Limited:                                *
    // *                                                                          *
    // * http://www.object-refinery.com/jfreechart/guide.html                     *
    // *                                                                          *
    // * Sales are used to provide funding for the JFreeChart project - please    * 
    // * support us so that we can continue developing free software.             *
    // ****************************************************************************
    
    /**
     * Creates a sample dataset.
     *
     * @return The dataset.
     */
    private XYDataset createTransferDataset() {

        // create createTransferDataset...
         final XYSeries TransferSeries = new XYSeries("AreaData");
       // double value;
        TransferSeries.add(0,0);
        TransferSeries.add(255,1);
        
        return new XYSeriesCollection(TransferSeries);

    }
    
    private void moveBtnActionPerformed(ActionEvent evt) {                                        
        // TODO add your handling code here:
         /*
         * 
         */
   //     super(title);


        final JFreeChart chart = createChart();
	//以下是將jfreechart指給特定JPanel空間進行顯示。注意最後三句必不可少。一定要設置JPanel的Layout爲BorderLayout()
        final ChartPanel chartPanel = new ChartPanel(chart);
        FreeChartpanel.setLayout(new java.awt.BorderLayout());
        FreeChartpanel.add(chartPanel,BorderLayout.CENTER);
        FreeChartpanel.validate();
        
        /*
         * 
         */
    }                                       

以上內容有部分參考和自己思考。希望對大家有所幫助哦~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章