天天看點

JFreeChart 餅圖、折線圖、柱狀圖

一、JFreeChart擷取。

JFreeChart是JFreeChart公司在開源網站SourceForge.net上的一個項目,該公司的主要産品有如下:

1、JFreeReport:報表解決工具

2、JFreeChart:Java圖形解決方案(Application/Applet/Servlet/Jsp)

3、JCommon:JFreeReport和JFreeChart的公共類庫

4、JFreeDesigner:JFreeReport的報表設計工具

我們可以從jfree官方網站上擷取最新版本和相關資料(但是jfree的document需要40美金才能擷取),

擷取位址:http://www.jfree.org/jfreechart/index.html(同時可以獲得簡明介紹)

我們以目前最新版本:jfreechart_0.9.21.zip為例子進行說明。

二、JFreeChart配置安裝

1、解壓jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源碼,jfreechart-0.9.21-demo.jar

是例子程式(該部分留給大家自己去研究)

2、為了配置成功,我們需要關注的檔案有如下三個:jfreechart-0.9.21.jar、lib\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

(态圖表,餅圖(二維和三維) , 柱狀圖 (水準,垂直),線圖,點圖,時間變化圖,甘特圖, 股票行情圖,混和圖, 溫度計圖, 刻度圖等常用商用圖表)

圖形可以導出成PNG和JPEG格式,同時還可以與PDF和EXCEL關聯

JFreeChart核心類庫介紹:

研究jfreechart源碼發現源碼的主要由兩個大的包組成:org.jfree.chart,org.jfree.data。其中前者主要與圖形

本身有關,後者與圖形顯示的資料有關。具體研究如果大家有興趣的話可以自己研究,以後有時間我會告訴大家怎麼去

研究源碼。

核心類主要有:

org.jfree.chart.JFreeChart:圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定制。JFreeChart引擎本身提供了一個工廠類用于建立不同類型的圖表對象

org.jfree.data.category.XXXDataSet:資料集對象,用于提供顯示圖表所用的資料。根據不同類型的圖表對應着很多類型的資料集對象類

org.jfree.chart.plot.XXXPlot:圖表區域對象,基本上這個對象決定着什麼樣式的圖表,建立該對象的時候需要Axis、Renderer以及資料集對象的支援

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 對象獲得 plot:PiePlot!!

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(); //獲得 plot:CategoryPlot!!

categoryplot.setBackgroundPaint(Color.lightGray); //設定圖表資料顯示部分背景色

categoryplot.setDomainGridlinePaint(Color.white); //橫坐标網格線白色

categoryplot.setDomainGridlinesVisible(true); //可見

categoryplot.setRangeGridlinePaint(Color.white); //縱坐标網格線白色

//設定series1與category的顯示位置;類似效果圖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(); //獲得 plot:XYPlot!!

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);

timeseries1.add(new Month(7, 2002), 101.6D);

TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();

timeseriescollection.addSeries(timeseries);

timeseriescollection.addSeries(timeseries1);

timeseriescollection.setDomainIsPointsInTime(true); //domain軸上的刻度點代表的是時間點而不是時間段

return timeseriescollection;

}

2、由ChartFactory 産生 JFreeChart 對象

private static JFreeChart createChart(XYDataset xydataset)

{

JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(”Legal & General Unit Trust Prices”,

“Date”,

“Price Per Unit”,

xydataset,

true,

true,

false);

jfreechart.setBackgroundPaint(Color.white);

XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //獲得 plot : XYPlot!!

xyplot.setBackgroundPaint(Color.lightGray);

xyplot.setDomainGridlinePaint(Color.white);

xyplot.setRangeGridlinePaint(Color.white);

xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));

xyplot.setDomainCrosshairVisible(true);

xyplot.setRangeCrosshairVisible(true);

org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot.getRenderer();

if(xyitemrenderer instanceof XYLineAndShapeRenderer)

{

XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyitemrenderer;

xylineandshaperenderer.setDefaultShapesVisible(true); //資料點可見

xylineandshaperenderer.setDefaultShapesFilled(true); //資料點是實心點

}

DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //對domain 軸上日期顯示格式定義

dateaxis.setDateFormatOverride(new SimpleDateFormat(”MMM-yyyy”));

return jfreechart;

}

一些重要的方法:

A、增加标記線:

xyplot.addRangeMarker(new ValueMarker(550D)); //數值軸

Quarter quarter = new Quarter(2, 2002);

xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //時間軸

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

餅圖 PieDataset(DefaultPieDataset) PiePlot ——

柱狀圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot BarRenderer

折線圖 CatagoryDataset(DefaultCategoryDataset) 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;

public class LineChartDemo5 extends ApplicationFrame {

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);

}

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;

}

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

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;

}

繼續閱讀