JFreeChartC

B、數據點的調整
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(true); //
數據點可見
xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //
數據點填充爲紅色
xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //
數據點填充爲白色
xylineandshaperenderer.setUseFillPaint(true); //
應用
C
、平均值曲線
這個曲線有什麼用呢?很簡單的例子,這裏有一個以半年每天爲單位的數據繪製的曲線,我們想看看以月爲單位數據
的變化,這時就可以用到它了。
TimeSeries timeseries = createEURTimeSeries(); //
就是以半年每天爲單位的數據
TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries,
“30 day moving average”,
30, //30
天爲一個週期
30); //
最開始的30天跳過
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
return timeseriescollection;

九、總結一下
dataset plot renderer
餅圖 PieDatasetDefaultPieDataset PiePlot ——
柱狀圖 CatagoryDatasetDefaultCategoryDataset CategoryPlot BarRenderer
折線圖 CatagoryDatasetDefaultCategoryDataset CategoryPlot LineAndShapeRenderer
XYDataset
XYSeriesCollection XYPlot XYLineAndShapeRenderer
時間序列圖 XYDataset TimeSeriesCollection XYPlot XYLineAndShapeRenderer
這裏只是一些常用的方法,具體還是看API
十、Item Lable
這裏以柱狀圖爲例說明,具體來說就是在每個柱狀上顯示它的數據,具體有下面內容:
A
、使 Item Lable 可見
B
、調整 Item Lable 的顏色、字體等
C
、調整 Item Lable 的位置
D
、定製 Item Lable 的內容
1
、分配一個 Lable Generator renderer
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
GategoryLableGenerator generator =new StandardGategoryLableGenerator(
“{2}”, new DecimalFormat(”0.00″) //
調整顯示的數字和字符格式
);
barrenderer.setLableGenerator(generator);
2
、使 Item Lable 可見
barrenderer.setItemLableVisible(true);
3
、調整 Item Lable 的顏色、字體等
barrenderer.setItemLablePaint(Color.red);
barrenderer.setItemLableFont(new Font(”SansSerif”,Font.PLAIN,10));
4
、調整 Item Lable 的位置
這裏涉及到一個新的對象 ItemLablePosition , ItemLablePosition的構造函數有兩個或四個參數
public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor,
org.jfree.ui.TextAnchor textAnchor,
org.jfree.ui.TextAnchor rotationAnchor,
double angle)
itemLabelAnchor - Item Lable
的位置 (最重要的!!)
textAnchor - Item Lable
裏包含的正文相對於Item Lable 的位置
rotationAnchor - Item Lable
裏包含的正文旋轉的位置
angle -
旋轉的角度
ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,
TextAnchor.CENTER_RIGHT,
TextAnchor.CENTER_RIGHT,
-1.57D);
barrenderer.setPositiveItemLabelPosition(itemlabelposition);
這樣就可以每個柱狀上顯示它的數據了,當然可以定製 Item Lable 的內容,比如 Item Lable text 超過100的才顯示,這樣就需要定製自己的類,它要實現GategoryLableGenerator 接口,實現generateItemLable()方法

 

其他說明:
//
設置Legend的位置
        //((JFreeChart) chart).getLegend().setPosition(RectangleEdge.RIGHT);
//
設置最高的一個 Item 與圖片頂端的距離
        plot.getRangeAxis().setUpperMargin(0.15);
        //
設置最低的一個 Item 與圖片底端的距離
        plot.getRangeAxis().setLowerMargin(0.15);
        //
