JfreeChart做折線圖

package org.com.testJfreechart;


import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class TestJfreeChart3 {
    //生成折線圖的寬高
    private static final int width = 900;
    private static final int height = 400;
    //折線圖標題、橫座標、縱座標
    private static final String title="利益演示圖";
    private static final String xString="被保險人年齡";
    private static final String yString="個人賬戶價值(萬元)";
    private static final String Z_String="部分領取(元)";
    //折線圖不同顏色線條所代表的含義   個人賬戶價值低中高  、部分領取
    private static final String funderbalLow = "個人賬戶價值(低)";
    private static final String funderbalMid = "個人賬戶價值(中)";
    private static final String funderbalHig = "個人賬戶價值(高)";
    private static final String getPart = "部分領取";
    //字體顏色
    private static final String blackBold ="黑體";
    private static final String luShu ="隸書";
    //輸出圖片png名稱及路徑
    private static final String outFilePath ="D:/out_picture.png";
    //折線圖  JfreeChart
    private static JFreeChart  creatChart(XYDataset dataset) {
        //創建XYLineChart
        JFreeChart chart=ChartFactory.createXYLineChart(title, xString, //X軸標籤
                yString, //Y軸標籤
                dataset, PlotOrientation.VERTICAL, true, false, false);
        //使用XYPlot設置各種參數
        XYPlot xyPlot=chart.getXYPlot();
        //設置背景色透明度
        xyPlot.setBackgroundAlpha(0.5f);
        //設置前景色透明度
        xyPlot.setForegroundAlpha(0.5f);
        // 曲線圖        
        XYLineAndShapeRenderer xyLineAndShapeRenderer = (XYLineAndShapeRenderer)xyPlot.getRenderer();
        //設置線條爲數據點
        xyLineAndShapeRenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1,1.0F, new float[] { 1F, 6F }, 0.0F));
        xyLineAndShapeRenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1,1.0F, new float[] { 1F, 6F }, 0.0F));
        xyLineAndShapeRenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1,1.0F, new float[] { 1F, 6F }, 0.0F));
        // 設置線顏色
        // “個人賬戶價值”曲線的顏色: 曲線顏色 高 紫紅色RGB(156,0,88), 中 紅色 RGB(211,17,69),  低 藍色 RGB( 0, 115, 174) 以符合公司VI3.0
        xyLineAndShapeRenderer.setSeriesPaint(0, new Color(0, 115, 174));
        xyLineAndShapeRenderer.setSeriesPaint(1, new Color(211, 17, 69));
        xyLineAndShapeRenderer.setSeriesPaint(2, new Color(156, 0, 88));
        xyLineAndShapeRenderer.setSeriesPaint(3, new Color(30, 0, 88));//部分領取顏色
        TextTitle textTitle=new TextTitle("",new Font(blackBold,Font.BOLD,12));
        chart.addSubtitle(textTitle);
        chart.setTitle(new TextTitle(title, new Font(luShu, Font.ITALIC, 15)));
        chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 0,1000,Color.BLUE));
        //解決中文亂碼問題 ValueAxis爲橫座標 NumberAxis爲縱座標
        Font font = new Font("SimSun", 10, 20);
        NumberAxis rangeAxis = (NumberAxis) xyPlot.getRangeAxis();
        rangeAxis.setLabelFont(font);
        ValueAxis domainAxis = xyPlot.getDomainAxis();
        domainAxis.setLabelFont(font);
        //解決折線圖最下方的中文亂碼
        chart.getLegend().setItemFont(font);        
         // 輸出文件到指定目錄  
        try {  
            ChartUtilities.saveChartAsPNG(new File(outFilePath), chart, width, height);  
        } catch (IOException exz) {  
            System.out.print("....Cant’t Create image File");  
        }           
        return chart;                
    }    
    private static XYDataset creatXYDataset(Object[] datas) {
        //創建時間數據源
        XYSeriesCollection xySeriesCollection=new XYSeriesCollection();
        XYSeries xyLineSeries1 = new XYSeries(funderbalLow);
        XYSeries xyLineSeries2 = new XYSeries(funderbalMid);
        XYSeries xyLineSeries3 = new XYSeries(funderbalHig);
        XYSeries xyBarSeries = new XYSeries(getPart);
        Map<Integer,Double> map = new HashMap<Integer, Double>();
        int mapLength = 0;
        if(datas != null && datas.length>0){
            map=(HashMap<Integer, Double>) datas[0];
            if(map != null && map.size()>0){
                mapLength = map.size();
                for(int i=0,j=0;i<mapLength && j<datas.length;i++){
                    Map<Integer,Double> data = new HashMap<Integer, Double>();
                    data=(Map<Integer, Double>) datas[j];
                    if(j==0){
                        xyLineSeries1.add(i, data.get(i));//設置橫縱座標值
                    }else if(j==1){
                        xyLineSeries2.add(i, data.get(i));
                    }else if(j==2){
                        xyLineSeries3.add(i,data.get(i));
                    }else{
                        xyBarSeries.add(i, data.get(i));
                    }                                                                                
                    if(i==mapLength-1){
                        j++;
                        i=-1;
                    }
                }
            }
        }                
        xySeriesCollection.addSeries(xyLineSeries1);
        xySeriesCollection.addSeries(xyLineSeries2);
        xySeriesCollection.addSeries(xyLineSeries3);
        xySeriesCollection.addSeries(xyBarSeries);
        return xySeriesCollection;
    }
    //模擬填充數據  總共4中數據  key:橫座標     value:縱座標
    public static Object[] getDatas(){
        Object[] objects=new Object[4];        
        for(int i = 0;i<objects.length;i++){
            Map<Integer,Double> map = new HashMap<Integer, Double>();
            for(int j=0;j<15;j++){
                map.put(j,Math.random());
            }
            objects[i]=map;
        }                
        return objects;
    }
    public static void main(String[] args) {
        //第一步,創建XYDataSet對象(接口) 準備數據
        XYDataset dataset=creatXYDataset(getDatas());
        //第二部,根據sataSet對象生成JfreeChart,並做相應設置
        creatChart(dataset);
    }
}
----------注:需要導入jar包。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章