使用JFreeChart繪制2D和3D折線圖

jopen 11年前發布 | 50K 次閱讀 JFreeChart 圖表/報表制作

這是一個Web Project

 

首先是web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>DisplayChart</servlet-name>
        <!-- JFreechart提供的DisplayChart用來以流的形式從臨時目錄中將圖片發送到瀏覽器上 -->
        <!-- 使用時需要為其傳送一個filename參數,詳見com.jadyer.servlet.ImageServlet -->
        <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ImageServlet</servlet-name>
        <servlet-class>com.jadyer.servlet.ImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DisplayChart</servlet-name>
        <url-pattern>/servlet/DisplayChart</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ImageServlet</servlet-name>
        <url-pattern>/servlet/imageServlet</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

下面是用于選擇生成圖片類型的index.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<h1>查看統計報表</h1>
<h2><a href="<%=request.getContextPath()%>/servlet/imageServlet">普通樣式</a></h2>
<h2><a href="<%=request.getContextPath()%>/servlet/imageServlet?style=3D">3D樣式</a></h2>

下面是用于顯示所生成的折線圖的result.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<img src="${imageURL}" border="1"/>
<br/><br/>
<h2><a href="<%=request.getContextPath()%>/index.jsp">返回</a></h2>

最后是用于生成折線圖的ImageServlet.java

package com.jadyer.servlet;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 * 使用JFreeChart繪制2D和3D折線圖
 * @create Jun 25, 2013 9:58:11 PM
 * @author 玄玉<http://blog.csdn.net/jadyer>
 */
public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = -2942367547538171657L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //顯示樣式(是否為3D效果)
        String style = request.getParameter("style");
        //生成的折線圖的文件名
        String imageName = null;
        if(null!=style && "3D".equals(style)){
            //ChartUtilities.writeChartAsJPEG()是面向Java Application的
            //ServletUtilities.saveChartAsPNG()是面向Web開發的
            imageName = ServletUtilities.saveChartAsJPEG(createChart(true), 500, 300, request.getSession());
        }else{
            //saveChartAsPNG()的返回值是生成的圖片的名字,它所生成的圖片會保存在服務器的臨時目錄下
            //Tomcat6的臨時目錄是D:/Develop/apache-tomcat-6.0.36/temp/目錄 
            imageName = ServletUtilities.saveChartAsJPEG(createChart(false), 500, 300, request.getSession());
        }
        //獲取圖片的路徑(此時JFreechart會根據filename到服務器的臨時目錄中尋找圖片)
        String imageURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + imageName;
        request.setAttribute("imageURL", imageURL);
        request.getRequestDispatcher("/result.jsp").forward(request, response);
    }


    /**
     * 創建數據集
     */
    private CategoryDataset createDataSet() {
        //圖例名稱
        String[] line = {"kaspersky", "Nod32", "360"};
        //類別
        String[] category = {"2008年", "2009年", "2010年", "2011年", "2012年"};
        DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
        //向數據集中添加數據
        for(int i=0; i<line.length; i++){
            for(int j=0; j<category.length; j++){
                dataSet.addValue(100000 + new Random().nextInt(100000), line[i], category[j]);
            }
        }
        return dataSet;
    }
    /**
     * 生成制圖對象
     * @param is3D 是否為3D效果
     */
    private JFreeChart createChart(boolean is3D){
        JFreeChart chart = null;
        if(is3D){
            //圖表標題,X軸標題,Y軸標題,繪圖數據集,繪制方向,顯示圖例,采用標準生成器,生成鏈接
            chart = ChartFactory.createLineChart3D("2008-2012年優秀殺毒軟件殺毒數量統計", "殺毒軟件", "查殺病毒數量",
                                                   this.createDataSet(), PlotOrientation.VERTICAL, true, true, false);
        }else{
            chart = ChartFactory.createLineChart("2008-2012年優秀殺毒軟件殺毒數量統計", "殺毒軟件", "查殺病毒數量",
                                                 this.createDataSet(), PlotOrientation.VERTICAL, true, true, false);
        }
        chart.getTitle().setFont(new Font("隸書", Font.BOLD, 23));      //設置標題字體
        chart.getLegend().setItemFont(new Font("宋體", Font.BOLD, 15)); //設置圖例類別字體
        chart.setBackgroundPaint(new Color(192, 228, 106));            //設置背景色
        CategoryPlot plot = chart.getCategoryPlot();                           //獲取繪圖區對象
        plot.getDomainAxis().setLabelFont(new Font("宋體", Font.BOLD, 15));     //設置橫軸字體
        plot.getDomainAxis().setTickLabelFont(new Font("宋體", Font.BOLD, 15)); //設置坐標軸標尺值字體
        plot.getRangeAxis().setLabelFont(new Font("宋體", Font.BOLD, 15));      //設置縱軸字體
        plot.setBackgroundPaint(Color.WHITE);   //設置繪圖區背景色
        plot.setRangeGridlinePaint(Color.RED);  //設置水平方向背景線顏色
        plot.setRangeGridlinesVisible(true);    //設置是否顯示水平方向背景線,默認值為true
        plot.setDomainGridlinePaint(Color.RED); //設置垂直方向背景線顏色
        plot.setDomainGridlinesVisible(true);   //設置是否顯示垂直方向背景線,默認值為false
        LineAndShapeRenderer renderer = (LineAndShapeRenderer)plot.getRenderer(); //獲取折線對象
        BasicStroke realLine = new BasicStroke(1.6f); //設置實線
        float dashes[] = {8.0f};                      //定義虛線數組
        //線條粗細,端點風格,折點風格,折點處理辦法,虛線數組,虛線偏移量
        BasicStroke brokenLine = new BasicStroke(1.6f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 8.0f, dashes, 0.0f);
        renderer.setSeriesStroke(1, brokenLine); //利用虛線繪制
        renderer.setSeriesStroke(2, brokenLine); //利用虛線繪制
        renderer.setSeriesStroke(3, realLine);   //利用實線繪制
        return chart;
    }
}
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!