JFreeChart多坐標軸曲線圖


jar包:
jcommon-1.0.23.jar
jfreechart-1.0.19.jar

maven配置:

        <dependency>
            <groupId>jfree</groupId>
            <artifactId>jfreechart</artifactId>
            <version>1.0.19</version>
        </dependency>
        
        <dependency>
            <groupId>jfree</groupId>
            <artifactId>jcommon</artifactId>
            <version>1.0.23</version>
        </dependency>

示例代碼:

package com.test;

import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.data.time.Minute;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;

public class CreateChart {

    // 日志記錄
    private static Logger logger = Logger.getLogger(CreateChart.class);

    // 備用顏色
    private static final Color color1 = new Color(127, 127, 127);
    private static final Color color2 = new Color(136, 0, 21);
    private static final Color color3 = new Color(237, 28, 36);
    private static final Color color4 = new Color(255, 127, 39);
    private static final Color color5 = new Color(255, 242, 0);
    private static final Color color6 = new Color(34, 177, 76);

    /**
     * 圖片生成
     */
    public boolean createChart() {
        try {
            // 解決中文亂碼問題 -- begin
            StandardChartTheme standardChartTheme = new StandardChartTheme("CN");// 創建主題樣式
            standardChartTheme.setExtraLargeFont(new Font("黑體", Font.BOLD, 20));// 設置標題字體
            standardChartTheme.setRegularFont(new Font("黑體", Font.PLAIN, 15));// 設置圖例的字體
            standardChartTheme.setLargeFont(new Font("黑體", Font.PLAIN, 15));// 設置(時間)軸向的字體
            ChartFactory.setChartTheme(standardChartTheme);// 應用主題樣式
            // 解決中文亂碼問題 -- end

            String title = "jfreeChart數據曲線圖";// 標題名稱

            Map<String, XYDataset> map = createDataset(); // 生成需要格式的數據集

            JFreeChart jfreechart = ChartFactory.createTimeSeriesChart( // 創建chart對象
                    title, // 圖標標題
                    null, // 橫軸標題
                    null, // 縱軸標題
                    null, // 數據集
                    true, // 是否顯示圖例標識
                    true, // 是否顯示toolTips
                    false // 是否支持超鏈接
                    );
            jfreechart.setBackgroundPaint(Color.white); // 設置畫布背景色

            // 獲取繪圖區對象
            XYPlot plot = (XYPlot) jfreechart.getPlot();

            // 給繪圖區對象設置屬性
            plot.setOrientation(PlotOrientation.VERTICAL); // 數據區的方向
            plot.setBackgroundPaint(Color.lightGray); // 背景色
            plot.setDomainGridlinePaint(Color.white); // 分類軸網格線條顏色
            plot.setRangeGridlinePaint(Color.white); // 數據軸網格線條顏色
            plot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); // 坐標軸到數據區的間距
            plot.getRangeAxis().setFixedDimension(40D); // 坐標軸距左邊距離

            // 設置軸1--數據匹配
            NumberAxis axis0 = new NumberAxis("多軸-軸1");
            axis0.setLabelFont(new Font("黑體", Font.PLAIN, 12));// y軸字體
            plot.setRangeAxis(0, axis0);
            plot.setDataset(0, map.get("dataSet1"));
            plot.mapDatasetToRangeAxis(0, 0);

            // 設置軸2--數據匹配
            NumberAxis axis1 = new NumberAxis("多軸-軸2");
            axis1.setLabelFont(new Font("黑體", Font.PLAIN, 12));// y軸字體
            plot.setRangeAxis(1, axis1);
            plot.setDataset(1, map.get("dataSet2"));
            plot.mapDatasetToRangeAxis(1, 1);

            // 設置軸3--數據匹配
            NumberAxis axis2 = new NumberAxis("多軸-軸3");
            axis2.setLabelFont(new Font("黑體", Font.PLAIN, 12));// y軸字體
            plot.setRangeAxis(2, axis2);
            plot.setDataset(2, map.get("dataSet3"));
            plot.mapDatasetToRangeAxis(2, 2);

            // 坐標軸1--曲線顏色
            StandardXYItemRenderer renderer0 = new StandardXYItemRenderer();
            renderer0.setSeriesPaint(0, color1);
            renderer0.setLegendTextPaint(0, color1);// 設置對應圖例字體顏色

            renderer0.setSeriesPaint(1, color2);
            renderer0.setLegendTextPaint(1, color2);// 設置對應圖例字體顏色

            plot.setRenderer(0, renderer0);

            // 坐標軸2--曲線顏色
            StandardXYItemRenderer renderer1 = new StandardXYItemRenderer();
            renderer1.setSeriesPaint(0, color3);
            renderer1.setLegendTextPaint(0, color3);// 設置對應圖例字體顏色

            renderer1.setSeriesPaint(1, color4);
            renderer1.setLegendTextPaint(1, color4);// 設置對應圖例字體顏色

            plot.setRenderer(1, renderer1);

            // 坐標軸3--曲線顏色
            StandardXYItemRenderer renderer2 = new StandardXYItemRenderer();
            renderer2.setSeriesPaint(0, color5);
            renderer2.setLegendTextPaint(0, color5);// 設置對應圖例字體顏色

            renderer2.setSeriesPaint(1, color6);
            renderer2.setLegendTextPaint(1, color6);// 設置對應圖例字體顏色

            plot.setRenderer(2, renderer2);

            // 3. 保存chart圖標
            String filePath = "D:\\Chart";// 圖片保存地址
            String fileName = "testJFreeChart";
            File fos_jpg = new File(filePath + "/" + fileName + ".jpg "); // 需要保存到的文件地址和名稱
            if (!fos_jpg.getParentFile().exists()) {
                fos_jpg.getParentFile().mkdirs();
            }
            ChartUtilities.saveChartAsJPEG( //
                    fos_jpg, // 需要保存到的文件對象
                    jfreechart, // 統計圖表對象
                    1000, //
                    600 //
                    );
            logger.info("繪圖完成!");
        } catch (Exception e) {
            logger.error(e);
        }
        return true;
    }

    @SuppressWarnings("deprecation")
    private Map<String, XYDataset> createDataset() {
        // 定義返回結果集
        Map<String, XYDataset> map = new HashMap<String, XYDataset>();

        // 軸1數據
        TimeSeries axis0_data1 = new TimeSeries("axis0_data1", org.jfree.data.time.Minute.class);
        TimeSeries axis0_data2 = new TimeSeries("axis0_data2", org.jfree.data.time.Minute.class);
        // 軸2數據
        TimeSeries axis1_data1 = new TimeSeries("axis1_data1", org.jfree.data.time.Minute.class);
        TimeSeries axis1_data2 = new TimeSeries("axis1_data2", org.jfree.data.time.Minute.class);
        // 軸3數據
        TimeSeries axis2_data1 = new TimeSeries("axis2_data1", org.jfree.data.time.Minute.class);
        TimeSeries axis2_data2 = new TimeSeries("axis2_data2", org.jfree.data.time.Minute.class);

        for (int i = 0; i < 168; i++) {
            // 軸1數據
            axis0_data1.add(new Minute(getDate(i)), Math.random() * 10 + 30);
            axis0_data2.add(new Minute(getDate(i)), Math.random() * 10 + 30);
            // 軸2數據
            axis1_data1.add(new Minute(getDate(i)), Math.random() * 100 + 200);
            axis1_data2.add(new Minute(getDate(i)), Math.random() * 100 + 200);
            // 軸3數據
            axis2_data1.add(new Minute(getDate(i)), Math.random() * 1000 + 1000);
            axis2_data2.add(new Minute(getDate(i)), Math.random() * 1000 + 1000);
        }
        TimeSeriesCollection dataSet1 = new TimeSeriesCollection();
        TimeSeriesCollection dataSet2 = new TimeSeriesCollection();
        TimeSeriesCollection dataSet3 = new TimeSeriesCollection();
        // 軸1數據
        dataSet1.addSeries(axis0_data1);
        // dataSet1.addSeries(axis0_data2);
        // 軸2數據
        dataSet2.addSeries(axis1_data1);
        // dataSet2.addSeries(axis1_data2);
        // 軸3數據
        dataSet3.addSeries(axis2_data1);
        // dataSet3.addSeries(axis2_data2);

        map.put("dataSet1", dataSet1);
        map.put("dataSet2", dataSet2);
        map.put("dataSet3", dataSet3);

        return map;
    }

    /**
     * 模擬時間
     */
    public Date getDate(int i) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, -i);
        return calendar.getTime();
    }

    /**
     * test Main
     */
    public static void main(String[] args) {
        new CreateChart().createChart();
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM