<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0
          原文出處:http://tech.it168.com/j/2007-09-29/200709291132796.shtml 
          本文請(qǐng)勿轉(zhuǎn)載。
          JFreeChart是一組功能強(qiáng)大、靈活易用的Java繪圖API,使用它可以生成多種通用性的報(bào)表,包括柱狀圖、餅圖、曲線圖、甘特圖等。它能夠用在SwingWeb等中制作自定義的圖表或報(bào)表,并且得到廣泛的應(yīng)用。本文將通過引領(lǐng)讀者學(xué)習(xí)在JFreeChart中餅圖、柱狀圖和曲線圖的進(jìn)階應(yīng)用,來達(dá)到熟練使用JFreeChart的目的。

    一.             下載與環(huán)境配置

    1. 下載JFreeChart

    JFreeChart是開放源代碼的免費(fèi)軟件,但是它的支持文檔需要付費(fèi)才能得到。其下載地址為:http://sourceforge.net/project/showfiles.php?group_id=15494,當(dāng)前最新版本為1.0.6。筆者下載的是1.0.6最新版。

    說明:1source目錄:為jfreechart的源碼目錄;

            2lib目錄:為包目錄,我們需要關(guān)注的包為jfreechart-1.0.6.jargnujaxp.jarjcommon-1.0.10.jar這三個(gè)包;

            3)根目錄下的jfreechart-1.0.6-demo.jar是例子程序,大家雙擊后可看到其中有很多例子的運(yùn)行結(jié)果。

    2. 環(huán)境配置

           筆者的開發(fā)環(huán)境如下:

           JDK1.5

    MyEclipse5.1.1 GA

    Tomcat5.5.28

    為了后續(xù)的“用JFreeChart創(chuàng)建基于Web的圖表”的一個(gè)例子的展示,我們?cè)?/span>MyEclipse中創(chuàng)建一個(gè)名為jfreechartWeb工程。將下載的JFreeChart1.0.6lib目錄下的jar包拷貝到WebRoot/WEB-INF/lib目錄下。另外還需要在web.xml文件中增加如下配置:

    <servlet>
              
    <servlet-name>DisplayChart</servlet-name>
              
    <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
    </servlet>
    <servlet-mapping>
              
    <servlet-name>DisplayChart</servlet-name>
              
    <url-pattern>/DisplayChart</url-pattern>
    </servlet-mapping>

    二.             柱狀圖

    WebRoot目錄下建立bar目錄,用來存放柱狀圖的各個(gè)例子。首先在該目錄下建立一個(gè)sample1.jsp文件,讓我們來看一個(gè)簡(jiǎn)單的柱狀圖的例子,修改后的sample1.jsp的內(nèi)容如下所示:

    <%@ page contentType="text/html;charset=GBK"%>

    <%@ page import="org.jfree.chart.ChartFactory,               org.jfree.chart.JFreeChart,           org.jfree.chart.plot.PlotOrientation,          org.jfree.chart.servlet.ServletUtilities,      org.jfree.data.category.DefaultCategoryDataset"%>
    <%
    DefaultCategoryDataset dataset 
    = new DefaultCategoryDataset();
    dataset.addValue(
    610"廣州""豬肉");
    dataset.addValue(
    220"廣州""牛肉");
    dataset.addValue(
    530"廣州""雞肉");
    dataset.addValue(
    340"廣州""魚肉");
    JFreeChart chart 
    = ChartFactory.createBarChart3D("肉類銷量統(tǒng)計(jì)圖"
                      
    "肉類",
                      
    "銷量",
                      dataset,
                      PlotOrientation.VERTICAL,
                      
    false,
                      
    false,
                      
    false);
    String filename 
    = ServletUtilities.saveChartAsPNG(chart, 500300null, session);
    String graphURL 
    = request.getContextPath() + "/DisplayChart?filename=" + filename;
    %>
    <img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>">

    在瀏覽器中輸入地址:http://localhost:8080/jfreechart/bar/sample1.jsp,可看到如下柱狀圖:



    上面的這個(gè)柱狀圖比較簡(jiǎn)單,稍顯單調(diào),在有些情況下,我們需要用不同顏色來表示不同的種類,或者在種類上標(biāo)上具體數(shù)值,亦或需要加上
    3D水晶效果。下面讓我們來做更深一步的探討。接下來讓我們看一個(gè)用不同顏色來表示不通種類的例子。在WebRootbar目錄下新建sample2.jsp頁面,將其代碼修改如下:

    <%@ page contentType="text/html;charset=GBK"%>

    <%@ page import="org.jfree.chart.ChartFactory,
                     org.jfree.chart.JFreeChart,
    org.jfree.chart.plot.PlotOrientation,
    org.jfree.chart.servlet.ServletUtilities,
    org.jfree.data.category.CategoryDataset,
    org.jfree.data.general.DatasetUtilities
    "%>

    <%
    double[][] data = newdouble[][] {{1310}{720}{1130}{440}};
    String[] rowKeys 
    = {"豬肉""牛肉","雞肉""魚肉"};
    String[] columnKeys 
    = {""};
    CategoryDataset dataset 
    = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); 
    JFreeChart chart 
    = ChartFactory.createBarChart3D("廣州肉類銷量統(tǒng)計(jì)圖""肉類",
    "銷量",
    dataset,
    PlotOrientation.VERTICAL,
    true,
    false,
    false);

    String filename 
    = ServletUtilities.saveChartAsPNG(chart, 500300null, session);
    String graphURL 
    = request.getContextPath() + "/DisplayChart?filename=" + filename;
    %>
    <img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>">


           該頁面的運(yùn)行效果如下圖所示:

       

           對(duì)比該例與前例,可看出createBarChart3D倒數(shù)第三個(gè)參數(shù)修改成了true,該參數(shù)可用來顯示下方的:。上兩例我們顯示的只是一個(gè)城市的肉類銷量,有時(shí)候我們有對(duì)比顯示多個(gè)城市的不同肉類,只要將上例稍作修改即可。例如要在圖中表示廣州、深圳、東莞、佛山四個(gè)城市的四個(gè)肉類的銷售情況,只需要將如下三句稍做修改:

     double[][] data = newdouble[][] {{1310}{720}{1130}{440}};
    String[] rowKeys 
    = {"豬肉""牛肉","雞肉""魚肉"};
    String[] columnKeys 
    = {""};

       例如修改成:

    double[][] data = newdouble[][] {{1310122011101000},
            
    {720700680640},
            
    {11301020980800},
            
    {440400360300}}
    ;
    String[] rowKeys 
    = {"豬肉""牛肉","雞肉""魚肉"};
    String[] columnKeys 
    = {"廣州""深圳""東莞""佛山"};

        在運(yùn)行該jsp頁面,可看到如下界面:

           在上述幾例中,在某個(gè)柱子上都沒有顯示相應(yīng)的數(shù)值,下面讓我們?yōu)槊總€(gè)柱子都加上它的數(shù)值,我們新建一個(gè)sample4.jsp頁面,其內(nèi)容如下:

     <%@ page contentType="text/html;charset=GBK"%>
    <%@ page import="org.jfree.chart.ChartFactory,               org.jfree.chart.JFreeChart,              org.jfree.chart.plot.PlotOrientation,          org.jfree.chart.servlet.ServletUtilities,      org.jfree.data.category.CategoryDataset,
    org.jfree.data.general.DatasetUtilities,
                     org.jfree.chart.plot.
    *,
                     org.jfree.chart.labels.
    *,
    org.jfree.chart.renderer.category.BarRenderer3D,
                     java.awt.
    *,
                     org.jfree.ui.
    *,             org.jfree.chart.axis.AxisLocation"%>
    <%
    double[][] data = newdouble[][] {{1310122011101000},
        
    {720700680640},
        
    {11301020980800},
        
    {440400360300}}
    ;
    String[] rowKeys 
    = {"豬肉""牛肉","雞肉""魚肉"};
    String[] columnKeys 
    = {"廣州""深圳""東莞""佛山"};
    CategoryDataset dataset 
    = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); 

    JFreeChart chart 
    = ChartFactory.createBarChart3D("肉類銷量統(tǒng)計(jì)圖"
                      
    "肉類",
                      
    "銷量",
                      dataset,
                      PlotOrientation.VERTICAL,
                      
    true,
                      
    true,
                      
    false);

    CategoryPlot plot 
    = chart.getCategoryPlot();
    //設(shè)置網(wǎng)格背景顏色
    plot.setBackgroundPaint(Color.white);
    //設(shè)置網(wǎng)格豎線顏色
    plot.setDomainGridlinePaint(Color.pink);
    //設(shè)置網(wǎng)格橫線顏色
    plot.setRangeGridlinePaint(Color.pink);
    //顯示每個(gè)柱的數(shù)值,并修改該數(shù)值的字體屬性

    BarRenderer3D renderer 
    = new BarRenderer3D();
    renderer.setBaseItemLabelGenerator(
    new StandardCategoryItemLabelGenerator());
    renderer.setBaseItemLabelsVisible(
    true);
    //默認(rèn)的數(shù)字顯示在柱子中,通過如下兩句可調(diào)整數(shù)字的顯示
    //注意:此句很關(guān)鍵,若無此句,那數(shù)字的顯示會(huì)被覆蓋,給人數(shù)字沒有顯示出來的問題
    renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
    renderer.setItemLabelAnchorOffset(10D);
    //設(shè)置每個(gè)地區(qū)所包含的平行柱的之間距離
    //renderer.setItemMargin(0.3);
    plot.setRenderer(renderer);
    //設(shè)置地區(qū)、銷量的顯示位置
    //將下方的“肉類”放到上方
    plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
    //將默認(rèn)放在左邊的“銷量”放到右方
    plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

    String filename 
    = ServletUtilities.saveChartAsPNG(chart, 700400null, session);
    String graphURL 
    = request.getContextPath() + "/DisplayChart?filename=" + filename;
    %>
    <img src="<%= graphURL %>"width=700 height=400 border=0 usemap="#<%= filename %>">


          運(yùn)行效果如下所示:

    注意:jfreechart的很多版本不兼容,請(qǐng)大家在運(yùn)行此例時(shí)確認(rèn)下載了對(duì)應(yīng)的版本。

    三.             餅圖

    WebRoot目錄下建立名為pie的子目錄,用來存放本教程中餅圖的實(shí)例jsp頁面。下面讓我們來看一個(gè)簡(jiǎn)單的三維餅圖。首先在pie目錄下建立一個(gè)名為sample1.jsp的頁面。

    JFreeChart中,與餅圖繪制密切相關(guān)的類如下:

    1) PiePlot

    餅圖繪制類,可以用來設(shè)置餅圖的相關(guān)屬性。例如:

    PiePlot pieplot = (PiePlot)jfreechart.getPlot();
    pieplot.setLabelFont(
    new Font("SansSerif"012));
    pieplot.setNoDataMessage(
    "No data available");
    pieplot.setCircular(
    false);
    pieplot.setLabelGap(
    0.02D);

    2) DefaultPieDataset

    默認(rèn)的餅圖數(shù)據(jù)集類,用來存儲(chǔ)餅圖顯示的相關(guān)數(shù)據(jù)信息。例如:

    DefaultPieDataset dataset = new DefaultPieDataset();
    dataset.setValue(
    "品德"new Double(0.2D));
    dataset.setValue(
    "體育"new Double(0.2D));
    dataset.setValue(
    "音樂"new Double(0.2D));
    dataset.setValue(
    "其余成績(jī)"new Double(0.4D));

    3) ChartFactory

    可利用該制圖工廠類createPieChart來創(chuàng)建一個(gè)餅圖的JFreeChart對(duì)象,例如:

    JFreeChart jfreechart = ChartFactory.createPieChart("餅圖示例", dataset, true, true, false);

           下面讓我們看一個(gè)簡(jiǎn)單的例子,修改sample1.jsp的內(nèi)容如下:

     

    <%@ page contentType="text/html;charset=GBK"%>

    <%@ page import="org.jfree.chart.*,
                     org.jfree.chart.plot.PiePlot,              org.jfree.data.general.DefaultPieDataset,
    org.jfree.chart.servlet.ServletUtilities,
                     java.awt.
    *"%>
    <%
    //設(shè)置數(shù)據(jù)集
    DefaultPieDataset dataset = new DefaultPieDataset();
    dataset.setValue(
    "初中高級(jí)程序員"0.55);
    dataset.setValue(
    "項(xiàng)目經(jīng)理"0.1);
    dataset.setValue(
    "系統(tǒng)分析師"0.1);
    dataset.setValue(
    "軟件架構(gòu)師"0.1);
    dataset.setValue(
    "其他"0.2);

    //通過工廠類生成JFreeChart對(duì)象
    JFreeChart chart = ChartFactory.createPieChart3D("IT行業(yè)職業(yè)分布圖", dataset, truefalsefalse);
    PiePlot pieplot 
    = (PiePlot) chart.getPlot();
    pieplot.setLabelFont(
    new Font("宋體"012));

    //沒有數(shù)據(jù)的時(shí)候顯示的內(nèi)容
    pieplot.setNoDataMessage("無數(shù)據(jù)顯示");
    pieplot.setCircular(
    false);
    pieplot.setLabelGap(
    0.02D);

    String filename 
    = ServletUtilities.saveChartAsPNG(chart, 500300null, session);
    String graphURL 
    = request.getContextPath() + "/DisplayChart?filename=" + filename;
    %>
    <img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>">

          可以看出,餅圖的繪制與柱狀圖的繪制類似,該例的運(yùn)行效果如下:

    有時(shí)候我們還想知道某塊所占的具體分值,或者需要突出顯示某一塊。這時(shí)候需要對(duì)上例進(jìn)行部分修改:dataset.setValue("其他", 0.2);后的那段改成:

    //通過工廠類生成JFreeChart對(duì)象
    JFreeChart chart = ChartFactory.createPieChart3D("IT行業(yè)職業(yè)分布圖", dataset, truefalsefalse);
    PiePlot pieplot 
    = (PiePlot) chart.getPlot();
    pieplot.setLabelFont(
    new Font("宋體"012));
    //沒有數(shù)據(jù)的時(shí)候顯示的內(nèi)容
    pieplot.setNoDataMessage("無數(shù)據(jù)顯示");
    pieplot.setCircular(
    false);

    setExplodePercent方法很重要,它將Label為某名稱的某塊挖出來突出顯示,而后兩句實(shí)現(xiàn)的效果是在“初中高級(jí)程序員”等名稱后加上百分比,改成“初中高級(jí)程序員=55%”等。加上如上的代碼后,同時(shí)還需要將相關(guān)的兩個(gè)java包:org.jfree.chart.labels.StandardPieSectionLabelGeneratorjava.text.NumberFormat引入到該jsp頁面中。此時(shí)的運(yùn)行結(jié)果如下:

           通過JFreeChart還可以提供漂亮的水晶餅圖效果,接著讓我們新建一個(gè)sample3.jsp頁面來體驗(yàn)一下超炫美圖吧。修改sample3.jsp頁面如下:

    <%@ page contentType="text/html;charset=GBK"%>

    <%@ page import="org.jfree.chart.*,
    org.jfree.chart.servlet.ServletUtilities,
                     org.jfree.util.Rotation,
    org.jfree.data.general.DefaultPieDataset,
    org.jfree.chart.plot.PiePlot3D
    "%>

    <%
    //設(shè)置數(shù)據(jù)集
    DefaultPieDataset dataset = new DefaultPieDataset();
    dataset.setValue(
    "初中高級(jí)程序員"0.55);
    dataset.setValue(
    "項(xiàng)目經(jīng)理"0.1);
    dataset.setValue(
    "系統(tǒng)分析師"0.1);
    dataset.setValue(
    "軟件架構(gòu)師"0.1);
    dataset.setValue(
    "其他"0.2);

    //通過工廠類生成JFreeChart對(duì)象
    JFreeChart chart = ChartFactory.createPieChart3D("IT行業(yè)職業(yè)分布圖", dataset, truetruefalse);
    //獲得3D的水晶餅圖對(duì)象
    PiePlot3D pieplot3d = (PiePlot3D) chart.getPlot();
    //設(shè)置開始角度
    pieplot3d.setStartAngle(150D);
    //設(shè)置方向?yàn)?#8221;順時(shí)針方向“
    pieplot3d.setDirection(Rotation.CLOCKWISE);
    //設(shè)置透明度,0.5F為半透明,1為不透明,0為全透明
    pieplot3d.setForegroundAlpha(0.5F);
    pieplot3d.setNoDataMessage(
    "無數(shù)據(jù)顯示");      

    String filename 
    = ServletUtilities.saveChartAsPNG(chart, 500300null, session);
    String graphURL 
    = request.getContextPath() + "/DisplayChart?filename=" + filename;
    %>
    <img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>">

        利用setForegroundAlpha()方法可以設(shè)置3D餅圖的透明度,利用setStartAngle()可以設(shè)置其開始角度,利用setDirection()方法可以設(shè)置其方向。該例的運(yùn)行效果如下圖所示:

       

    四.曲線圖

    接著我們來介紹曲線圖的使用。在筆者日常的開發(fā)工作中,曲線圖用得最多,它可以用來繪制趨勢(shì)圖、統(tǒng)計(jì)分析等。首先我們?cè)?/span>WebRoot下建立一個(gè)line目錄,用來存放曲線圖實(shí)例的jsp頁面。我們?cè)谠撃夸浵陆?/span>sample1.jsp頁面來做一個(gè)簡(jiǎn)單的曲線圖的例子。在開始編碼前,讓我們來看看與畫曲線圖密切相關(guān)的幾個(gè)類:

    1) TimeSeriesCollection

    曲線數(shù)據(jù)的集合。

    2) TimeSeries

    曲線信息序列。

    3) ChartFactory

    可以利用該類的createTimeSeriesChart方法來創(chuàng)建曲線的JFreeChart對(duì)象。

    在下例中,我們顯示阿蜜果的blog2007年度各月份的訪問量情況,修改后的sample1.jsp的內(nèi)容如下:

    <%@ page contentType="text/html;charset=GBK"%>

    <%@ page import = "org.jfree.chart.ChartFactory,
    org.jfree.chart.JFreeChart,
    org.jfree.chart.servlet.ServletUtilities,
    org.jfree.chart.title.TextTitle,
    org.jfree.data.time.TimeSeries,
    org.jfree.data.time.Month,
    org.jfree.data.time.TimeSeriesCollection,
    java.awt.Font
    "%>
    <%
    //訪問量統(tǒng)計(jì)時(shí)間線
    TimeSeries timeSeries = new TimeSeries("阿蜜果blog訪問量統(tǒng)計(jì)", Month.class);
    //時(shí)間曲線數(shù)據(jù)集合
    TimeSeriesCollection lineDataset = new TimeSeriesCollection();
    //構(gòu)造數(shù)據(jù)集合
    timeSeries.add(new Month(12007), 11200);
    timeSeries.add(
    new Month(22007), 9000);
    timeSeries.add(
    new Month(32007), 6200);
    timeSeries.add(
    new Month(42007), 8200);
    timeSeries.add(
    new Month(52007), 8200);
    timeSeries.add(
    new Month(62007), 12200);
    timeSeries.add(
    new Month(72007), 13200);
    timeSeries.add(
    new Month(82007), 8300);
    timeSeries.add(
    new Month(92007), 12400);
    timeSeries.add(
    new Month(102007), 12500);
    timeSeries.add(
    new Month(112007), 13600);
    timeSeries.add(
    new Month(122007), 12500);

    lineDataset.addSeries(timeSeries);
    JFreeChart chart 
    = ChartFactory.createTimeSeriesChart("訪問量統(tǒng)計(jì)時(shí)間線""月份""訪問量", lineDataset, truetruetrue);
    //設(shè)置子標(biāo)題
    TextTitle subtitle = new TextTitle("2007年度"new Font("黑體", Font.BOLD, 12));
    chart.addSubtitle(subtitle);
    //設(shè)置主標(biāo)題
    chart.setTitle(new TextTitle("阿蜜果blog訪問量統(tǒng)計(jì)"new Font("隸書", Font.ITALIC, 15)));
    chart.setAntiAlias(
    true);
    String filename 
    = ServletUtilities.saveChartAsPNG(chart, 500300null, session);
    String graphURL 
    = request.getContextPath() + "/DisplayChart?filename=" + filename;
    %>
    <img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>">

    運(yùn)行后的曲線效果如下圖所示:

        有時(shí)我們需要顯示各數(shù)據(jù)點(diǎn)及其數(shù)值,這是我們需要對(duì)上例進(jìn)行一點(diǎn)改動(dòng),在JFreeChart chart = ChartFactory.createTimeSeriesChart……后,TextTitle subtitle = new TextTitle……前加上如下的代碼:

    XYPlot plot = (XYPlot) chart.getPlot();
    XYLineAndShapeRenderer xylineandshaperenderer 
    = (XYLineAndShapeRenderer)plot.getRenderer();
    //設(shè)置網(wǎng)格背景顏色
    plot.setBackgroundPaint(Color.white);
    //設(shè)置網(wǎng)格豎線顏色
    plot.setDomainGridlinePaint(Color.pink);
    //設(shè)置網(wǎng)格橫線顏色
    plot.setRangeGridlinePaint(Color.pink);
    //設(shè)置曲線圖與xy軸的距離
    plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));
    //設(shè)置曲線是否顯示數(shù)據(jù)點(diǎn)
    xylineandshaperenderer.setBaseShapesVisible(true);
    //設(shè)置曲線顯示各數(shù)據(jù)點(diǎn)的值
    XYItemRenderer xyitem = plot.getRenderer();   
    xyitem.setBaseItemLabelsVisible(
    true);   
    xyitem.setBasePositiveItemLabelPosition(
    new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
    xyitem.setBaseItemLabelGenerator(
    new StandardXYItemLabelGenerator());
    xyitem.setBaseItemLabelFont(
    new Font("Dialog"114));
    plot.setRenderer(xyitem);
        并引入了一些另外的包,引入包的語句變成:
    <%@ page import = "org.jfree.chart.ChartFactory,
    org.jfree.chart.title.TextTitle,
    org.jfree.data.time.TimeSeries,
    org.jfree.data.time.Month,
    org.jfree.data.time.TimeSeriesCollection,
    org.jfree.chart.plot.XYPlot,
    org.jfree.chart.renderer.xy.XYLineAndShapeRenderer,
    java.awt.Color,
    org.jfree.ui.RectangleInsets,
    java.awt.Font,
    org.jfree.chart.renderer.xy.XYItemRenderer,
    org.jfree.chart.JFreeChart,
    org.jfree.chart.servlet.ServletUtilities,
    org.jfree.chart.labels.
    *,
    org.jfree.ui.
    *"%>

       運(yùn)行該實(shí)例,效果如下所示:

     上面兩例的曲線圖都是單曲線的,有時(shí)候我們對(duì)兩個(gè)曲線進(jìn)行比較,例如對(duì)阿蜜果在2006年度和2007年度的blog訪問量進(jìn)行比較,在此種情況下,我們需要在一個(gè)曲線圖中顯示兩個(gè)曲線。在此種情況下,我們只需要在sample1.jsp的基礎(chǔ)上新建一個(gè)TimeSeries對(duì)象,給它添加數(shù)據(jù)后,將其添加到TimeSeriesCollection型數(shù)據(jù)集合對(duì)象中,修改后的程序主體部分如下所示:

    //訪問量統(tǒng)計(jì)時(shí)間線
    TimeSeries timeSeries2006 = new TimeSeries("2006年度", Month.class);
    TimeSeries timeSeries2007 
    = new TimeSeries("2007年度", Month.class);

    //時(shí)間曲線數(shù)據(jù)集合
    TimeSeriesCollection lineDataset = new TimeSeriesCollection();
    //構(gòu)造數(shù)據(jù)集合
    timeSeries2006.add(new Month(12007), 7200);
    timeSeries2006.add(
    new Month(22007), 7000);
    timeSeries2006.add(
    new Month(32007), 4200);
    timeSeries2006.add(
    new Month(42007), 8200);
    timeSeries2006.add(
    new Month(52007), 7300);
    timeSeries2006.add(
    new Month(62007), 8200);
    timeSeries2006.add(
    new Month(72007), 9200);
    timeSeries2006.add(
    new Month(82007), 7300);
    timeSeries2006.add(
    new Month(92007), 9400);
    timeSeries2006.add(
    new Month(102007), 7500);
    timeSeries2006.add(
    new Month(112007), 6600);
    timeSeries2006.add(
    new Month(122007), 3500);
    timeSeries2007.add(
    new Month(12007), 10200);
    timeSeries2007.add(
    new Month(22007), 9000);
    timeSeries2007.add(
    new Month(32007), 6200);
    timeSeries2007.add(
    new Month(42007), 8200);
    timeSeries2007.add(
    new Month(52007), 8200);
    timeSeries2007.add(
    new Month(62007), 11200);
    timeSeries2007.add(
    new Month(72007), 13200);
    timeSeries2007.add(
    new Month(82007), 8300);
    timeSeries2007.add(
    new Month(92007), 10400);
    timeSeries2007.add(
    new Month(102007), 12500);
    timeSeries2007.add(
    new Month(112007), 10600);
    timeSeries2007.add(
    new Month(122007), 10500);
    lineDataset.addSeries(timeSeries2006);
    lineDataset.addSeries(timeSeries2007);

    JFreeChart chart 
    = ChartFactory.createTimeSeriesChart("訪問量統(tǒng)計(jì)時(shí)間線""月份""訪問量", lineDataset, truetruetrue);
    //設(shè)置子標(biāo)題
    TextTitle subtitle = new TextTitle("2006/2007年度訪問量對(duì)比"new Font("黑體", Font.BOLD, 12));
    chart.addSubtitle(subtitle);
    //設(shè)置主標(biāo)題
    chart.setTitle(new TextTitle("阿蜜果blog訪問量統(tǒng)計(jì)"new Font("隸書", Font.ITALIC, 15)));
    chart.setAntiAlias(
    true);

    該例的運(yùn)行效果如下:

    五.             總結(jié)

    本文通過詳盡的實(shí)例講述了如何利用JFreeChart開發(fā)常用的柱狀圖、餅圖和曲線圖。從這些實(shí)例中可以看出,JFreeChart是我們開發(fā)圖表或報(bào)表的理想選擇,它簡(jiǎn)單易用,并且容易理解,是我們開發(fā)的利刃。

    posted on 2007-09-30 09:28 阿蜜果 閱讀(29595) 評(píng)論(37)  編輯  收藏 所屬分類: JavaJFreeChart


    FeedBack:
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-09-30 13:53 | 千里冰封
    呵呵,用JAVA真好,這么多開源的東西可以用  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2007-09-30 14:01 | 阿蜜果
    @千里冰封
    恩,真的好多阿,用JFreeChart還蠻方便的,可惜它的文檔要付費(fèi)。  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-10-01 07:46 | looklook
    看下面的文章加jfreechart的api就夠了,源碼就是最好的文檔
    深入探究JFreeChart(1)
    http://www.tkk7.com/JavaExplore/archive/2006/09/01/67217.html
    深入探究JFreeChart(2)
    http://www.tkk7.com/JavaExplore/archive/2006/09/12/69261.html  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-10-01 09:12 | xiaoshu
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-10-01 10:52 |
    應(yīng)該加上多種圖表的組合。下次我來加吧  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2007-10-02 09:12 | 阿蜜果
    @窮
    恩,才學(xué)不久,多多指點(diǎn)阿,組合的搞個(gè)例子給我看看。  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-10-04 01:12 | wolfwood
    看了你的這篇文章,對(duì)jfreechart初步了解了,太感謝你了,順便給你個(gè)組合的例子:
    <%@ page contentType="text/html;charset=GBK"%>

    <%@ page
    import="org.jfree.chart.ChartFactory,org.jfree.chart.JFreeChart,org.jfree.chart.plot.*,org.jfree.chart.servlet.ServletUtilities,org.jfree.data.category.CategoryDataset,org.jfree.data.general.DatasetUtilities,org.jfree.data.category.DefaultCategoryDataset,org.jfree.chart.axis.NumberAxis3D,java.awt.Color,org.jfree.chart.renderer.category.LineRenderer3D;"%>

    <%
    double[][] data = new double[][] { { 1310, 1220, 1110, 1000 },
    { 720, 700, 680, 640 }, { 1130, 1020, 980, 800 },
    { 440, 400, 360, 300 } };
    String[] rowKeys = { "豬肉", "牛肉", "雞肉", "魚肉" };
    String[] columnKeys = { "廣州", "深圳", "東莞", "佛山" };
    CategoryDataset dataset = DatasetUtilities.createCategoryDataset(
    rowKeys, columnKeys, data);

    String s = "供給率";
    String s1 = "廣州";
    String s2 = "深圳";
    String s3 = "東莞";
    String s4 = "佛山";
    DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
    defaultcategorydataset.addValue(35D, s, s1);
    defaultcategorydataset.addValue(65D, s, s2);
    defaultcategorydataset.addValue(55D, s, s3);
    defaultcategorydataset.addValue(95D, s, s4);

    JFreeChart chart = ChartFactory
    .createBarChart3D("廣州肉類銷量統(tǒng)計(jì)圖", "肉類", "銷量", dataset,
    PlotOrientation.VERTICAL, true, false, false);

    CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
    CategoryDataset categorydataset1 = defaultcategorydataset;
    NumberAxis3D numberaxis3d = new NumberAxis3D("供給率");
    categoryplot.setRangeAxis(1, numberaxis3d);
    categoryplot.setDataset(1, categorydataset1);
    categoryplot.mapDatasetToRangeAxis(1, 1);
    LineRenderer3D linerenderer3d = new LineRenderer3D();
    linerenderer3d.setSeriesPaint(0, Color.blue);
    categoryplot.setRenderer(1, linerenderer3d);
    categoryplot
    .setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

    String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300,
    null, session);
    String graphURL = request.getContextPath()
    + "/DisplayChart?filename=" + filename;
    %>
    <img src="<%=graphURL%>" width=500 height=300 border=0
    usemap="#<%= filename %>">  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-10-06 09:39 | 阿蜜果
    @wolfwood
    感謝提供!
      回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-10-06 11:02 | cheng
    支持一下,好文章,有時(shí)間得多多研究下。  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-10-13 22:44 | fdfd
    ffgdgfdgfd  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-10-14 21:51 | 大媽
    真得很不錯(cuò),認(rèn)真學(xué)習(xí)!!  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2007-12-19 10:33 | MagicYang
    女娃娃筆記版面編排確實(shí)要做得細(xì)膩些,原文雖好,但是還是過來看方便些,謝過先
      回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2007-12-19 10:38 | MagicYang
    順便對(duì) “柱狀圖示例”補(bǔ)充點(diǎn)點(diǎn),默認(rèn)的柱子顏色是在5種基本顏色之間循環(huán),如果只有兩個(gè)柱子的話,那就默認(rèn)是紅、藍(lán)兩種(個(gè)人覺得丑...),

    設(shè)置柱狀條的顏色:

    第1個(gè)參數(shù)是柱子位置,第二個(gè)是顏色
    renderer.setSeriesPaint(0, Color.RED);
    renderer.setSeriesPaint(1, Color.GREEN);  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-12-21 12:35 | why
    感謝大姐的這篇文章,順便問下大姐.為什么我做2個(gè)曲線比較的時(shí)候,2條曲線是分開的啊,一個(gè)在左邊,一個(gè)在右邊.
    代碼如下
    import org.jfree.chart.ChartFactory;

    import org.jfree.chart.JFreeChart;
    import org.jfree.data.time.Month;
    import org.jfree.data.time.Day;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.labels.*;
    import org.jfree.ui.RectangleInsets;
    import org.jfree.ui.TextAnchor;

    import java.awt.Font;
    import java.awt.Color;
    import java.io.*;

    public class ChartUtil {

    public static JFreeChart draw() throws IOException {

    TimeSeries series = new TimeSeries("a small test", Month.class);
    TimeSeries series2=new TimeSeries("the seconde test",Month.class);
    TimeSeriesCollection collection = new TimeSeriesCollection();
    series2.add(new Month(1, 2006), 100000);
    series2.add(new Month(2, 2006), 10);
    series2.add(new Month(3, 2006), 100);
    series2.add(new Month(4, 2006), 1000);
    series2.add(new Month(5, 2006), 1021);
    series2.add(new Month(6, 2006), 10343);
    series2.add(new Month(7, 2006), 1053);
    series2.add(new Month(9, 2006), 103300);
    series2.add(new Month(8, 2006), 100000);
    series2.add(new Month(10, 2006), 1002);
    series2.add(new Month(11, 2006), 1022);
    series2.add(new Month(12, 2006), 123);
    series.add(new Month(1, 2007), 100000);
    series.add(new Month(2, 2007), 10);
    series.add(new Month(3, 2007), 100);
    series.add(new Month(4, 2007), 1000);
    series.add(new Month(5, 2007), 1021);
    series.add(new Month(6, 2007), 10343);
    series.add(new Month(7, 2007), 1053);
    series.add(new Month(9, 2007), 103300);
    series.add(new Month(8, 2007), 100000);
    series.add(new Month(10, 2007), 100);
    series.add(new Month(11, 2007), 10);
    series.add(new Month(12, 2007), 1);
    collection.addSeries(series);
    collection.addSeries(series2);
    JFreeChart chart = ChartFactory.createTimeSeriesChart("一個(gè)曲線圖的測(cè)試", "月份",
    "訪問量", collection, true, true, true);
    TextTitle subtitle = new TextTitle("2007年度", new Font("黑體", Font.BOLD,
    12));
    chart.addSubtitle(subtitle);
    chart.setTitle(new TextTitle("the titile", new Font("隸書", Font.PLAIN,
    32)));
    chart.setAntiAlias(true);

    return chart;

    }  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-12-21 12:38 | why
    用的是1.0.8的版本,應(yīng)該和版本沒有關(guān)系吧  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2007-12-24 15:33 | jack
    寫的非常好!!
    ---
    vicbeijing@163.com  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2007-12-25 15:09 | 剡軍
    找了好久,終于找到個(gè)寫的很認(rèn)真的~!謝謝  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2008-02-25 10:02 | yangyawei
    有時(shí)候我們還想知道某塊所占的具體分值,或者需要突出顯示某一塊。這時(shí)候需要對(duì)上例進(jìn)行部分修改:dataset.setValue("其他", 0.2);后的那段改成:


    //通過工廠類生成JFreeChart對(duì)象
    JFreeChart chart = ChartFactory.createPieChart3D("IT行業(yè)職業(yè)分布圖", dataset, true, false, false);
    PiePlot pieplot = (PiePlot) chart.getPlot();
    pieplot.setLabelFont(new Font("宋體", 0, 12));
    //沒有數(shù)據(jù)的時(shí)候顯示的內(nèi)容
    pieplot.setNoDataMessage("無數(shù)據(jù)顯示");
    pieplot.setCircular(false);
    setExplodePercent方法很重要,它將Label為某名稱的某塊挖出來突出顯示,而后兩句實(shí)現(xiàn)的效果是在“初中高級(jí)程序員”等名稱后加上百分比,改成“初中高級(jí)程序員=55%”等。加上如上的代碼后,同時(shí)還需要將相關(guān)的兩個(gè)java包:org.jfree.chart.labels.StandardPieSectionLabelGenerator和java.text.NumberFormat引入到該jsp頁面中。此時(shí)的運(yùn)行結(jié)果如下:

    這里加上百分比沒說清楚,幫下忙,謝謝了
      回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2008-03-14 09:42 | haha
    請(qǐng)問柱圖的百分比怎么顯示阿!這個(gè)好難,找了好久都沒找到!!!  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2008-05-16 15:52 | zhangzhicheng
    能不能生成曲線圖,能的話告訴我,我的郵箱:zzz39300@yahoo.com.cn
    QQ:393004421
    或者使得那些點(diǎn)在橫軸上不顯示.  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2008-06-19 14:18 | wuhui
    真的很好  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2008-07-08 16:59 | xiaf02
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2008-09-19 09:34 | Michael
    你有點(diǎn)傻,是不是啊 ?
    這個(gè)年代了,誰還會(huì)在jsp頁面摻入這么多的java代碼,你沒有學(xué)MVC
    嗎?   回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2008-09-19 10:03 | 阿蜜果
    @Michael
    我只是向你們演示JFreeChart的東西,難道還讓我給你搭個(gè)框架不成?
    我沒事干啊  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2008-11-29 23:43 | qqq
    @wuhui
    vb   回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2009-01-06 10:44 | hongliang
    太棒了!  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2009-01-06 10:45 | laiang
    謝謝了  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2009-01-16 10:30 | Illu
    你好。。
    你在餅圖這里
    setExplodePercent方法很重要,它將Label為某名稱的某塊挖出來突出顯示,
    我沒有發(fā)現(xiàn)你上面的程序里有這句話啊
    好像漏了。。。  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2009-03-05 10:26 | magicyang
    太感謝了!!!  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2009-07-05 17:42 | 網(wǎng)上的魚
    太感謝了,不過能不能發(fā)一分各個(gè)函數(shù)的注釋說明文檔共享下?  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2009-12-29 11:44 | lovesea
    lz 請(qǐng)問如何解決圖表中x軸過多的顯示問題呀  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2010-01-29 15:31 | hello
    我想要轉(zhuǎn)載一下學(xué)習(xí),怕以后忘了你的地址,可以么,萬分感謝啊  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2010-02-01 09:20 | 阿蜜果
    @hello
    可以,寫明出處就行  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2011-04-19 17:24 | 凡凡
    太給力啦 一個(gè)項(xiàng)目急用jfreechart解決報(bào)表分析問題,一篇文章就解決啦,沒得說,頂起,樓主威武  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2013-08-28 17:35 | 學(xué)習(xí)者
    你好,為什么會(huì)出現(xiàn)圖片中中文為亂碼?該怎樣解決?  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)[未登錄]
    2013-12-19 11:45 | 學(xué)習(xí)者
    // 創(chuàng)建主題樣式
    StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
    // 設(shè)置標(biāo)題字體
    standardChartTheme.setExtraLargeFont(new Font("隸書", Font.BOLD, 20));
    // 設(shè)置圖例的字體
    standardChartTheme.setRegularFont(new Font("宋書", Font.PLAIN, 15));
    // 設(shè)置軸向的字體
    standardChartTheme.setLargeFont(new Font("宋書", Font.PLAIN, 15));
    // 應(yīng)用主題樣式
    ChartFactory.setChartTheme(standardChartTheme);  回復(fù)  更多評(píng)論
      
    # re: 用JFreeChart增強(qiáng)JSP報(bào)表的用戶體驗(yàn)
    2015-01-23 15:51 | metre
    加百分百是這個(gè)屬性:

    // 圖例顯示百分比:自定義方式,{0} 表示選項(xiàng), {1} 表示數(shù)值, {2} 表示所占比例 ,小數(shù)點(diǎn)后兩位

    pieplot3d.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})",
    NumberFormat.getNumberInstance(), new DecimalFormat("0.0%")));   回復(fù)  更多評(píng)論
      
    <2007年9月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

          生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
          我的作品:
          玩轉(zhuǎn)Axure RP  (2015年12月出版)
          

          Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊(cè)

    關(guān)注blog

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 成年人网站免费视频| 91禁漫免费进入| 亚洲精品视频免费观看| 亚洲av无码一区二区三区天堂| 大地资源在线观看免费高清| 亚洲AV无码专区在线亚| 免费观看无遮挡www的视频| 久久精品电影免费动漫| 亚洲国产精品乱码一区二区| 美女被cao网站免费看在线看| 亚洲国产人成网站在线电影动漫 | 久久免费国产视频| 亚洲AV本道一区二区三区四区 | 99久久免费国产精品热| 伊人婷婷综合缴情亚洲五月| A片在线免费观看| 亚洲精品在线播放视频| 好吊妞在线新免费视频| 日韩电影免费在线观看网址| 在线观看亚洲av每日更新| 青青草无码免费一二三区| 亚洲人成人77777在线播放| 全免费一级午夜毛片| 一区二区三区精品高清视频免费在线播放| 亚洲综合最新无码专区| 美女啪啪网站又黄又免费| 国产美女亚洲精品久久久综合| 亚洲免费视频网站| 亚洲av午夜电影在线观看| 自拍偷自拍亚洲精品情侣| 亚洲精品视频免费在线观看| 久久精品亚洲日本波多野结衣 | 亚洲日韩一区精品射精| 深夜国产福利99亚洲视频| 一个人看的www免费视频在线观看| 亚洲国产av美女网站| 亚洲av中文无码| 日韩精品免费一线在线观看| 亚洲综合婷婷久久| 免费大香伊蕉在人线国产| 精品无码国产污污污免费网站|