java畫折線圖和柱狀圖結合的綜合圖(用jfreechart)

最近項目增加了需求,想要下載折線圖和柱狀圖結合的綜合圖。我查了一會兒,要實現這個功能,我使用了這兩個第三方包了:

  1. jfreechart-1.0.19.jar
  2. jcommon-1.0.23.jar

效果:

這裏寫圖片描述

步驟:

①、導入其相應的 jcommon-1.0.23.jar和 jfreechart-1.0.19.jar文件
②、下面就可以寫實現功能的代碼了

import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis3D;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis3D;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

public class test {

    public static void main(String[] args) {

        //折線圖數據
        DefaultCategoryDataset lineDataset = new DefaultCategoryDataset();
            //添加數據
            lineDataset.addValue(9, "", "語文");
            lineDataset.addValue(7, "", "數學");
            lineDataset.addValue(6, "", "英語");
            lineDataset.addValue(4, "", "物理");
            lineDataset.addValue(3, "", "化學");
            lineDataset.addValue(2, "", "生物");

        //柱狀圖數據
         DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            //添加數據
            dataset.addValue(4, "", "語文");
            dataset.addValue(7, "", "數學");
            dataset.addValue(6, "", "英語");
            dataset.addValue(5, "", "物理");
            dataset.addValue(3, "", "化學");
            dataset.addValue(9, "", "生物");

          //生成的柱狀圖
          JFreeChart chart = ChartFactory.createBarChart3D(
                   "科目成績",
                   "科目",//X軸的標籤 
                   "分數",//Y軸的標籤 
                   dataset, //圖標顯示的數據集合
                   PlotOrientation.VERTICAL, //圖像的顯示形式(水平或者垂直)
                   false,//是否顯示子標題 
                   false,//是否生成提示的標籤 
                   false); //是否生成URL鏈接

            /*
             * 處理圖形上的亂碼
             */

            //處理主標題的亂碼
            chart.getTitle().setFont(new Font("黑體",Font.BOLD,18));

            //獲取圖表區域對象
            CategoryPlot categoryPlot = (CategoryPlot)chart.getPlot();

            //獲取X軸的對象
            CategoryAxis3D categoryAxis3D = (CategoryAxis3D)categoryPlot.getDomainAxis();

            //獲取Y軸的對象
            NumberAxis3D numberAxis3D = (NumberAxis3D)categoryPlot.getRangeAxis();

            //處理X軸上的亂碼
            categoryAxis3D.setTickLabelFont(new Font("黑體",Font.BOLD,10));

            //處理X軸外的亂碼
            categoryAxis3D.setLabelFont(new Font("黑體",Font.BOLD,10));

            //處理Y軸上的亂碼
            numberAxis3D.setTickLabelFont(new Font("黑體",Font.BOLD,10));

            //處理Y軸外的亂碼
            numberAxis3D.setLabelFont(new Font("黑體",Font.BOLD,10));

            //自定義Y軸上顯示的刻度,以10作爲1格
            numberAxis3D.setAutoTickUnitSelection(false);
            NumberTickUnit unit = new NumberTickUnit(1); 
            numberAxis3D.setTickUnit(unit);

            //獲取繪圖區域對象
            BarRenderer3D barRenderer3D = (BarRenderer3D)categoryPlot.getRenderer();

            //設置柱形圖的寬度
            barRenderer3D.setMaximumBarWidth(0.07);

            //在圖形上顯示數字
            barRenderer3D.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            barRenderer3D.setBaseItemLabelsVisible(true);
            barRenderer3D.setBaseItemLabelFont(new Font("宋體",Font.BOLD,10));

            /*
             * 放折線圖數據
             */
            categoryPlot.setDataset(1, lineDataset);
            //設置折線
            LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
            lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
            categoryPlot.setRenderer(1, lineandshaperenderer);
            // 柱狀圖和縱軸緊靠
            categoryAxis3D.setLowerMargin(0.0); 

            categoryAxis3D.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
            //折線在柱面前面顯示
            categoryPlot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

             /*
              * 在E盤目錄下生成圖片
              */
            File file = new File("e:\\a.png");
            try {
                 ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
                } catch (IOException e) {
                   e.printStackTrace();
              }

    }

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