座標軸字體
        plot.getDomainAxis().setLabelFont(new Font("
宋體", Font.PLAIN, 12));
        //
橫軸每個分類的字體
        plot.getDomainAxis().setTickLabelFont(new Font("
宋體", Font.BOLD, 12));
        if(labelPositionsUP_45)
            plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);

//柱圖列寬度((BarRenderer) plot.getRenderer()).setMaximumBarWidth(barWidth);

 2

我想用jfreechart做一個折線圖,要求橫軸是日1期,豎軸是數量。橫軸日期爲每個月的所有天數。如1月是1-31日,則頁面上是31個點的折線圖。根據每個月天數不同橫軸座標有不同的天數,問怎樣實現?有樣例代碼也可以。謝謝了。

你的折線圖只有一條線?線上有31個點?

給你一個例子,參考着改改就行了。jfc_0.9
package org.jfree.chart.demo;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DefaultDrawingSupplier;
import org.jfree.chart.plot.DrawingSupplier;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

字串4


import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

/**
* A line chart demo showing the use of a custom drawing supplier.
*
*/
public class LineChartDemo5 extends ApplicationFrame {

/**
* Creates a new demo.
*
* @param title the frame title.
*/
public LineChartDemo5(final String title) {
super(title);
final CategoryDataset dataset = createDataset();
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);

}

/**
* Creates a sample dataset.
*
* @return a sample dataset.
*/
private CategoryDataset createDataset() {

// row keys...
final String series1 = "First";
final String series2 = "Second";

字串4


final String series3 = "Third";

// column keys...
final String type1 = "Type 1";
final String type2 = "Type 2";
final String type3 = "Type 3";
final String type4 = "Type 4";
final String type5 = "Type 5";
final String type6 = "Type 6";
final String type7 = "Type 7";
final String type8 = "Type 8";

// create the dataset...
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

dataset.addValue(1.0, series1, type1);
dataset.addValue(4.0, series1, type2);
dataset.addValue(3.0, series1, type3);
dataset.addValue(5.0, series1, type4);
dataset.addValue(5.0, series1, type5);
dataset.addValue(7.0, series1, type6);
dataset.addValue(7.0, series1, type7);
dataset.addValue(8.0, series1, type8);

字串5



dataset.addValue(5.0, series2, type1);
dataset.addValue(7.0, series2, type2);
dataset.addValue(6.0, series2, type3);
dataset.addValue(8.0, series2, type4);
dataset.addValue(4.0, series2, type5);
dataset.addValue(4.0, series2, type6);
dataset.addValue(2.0, series2, type7);
dataset.addValue(1.0, series2, type8);

dataset.addValue(4.0, series3, type1);
dataset.addValue(3.0, series3, type2);
dataset.addValue(2.0, series3, type3);
dataset.addValue(3.0, series3, type4);
dataset.addValue(6.0, series3, type5);
dataset.addValue(3.0, series3, type6);
dataset.addValue(4.0, series3, type7);
dataset.addValue(3.0, series3, type8);

return dataset;

}

/**
* Creates a sample chart.
*
* @param dataset the dataset.
*
* @return a chart.
字串2
*/
private JFreeChart createChart(final CategoryDataset dataset) {

final JFreeChart chart = ChartFactory.createLineChart(
"Line Chart Demo 5", // chart title
"Type", // domain axis label
"Value", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips
false // urls
);

// final StandardLegend legend = (StandardLegend) chart.getLegend();
// legend.setDisplaySeriesShapes(true);

final Shape[] shapes = new Shape[3];
int[] xpoints;
int[] ypoints;

// right-pointing triangle

3

/****
  * 
獲取一個演示用的組合數據集對象   (時間曲線圖)
  * @return
  */
  private   static   XYDataset   createDataset()
  {  
       TimePeriodValues   timeseries1   =   new   TimePeriodValues("Chart   Title");  
        
       //
這地方可以使用循環,把x軸,y   的值   輔給timeseries1 
       TimePeriodValuesCollection   timeseriescollection   =   new   TimePeriodValuesCollection();  
       for(int i =1;i<10;i++)
       {
        Minute   min   =  new Minute(new Date());
        timeseries1.add(min,   i);  
     
       
        timeseriescollection.addSeries(timeseries1);  
       }
       return   timeseriescollection;  
   }

4

jfreechart

2007-08-09 17:39

jfreechart(http://www.jfree.org/jfreechart/index.html)。可以繪製
pie charts
餅圖,bar charts 柱狀圖,line and area charts曲線圖,scatter plots and bubble charts 散列圖,time series 時序圖,Area Charts區域圖,Difference Chart差異圖,Step Chart步驟圖,Multiple Axis Charts 混合圖,Gantt charts甘特圖,combination charts 複合圖
JFreeChart
核心類庫介紹:
jfreechart
主要由兩個大的包組成:org.jfree.chart,org.jfree.data。其中前者主要與圖形
本身有關,後者與圖形顯示的數據有關。
核心類主要有:
org.jfree.chart.JFreeChart
:圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定製。JFreeChart引擎本身提供了一個工廠類用於創建不同類型的圖表對象
org.jfree.data.category.XXXDataSet:
數據集對象,用於提供顯示圖表所用的數據。根據不同類型的圖表對應着很多類型的數據集對象類
org.jfree.chart.plot.XXXPlot
:圖表區域對象,基本上這個對象決定着什麼樣式的圖表,創建該對象的時候需要AxisRenderer以及數據集對象的支持
org.jfree.chart.axis.XXXAxis
:用於處理圖表的兩個軸:縱軸和橫軸
org.jfree.chart.render.XXXRender
:負責如何顯示一個圖表對象
org.jfree.chart.urls.XXXURLGenerator:
用於生成Web圖表中每個項目的鼠標點擊鏈接
XXXXXToolTipGenerator:
用於生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類
對於常用的餅圖闔柱狀圖,比較簡單而且網上有很多的文章介紹,在這裏就不再一一複述了,
(
可以參考這篇文章http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/index.html?ca=dwcn-isc&me=ccid
主要說明下另一種常見的報表,時序圖,首先聲明一個曲線數據集合對象和曲線對象

TimePeriodValuesCollection timeseriescollection = new TimePeriodValuesCollection();
//
聲明具體是曲線對象,(可根據實際情況在同一張圖中顯示多條曲線進行數據比對,根據實際應用情況當超過4條曲線時,就會有些亂。)
TimePeriodValues timeperiod1 = new TimePeriodValues("
服務器A在線用戶數量");
TimePeriodValues timeperiod2 = new TimePeriodValues("
服務器B在線用戶數量");
我在使用TimeSeriesCollection tsc = new TimeSeriesCollection();
TimeSeries ts = new TimeSeries();
在生成數據集時(ts.add(new Day(day, month, year),10)))只能生成最小單位爲天的橫軸所以改用了TimePeriodValuesCollection
//
根據當前時間取得橫軸座標,時間間隔爲1小時
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
//
這裏改爲根據自己程序得到的需要顯示的時間點和對應的數據的集合;
List objectList1 = dao.getList1();
List objectList2 = dao.getList2();
//
使用循環,把x軸,y軸的值賦給timeseries1
for (int i =0;i<objecthash1.size();i++) {
     int hour = objecthash1[i].getHours();
     int count = objecthash1[i].getCount();
//
將每一對數據(時間,數值)添加到數據集合1(曲線對象1)
     timeseries1.add(new Hour(hour, day, month, year),count);
}
for (int i =0;i<objecthash2.size();i++) {
     int hour = objecthash2[i].getHours();
     int count = objecthash2[i].getCount();
//
將每一對數據(時間,數值)添加到數據集合2(曲線對象2)
     timeseries2.add(new Hour(hour, day, month, year),count);
}
//
將曲線對象添加到曲線數據集合對象中
timeseriescollection.addSeries(timeseries1);
timeseriescollection.addSeries(timeseries2);
//
繪製報表
String title = "
日在線用戶統計"; //報表標題
String domain = "
時間";     //x
String range = "
用戶在線數量";    //y
//
創建時間序列圖對象
JFreeChart chart = ChartFactory.createTimeSeriesChart(
title,   //
報表標題
domain, //
報表橫軸標籤
range,   //
報表縱軸標籤
timeseriescollection, //
數據集合
true,   //
是否顯示圖例,在這裏如果爲true則會在圖表的下方顯示各條數據曲線的名稱和顏色
false, //
是否生成工具
false    //
是否生成URL鏈接);
//
將報表保存爲jpg文件
ChartUtilities.saveChartAsJPEG(file, //
文件保存物理路徑包括路徑和文件名
100,    //
圖片質量
chart, //
圖表對象
1024,   //
圖像寬度
768,    //
圖像高度
null); //
顯示信息
//
將報表直接在頁面輸出
ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,1024,768,null);

String title="
月在線用戶統計";   //標題
String domain="
時間()";//x
String range="
用戶在線數量";//y
TimePeriodValuesCollection    timeseriescollection    =    new    TimePeriodValuesCollection();
TimePeriodValues timeseries = new TimePeriodValues( "
用戶數量");
timeseries.add(new Minute(0, 1, 1, 1, 2006), 100);
timeseries.add(new Minute(10, 1, 1, 1, 2006), 500);
timeseries.add(new Minute(20, 1, 1, 1, 2006), 300);
timeseries.add(new Minute(30, 1, 1, 1, 2006), 800);
JFreeChart chart =ChartFactory.createTimeSeriesChart(title,domain,range,timeseriescollection,true,false,false);
當我們生成了一個報表對象時,可能需要根據實際情況來決定報表的橫軸和縱軸的數值間隔,顯示方式等。
可以用XYPlot xyplot = (XYPlot)chart.getPlot();來得到所有數據點的集合。(其它形狀圖表得到的數據集對象根據實際情況造型)
得到數據點集合後,我們就可以設置各條曲線的顏色,和座標軸的距離,x軸、y軸的顯示方式等等屬性
xyplot.setBackgroundPaint(Color.lightGray); //
設定圖表數據顯示部分背景色
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //
設定座標軸與圖表數據顯示部分距離
xyplot.setDomainGridlinePaint(Color.white); //
網格線縱向顏色
xyplot.setRangeGridlinePaint(Color.white); //
網格線橫向顏色
數據點的調整
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(true);   //
數據點可見
xylineandshaperenderer.setSeriesFillPaint(0, Color.red);   //
設置第一條曲線數據點填充爲紅色,如果一個圖表有多條曲線可分別設置
xylineandshaperenderer.setUseFillPaint(true);     //
應用

使用xyplot.getRangeAxis()得到縱軸,xyplot.getDomainAxis()得到橫軸,得到後可以根據實際情況造型爲自己所需要的類型。
我的圖表縱軸爲數值類型,橫軸爲時間類型,使用如下方式
NumberAxis numAxis = (NumberAxis)xyplot.getRangeAxis();
DateAxis   dateaxis =    (DateAxis)xyplot.getDomainAxis();
//
設置y顯示方式
numAxis.setAutoTickUnitSelection(false);//
數據軸的數據標籤是否自動確定
double   rangetick = 0.1D;
numAxis.setTickUnit(new NumberTickUnit(rangetick));   //y
軸單位間隔爲0.1
//
設置x軸顯示方式
dateaxis.setAutoTickUnitSelection(false);//
數據軸的數據標籤是否自動確定
dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//x
軸單位間隔爲1
我們還可以是將數據格式化以後顯示,比如y軸顯示百分比(10%100%,x軸顯示爲××
NumberFormat nf =NumberFormat.getPercentInstance();
numAxis.setNumberFormatOverride(nf);//
設置y軸以百分比方式顯示
SimpleDateFormat format = new SimpleDateFormat("MM
dd");
dateaxis.setDateFormatOverride(format);//
設置x軸數據單位以××日方式顯示
時序圖中還有一個很重要的方法
timeseriescollection.setDomainIsPointsInTime(true); //x
軸上的刻度點代表的是時間點而不是時間段
最開始我沒有設置這個屬性,結果畫出來的圖,老是差半格不能在這個刻度的時候準確顯示,往後移了半格,就是因爲JFreeChart默認這個刻度是
一個時間段,它把這個刻度和下個刻度的中間點認爲是顯示數據點最佳位置。

其他一些關於AXIS類的方法:
Axis
類:
void setVisible(boolean flag)
座標軸是否可見
void setAxisLinePaint(Paint paint)
座標軸線條顏色(3D軸無效)
void setAxisLineStroke(Stroke stroke)
座標軸線條筆觸(3D軸無效)
void setAxisLineVisible(boolean visible)
座標軸線條是否可見(3D軸無效)
void setFixedDimension(double dimension)
(用於複合表中對多座標軸的設置)
void setLabel(String label)
座標軸標題
void setLabelFont(Font font)
座標軸標題字體
void setLabelPaint(Paint paint)
座標軸標題顏色
void setLabelAngle(double angle)`
座標軸標題旋轉角度(縱座標可以旋轉)
void setTickLabelFont(Font font)
座標軸標尺值字體
void setTickLabelPaint(Paint paint)
座標軸標尺值顏色
void setTickLabelsVisible(boolean flag)
座標軸標尺值是否顯示
void setTickMarkPaint(Paint paint)
座標軸標尺顏色
void setTickMarkStroke(Stroke stroke)
座標軸標尺筆觸
void setTickMarksVisible(boolean flag)
座標軸標尺是否顯示
ValueAxis(Axis)
類:
void setAutoRange(boolean auto)
自動設置數據軸數據範圍
void setAutoRangeMinimumSize(double size)
自動設置數據軸數據範圍時數據範圍的最小跨度
void setAutoTickUnitSelection(boolean flag)
數據軸的數據標籤是否自動確定(默認爲true
void setFixedAutoRange(double length)
數據軸固定數據範圍(設置100的話就是顯示MAXVALUEMAXVALUE-100那段數據範圍)
void setInverted(boolean flag)
數據軸是否反向(默認爲false
void setLowerMargin(double margin)
數據軸下(左)邊距
void setUpperMargin(double margin)
數據軸上(右)邊距
void setLowerBound(double min)
數據軸上的顯示最小值
void setUpperBound(double max)
數據軸上的顯示最大值
void setPositiveArrowVisible(boolean visible)
是否顯示正向箭頭(3D軸無效)
void setNegativeArrowVisible(boolean visible)
是否顯示反向箭頭(3D軸無效)
void setVerticalTickLabels(boolean flag)
數據軸數據標籤是否旋轉到垂直
void setStandardTickUnits(TickUnitSource source)
數據軸的數據標籤(可以只顯示整數標籤,需要將AutoTickUnitSelectionfalse
NumberAxis(ValueAxis)
類:
void setAutoRangeIncludesZero(boolean flag)
是否強制在自動選擇的數據範圍中包含0
void setAutoRangeStickyZero(boolean flag)
是否強制在整個數據軸中包含0,即使0不在數據範圍中
void setNumberFormatOverride(NumberFormat formatter)
數據軸數據標籤的顯示格式
void setTickUnit(NumberTickUnit unit)
數據軸的數據標籤(需要將AutoTickUnitSelectionfalse
DateAxis(ValueAxis)
類:
void setMaximumDate(Date maximumDate)
日期軸上的最小日期
void setMinimumDate(Date minimumDate)
日期軸上的最大日期
void setRange(Date lower,Date upper)
日期軸範圍
void setDateFormatOverride(DateFormat formatter)
日期軸日期標籤的顯示格式
void setTickUnit(DateTickUnit unit)
日期軸的日期標籤(需要將AutoTickUnitSelectionfalse
void setTickMarkPosition(DateTickMarkPosition position)
日期標籤位置(參數常量在org.jfree.chart.axis.DateTickMarkPosition類中定義)
CategoryAxis(Axis)
類:
void setCategoryMargin(double margin)
分類軸邊距
void setLowerMargin(double margin)
分類軸下(左)邊距
void setUpperMargin(double margin)
分類軸上(右)邊距
void setVerticalCategoryLabels(boolean flag)
分類軸標題是否旋轉到垂直
void setMaxCategoryLabelWidthRatio(float ratio)
分類軸分類標籤的最大寬度

 

1

 

一、JFreeChart獲取。
        JFreeChart
JFreeChart公司在開源網站SourceForge.net上的一個項目,該公司的主要產品有如下:
        1
JFreeReport:報表解決工具
        2
JFreeChartJava圖形解決方案(Application/Applet/Servlet/Jsp
        3
JCommonJFreeReportJFreeChart的公共類庫
        4
JFreeDesignerJFreeReport的報表設計工具

    
我們可以從jfree官方網站上獲取最新版本和相關資料(但是jfreedocument需要40美金才能獲取),
    
獲取地址:http://www.jfree.org/jfreechart/index.html(同時可以獲得簡明介紹)
    
我們以當前最新版本:jfreechart_0.9.21.zip爲例子進行說明。

二、JFreeChart配置安裝
    1
、解壓jfreechart_0.9.21.zip到指定位置,其中sourcejfreechart的源碼,jfreechart-0.9.21-demo.jar
       
是例子程序(該部分留給大家自己去研究)
    2
、爲了配置成功,我們需要關注的文件有如下三個:jfreechart-0.9.21.jarlib/jcommon-0.9.6.jar
       lib/gnujaxp.jar
    3
、如果是Application開發,把上述三個文件拷貝到%JAVA_HOME%/LIB中,同時在環境變量CLASSPATH中加入
       
如果是WEB開發,以TOMCAT中的一個WEB項目TEST爲例子說明:
       
把上述三個文件拷貝到TEST/WEB-INF/LIB中,然後修改TEST/WEB-INF/web.xml文件,在其中加入如下代碼:
                
                    DisplayChart
                    org.jfree.chart.servlet.DisplayChart
                
                
                    DisplayChart
                    /servlet/DisplayChart
                
               
至此jfreechart的配置就完成了,下面就可以進行jfreechart的開發了。這裏值得提出的是jfreechart的類
       
結構設計前後兼容性不是很好,不同版本的jfreechart中類庫結構可能不一樣,有時候可能需要查源碼。如果
       
是中文顯示的時候可能依據觀感需要改變源碼的字體,不過我個人覺得這個版本比以前版本要好一些。

三、JFreeChart功能介紹
    JFreeChart目前是最好的java圖形解決方案,基本能夠解決目前的圖形方面的需求,主要包括如下幾個方面:
    pie charts (2D and 3D)
:餅圖(平面和立體)
    bar charts (regular and stacked, with an optional 3D effect)
:柱狀圖
    line and area charts
:曲線圖
    scatter plots and bubble charts
    time series, high/low/open/close charts and candle stick charts
:時序圖
    combination charts
:複合圖
    Pareto charts
    Gantt charts
:甘特圖
    wind plots, meter charts and symbol charts
    wafer map charts
    (
態圖表,餅圖(二維和三維) , 柱狀圖 (水平,垂直),線圖,點圖,時間變化圖,甘特圖股票行情圖,混和圖溫度計圖刻度圖等常用商用圖表)
    
圖形可以導出成PNGJPEG格式,同時還可以與PDFEXCEL關聯
    
    JFreeChart
核心類庫介紹:
            
研究jfreechart源碼發現源碼的主要由兩個大的包組成:org.jfree.chart,org.jfree.data。其中前者主要與圖形
    
本身有關,後者與圖形顯示的數據有關。具體研究如果大家有興趣的話可以自己研究,以後有時間我會告訴大家怎麼去
    
研究源碼。
         
核心類主要有:
           org.jfree.chart.JFreeChart
:圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定製。JFreeChart引擎本身提供了一個工廠類用於創建不同類型的圖表對象
           org.jfree.data.category.XXXDataSet:
數據集對象,用於提供顯示圖表所用的數據。根據不同類型的圖表對應着很多類型的數據集對象類
           org.jfree.chart.plot.XXXPlot
:圖表區域對象,基本上這個對象決定着什麼樣式的圖表,創建該對象的時候需要AxisRenderer以及數據集對象的支持
           org.jfree.chart.axis.XXXAxis
:用於處理圖表的兩個軸:縱軸和橫軸
           org.jfree.chart.render.XXXRender
:負責如何顯示一個圖表對象
           org.jfree.chart.urls.XXXURLGenerator:
用於生成Web圖表中每個項目的鼠標點擊鏈接
           XXXXXToolTipGenerator:
用於生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類

四、jFreeChart產生圖形的流程
創建一個數據源(dataset)來包含將要在圖形中顯示的數據
創建一個 JFreeChart 對象來代表要顯示的圖形
把圖形輸出
重要的類和接口:
org.jfree.data.general.Dataset
所有數據源類都要實現的接口
org.jfree.chart.ChartFactory
由它來產生 JFreeChart 對象
org.jfree.chart.JFreeChart
所有對圖形的調整都是通過它噢!!
org.jfree.chart.plot.Plot
通過JFreeChart 對象獲得它,然後再通過它對圖形外部部分(例:座標軸)調整
注意:它有很多子類,一般都下嗍造型到它的子類!
org.jfree.chart.renderer.AbstractRenderer
通過JFreeChart 對象獲得它,然後再通過它對圖形內部部分
(例:折線的類型)調整。同樣,針對不同類型的報表圖,它有
着不同的子類實現!在下面我們簡稱它爲 Renderer
下面我們結合不同類型的圖形來具體分析這個流程。

五、餅圖
餅圖的dataset 一般是用PieDataset 接口,具體實現類是 DefaultPieDataset
1
、創建一個數據源(dataset):
private static PieDataset createDataset()
{
DefaultPieDataset defaultpiedataset = new DefaultPieDataset(); //
注意是DefaultPieDataset!!
defaultpiedataset.setValue(”One”, new Double(43.200000000000003D));
defaultpiedataset.setValue(”Two”, new Double(10D));
defaultpiedataset.setValue(”Three”, new Double(27.5D));
defaultpiedataset.setValue(”Four”, new Double(17.5D));
return defaultpiedataset;
}
2
、由ChartFactory 產生 JFreeChart 對象
private static JFreeChart createChart(PieDataset piedataset)
{
JFreeChart jfreechart = ChartFactory.createPieChart(”Pie Chart Demo 1″, //
圖形標題名稱
piedataset, // dataset
true, // legend?
true, // tooltips?
false); //URLs?
PiePlot pieplot = (PiePlot)jfreechart.getPlot(); //
通過JFreeChart 對象獲得 plotPiePlot!!
pieplot.setNoDataMessage(”No data available”); //
沒有數據的時候顯示的內容
return jfreechart;
}
一些重要的方法:
pieplot.setExplodePercent(0,0.3D) //
Lable ”One” 的那一塊出來30%
3
、輸出略

六、柱狀圖
柱狀圖的dataset 一般是用CatagoryDataset接口(具體實現類是DefaultCategoryDataset),也會用 IntervalXYDataset
接口
1
、創建一個數據源(dataset):
private static CategoryDataset createDataset()
{
String series1 = “First”;
String series2 = “Second”;
String series3 = “Third”;
String category1 = “Category 1″;
String category2 = “Category 2″;
String category3 = “Category 3″;
String category4 = “Category 4″;
String category5 = “Category 5″;
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(1.0D, series1, category1);
defaultcategorydataset.addValue(4D, series1, category2);
defaultcategorydataset.addValue(3D, series1, category3);
defaultcategorydataset.addValue(5D, series1, category4);
defaultcategorydataset.addValue(5D, series1, category5);

defaultcategorydataset.addValue(5D, series2, category1);
defaultcategorydataset.addValue(7D, series2, category2);
defaultcategorydataset.addValue(6D, series2, category3);
defaultcategorydataset.addValue(8D, series2, category4);
defaultcategorydataset.addValue(4D, series2, category5);

defaultcategorydataset.addValue(4D, series3, category1);
defaultcategorydataset.addValue(3D, series3, category2);
defaultcategorydataset.addValue(2D, series3, category3);
defaultcategorydataset.addValue(3D, series3, category4);
defaultcategorydataset.addValue(6D, series3, category5);
return defaultcategorydataset;
}
2
、由ChartFactory 產生 JFreeChart 對象
private static JFreeChart createChart(CategoryDataset categorydataset)
{
JFreeChart jfreechart = ChartFactory.createBarChart(
"Bar Chart Demo",
//
圖形標題名稱
"Category",
//domain Lable這裏先簡單理解爲橫座標Lable好了
"Value", //range Lable這裏也先簡單理解爲縱座標Lable好了
categorydataset,
// dataset
PlotOrientation.VERTICAL,
//垂直顯示
true,
// legend?
true, // tooltips?
false);
//URLs?
jfreechart.setBackgroundPaint(Color.white); //設定背景色爲白色
CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //
獲得 plotCategoryPlot!!
categoryplot.setBackgroundPaint(Color.lightGray); //
設定圖表數據顯示部分背景色
categoryplot.setDomainGridlinePaint(Color.white); //橫座標網格線白色
categoryplot.setDomainGridlinesVisible(true); //
可見
categoryplot.setRangeGridlinePaint(Color.white); //
縱座標網格線白色
//
設置series1category的顯示位置;類似效果圖http://www.chinabs.net/webimages/PieChart7.png
categoryplot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

//
使縱座標的最小單位格爲整數
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //
獲得renderer 注意這裏是下嗍造型到BarRenderer!!
//
顯示每個柱的數值,並修改該數值的字體屬性;類似效果圖http://www.chinabs.net/webimages/PieChart6.png
barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barrenderer.setItemLabelFont(new Font("
黑體",Font.PLAIN,12));
barrenderer.setItemLabelsVisible(true);

barrenderer.setDrawBarOutline(false); // Bar
的外輪廓線不畫
GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,0.0F, 0.0F, new Color(0, 0, 64)); //
設定特定顏色
GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green,0.0F, 0.0F, new Color(0, 64, 0));
GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F, Color.red,0.0F, 0.0F, new Color(64, 0, 0));
barrenderer.setSeriesPaint(0, gradientpaint); //
series1 Bar設定上面定義的顏色
barrenderer.setSeriesPaint(1, gradientpaint1); //
series2 Bar 設定上面定義的顏色
barrenderer.setSeriesPaint(2, gradientpaint2); //
series3 Bar 設定上面定義的顏色
CategoryAxis categoryaxis = categoryplot.getDomainAxis(); //
橫軸上的 Lable 45度傾斜
categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
return jfreechart;
}
一些重要的方法:(增加一塊標記)
IntervalMarker intervalmarker = new IntervalMarker(4.5D, 7.5D);
intervalmarker.setLabel("Target Range");
intervalmarker.setLabelFont(new Font(”SansSerif”, 2, 11));
intervalmarker.setLabelAnchor(RectangleAnchor.LEFT);
intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
intervalmarker.setPaint(new Color(222, 222, 255, 128));
categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND);

七、折線圖
折線圖的dataset 兩種CatagoryDataset接口(具體實現類是DefaultCategoryDataset),XYDataset 接口
1
CatagoryDataset接口:
A
、創建一個數據源(dataset):
private static CategoryDataset createDataset()
{
String series1 = “First”;
String series2 = “Second”;
String series3 = “Third”;
String type1 = “Type 1″;
String type2 = “Type 2″;
String type3 = “Type 3″;
String type4 = “Type 4″;
String type5 = “Type 5″;
String type6 = “Type 6″;
String type7 = “Type 7″;
String type8 = “Type 8″;
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(1.0D, series1, type1);
defaultcategorydataset.addValue(4D, series1, type2);
defaultcategorydataset.addValue(3D, series1, type3);
defaultcategorydataset.addValue(5D, series1, type4);
defaultcategorydataset.addValue(5D, series1, type5);
defaultcategorydataset.addValue(7D, series1, type6);
defaultcategorydataset.addValue(7D, series1, type7);
defaultcategorydataset.addValue(8D, series1, type8);

defaultcategorydataset.addValue(5D, series2, type1);
defaultcategorydataset.addValue(7D, series2, type2);
defaultcategorydataset.addValue(6D, series2, type3);
defaultcategorydataset.addValue(8D, series2, type4);
defaultcategorydataset.addValue(4D, series2, type5);
defaultcategorydataset.addValue(4D, series2, type6);
defaultcategorydataset.addValue(2D, series2, type7);
defaultcategorydataset.addValue(1.0D, series2, type8);

defaultcategorydataset.addValue(4D, series3, type1);
defaultcategorydataset.addValue(3D, series3, type2);
defaultcategorydataset.addValue(2D, series3, type3);
defaultcategorydataset.addValue(3D, series3, type4);
defaultcategorydataset.addValue(6D, series3, type5);
defaultcategorydataset.addValue(3D, series3, type6);
defaultcategorydataset.addValue(4D, series3, type7);
defaultcategorydataset.addValue(3D, series3, type8);
return defaultcategorydataset;
}
B
、由ChartFactory 產生 JFreeChart 對象 (與上面重複的部分就不再註釋)
private static JFreeChart createChart(CategoryDataset categorydataset)
{
JFreeChart jfreechart = ChartFactory.createLineChart(”Line Chart Demo 1″,
“Type”,
“Value”,
categorydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
categoryplot.setBackgroundPaint(Color.lightGray);
categoryplot.setRangeGridlinePaint(Color.white);
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
//
獲得renderer 注意這裏是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
lineandshaperenderer.setShapesVisible(true); //series
點(即數據點)可見
lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
10F, 6F
}, 0.0F)); //
定義series”First”的(即series1)點之間的連線 ,這裏是虛線,默認是直線
lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
6F, 6F
}, 0.0F)); //
定義series”Second”的(即series2)點之間的連線
lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
2.0F, 6F
}, 0.0F)); //
定義series”Third”的(即series3)點之間的連線
return jfreechart;
}
一些重要的方法:
lineandshaperenderer.setLineVisible(true) //series
點(即數據點)間有連線可見
2
XYDataset 接口:
A
、創建一個數據源(dataset):
private static XYDataset createDataset()
{
XYSeries xyseries = new XYSeries(”First”); //
先產生XYSeries 對象
xyseries.add(1.0D, 1.0D);
xyseries.add(2D, 4D);
xyseries.add(3D, 3D);
xyseries.add(4D, 5D);
xyseries.add(5D, 5D);
xyseries.add(6D, 7D);
xyseries.add(7D, 7D);
xyseries.add(8D, 8D);

XYSeries xyseries1 = new XYSeries(”Second”);
xyseries1.add(1.0D, 5D);
xyseries1.add(2D, 7D);
xyseries1.add(3D, 6D);
xyseries1.add(4D, 8D);
xyseries1.add(5D, 4D);
xyseries1.add(6D, 4D);
xyseries1.add(7D, 2D);
xyseries1.add(8D, 1.0D);

XYSeries xyseries2 = new XYSeries(”Third”);
xyseries2.add(3D, 4D);
xyseries2.add(4D, 3D);
xyseries2.add(5D, 2D);
xyseries2.add(6D, 3D);
xyseries2.add(7D, 6D);
xyseries2.add(8D, 3D);
xyseries2.add(9D, 4D);
xyseries2.add(10D, 3D);

XYSeriesCollection xyseriescollection = new XYSeriesCollection(); //
再用XYSeriesCollection添加入XYSeries 對象
xyseriescollection.addSeries(xyseries);
xyseriescollection.addSeries(xyseries1);
xyseriescollection.addSeries(xyseries2);
return xyseriescollection;
}
B
、由ChartFactory 產生 JFreeChart 對象
private static JFreeChart createChart(XYDataset xydataset)
{
JFreeChart jfreechart = ChartFactory.createXYLineChart(”Line Chart Demo 2″,
“X”,
“Y”,
xydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //
獲得 plotXYPlot!!
xyplot.setBackgroundPaint(Color.lightGray); //
設定圖表數據顯示部分背景色
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //
設定座標軸與圖表數據顯示部分距離
xyplot.setDomainGridlinePaint(Color.white); //
網格線顏色
xyplot.setRangeGridlinePaint(Color.white);
//
獲得 renderer 注意這裏是XYLineAndShapeRenderer !!
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setShapesVisible(true); //
數據點可見
xylineandshaperenderer.setShapesFilled(true); //
數據點被填充即不是空心點
NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
return jfreechart;
}
一些重要的方法:
XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();
xylineandshaperenderer.setSeriesLinesVisible(0, false); //
第一個XYSeries數據點間連線不可見
xylineandshaperenderer.setSeriesShapesVisible(1, false); //
第二個XYSeries數據點不可見
xyplot.setRenderer(xylineandshaperenderer);

八、時間序列圖
時間序列圖和折線圖很相似,不同的是它在 domain軸的數據是時間而不是數字。 時間序列圖的dataset
XYDataset
接口,具體實現類是TimeSeriesCollection ,和上面類似,有TimeSeries 對象,它被添加入
TimeSeriesCollection

1
、創建一個數據源(dataset):
private static XYDataset createDataset()
{
TimeSeries timeseries = new TimeSeries(”L&G European Index Trust”,Month.class);
timeseries.add(new Month(2, 2001), 181.8D);//
這裏用的是Month.class,同樣還有Day.class Year.class 等等
timeseries.add(new Month(3, 2001), 167.3D);
timeseries.add(new Month(4, 2001), 153.8D);
timeseries.add(new Month(5, 2001), 167.6D);
timeseries.add(new Month(6, 2001), 158.8D);
timeseries.add(new Month(7, 2001), 148.3D);
timeseries.add(new Month(8, 2001), 153.9D);
timeseries.add(new Month(9, 2001), 142.7D);
timeseries.add(new Month(10, 2001), 123.2D);
timeseries.add(new Month(11, 2001), 131.8D);
timeseries.add(new Month(12, 2001), 139.6D);
timeseries.add(new Month(1, 2002), 142.9D);
timeseries.add(new Month(2, 2002), 138.7D);
timeseries.add(new Month(3, 2002), 137.3D);
timeseries.add(new Month(4, 2002), 143.9D);
timeseries.add(new Month(5, 2002), 139.8D);
timeseries.add(new Month(6, 2002), 137D);
timeseries.add(new Month(7, 2002), 132.8D);

TimeSeries timeseries1 = new TimeSeries(”L&G UK Index Trust”,Month.class);
timeseries1.add(new Month(2, 2001), 129.6D);
timeseries1.add(new Month(3, 2001), 123.2D);
timeseries1.add(new Month(4, 2001), 117.2D);
timeseries1.add(new Month(5, 2001), 124.1D);
timeseries1.add(new Month(6, 2001), 122.6D);
timeseries1.add(new Month(7, 2001), 119.2D);
timeseries1.add(new Month(8, 2001), 116.5D);
timeseries1.add(new Month(9, 2001), 112.7D);
timeseries1.add(new Month(10, 2001), 101.5D);
timeseries1.add(new Month(11, 2001), 106.1D);
timeseries1.add(new Month(12, 2001), 110.3D);
timeseries1.add(new Month(1, 2002), 111.7D);
timeseries1.add(new Month(2, 2002), 111D);
timeseries1.add(new Month(3, 2002), 109.6D);
timeseries1.add(new Month(4, 2002), 113.2D);
timeseries1.add(new Month(5, 2002), 111.6D);
timeseries1.add(new Month(6, 2002), 108.8D);

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