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;
/**
* 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


17:39
瀏覽 (377)
評論 (0)
分類: Web插件
收藏
2009-09-29
縮略顯示
jfreechart 生成折線圖,餅圖,柱狀圖,堆棧柱狀圖

最近公司使用jfreechart來生成統計圖,使用了折線圖,餅圖等,因爲用的1.0.8a版的jfreechart,與1.0.0版本的地方有很多不同,而且圖片生成清晰度比老版的高,如下是我做的demo.
1.所需包
(1) jfreechart-1.0.8a.jar
(2) jcommon-1.0.12.jar
2.運行環境
JDK 1.5
3.源代碼
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
/**
* 實際取色的時候一定要16位的,這樣比較準確
*
* @author new
*/
public class CreateChartServiceImpl
{
private static final String CHART_PATH = "E:/test/";
public static void main(String[] args)
{
// TODO Auto-generated method stub
CreateChartServiceImpl pm = new CreateChartServiceImpl();
// 生成餅狀圖
pm.makePieChart();
// 生成單組柱狀圖
pm.makeBarChart();
// 生成多組柱狀圖
pm.makeBarGroupChart();
// 生成堆積柱狀圖
pm.makeStackedBarChart();
// 生成折線圖
pm.makeLineAndShapeChart();
}
/**
* 生成折線圖
*/
public void makeLineAndShapeChart()
{
double[][] data = new double[][]
{
{ 672, 766, 223, 540, 126 },
{ 325, 521, 210, 340, 106 },
{ 332, 256, 523, 240, 526 } };
String[] rowKeys =
{ "蘋果", "梨子", "葡萄" };
String[] columnKeys =
{ "北京", "上海", "廣州", "成都", "深圳" };
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
createTimeXYChar("折線圖", "x軸", "y軸", dataset, "lineAndShap.png");
}
/**
* 生成分組的柱狀圖
*/
public void makeBarGroupChart()
{
double[][] data = new double[][]
{
{ 672, 766, 223, 540, 126 },
{ 325, 521, 210, 340, 106 },
{ 332, 256, 523, 240, 526 } };
String[] rowKeys =
{ "蘋果", "梨子", "葡萄" };
String[] columnKeys =
{ "北京", "上海", "廣州", "成都", "深圳" };
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
createBarChart(dataset, "x座標", "y座標", "柱狀圖", "barGroup.png");
}
/**
* 生成柱狀圖
*/
public void makeBarChart()
{
double[][] data = new double[][]
{
{ 672, 766, 223, 540, 126 } };
String[] rowKeys =
{ "蘋果" };
String[] columnKeys =
{ "北京", "上海", "廣州", "成都", "深圳" };
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
createBarChart(dataset, "x座標", "y座標", "柱狀圖", "bar.png");
}
/**
* 生成堆棧柱狀圖
*/
public void makeStackedBarChart()
{
double[][] data = new double[][]
{
{ 0.21, 0.66, 0.23, 0.40, 0.26 },
{ 0.25, 0.21, 0.10, 0.40, 0.16 } };
String[] rowKeys =
{ "蘋果", "梨子" };
String[] columnKeys =
{ "北京", "上海", "廣州", "成都", "深圳" };
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
createStackedBarChart(dataset, "x座標", "y座標", "柱狀圖", "stsckedBar.png");
}
/**
* 生成餅狀圖
*/
public void makePieChart()
{
double[] data =
{ 9, 91 };
String[] keys =
{ "失敗率", "成功率" };
createValidityComparePimChar(getDataPieSetByUtil(data, keys), "餅狀圖",
"pie2.png", keys);
}
// 柱狀圖,折線圖 數據集
public CategoryDataset getBarData(double[][] data, String[] rowKeys,
String[] columnKeys)
{
return DatasetUtilities
.createCategoryDataset(rowKeys, columnKeys, data);
}
// 餅狀圖 數據集
public PieDataset getDataPieSetByUtil(double[] data,
String[] datadescription)
{
if (data != null && datadescription != null)
{
if (data.length == datadescription.length)
{
DefaultPieDataset dataset = new DefaultPieDataset();
for (int i = 0; i < data.length; i++)
{
dataset.setValue(datadescription[i], data[i]);
}
return dataset;
}
}
return null;
}
/**
* 柱狀圖
*
*@param dataset 數據集
* @param xName x軸的說明(如種類,時間等)
* @param yName y軸的說明(如速度,時間等)
* @param chartTitle 圖標題
* @param charName 生成圖片的名字
* @return
*/
public String createBarChart(CategoryDataset dataset, String xName,
String yName, String chartTitle, String charName)
{
JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 圖表標題
xName, // 目錄軸的顯示標籤
yName, // 數值軸的顯示標籤
dataset, // 數據集
PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
true, // 是否顯示圖例(對於簡單的柱狀圖必須是false)
false, // 是否生成工具
false // 是否生成URL鏈接
);
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
/*
* VALUE_TEXT_ANTIALIAS_OFF表示將文字的抗鋸齒關閉,
* 使用的關閉抗鋸齒後,字體儘量選擇12到14號的宋體字,這樣文字最清晰好看
*/
// chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.white);
// create plot
CategoryPlot plot = chart.getCategoryPlot();
// 設置橫虛線可見
plot.setRangeGridlinesVisible(true);
// 虛線色彩
plot.setRangeGridlinePaint(Color.gray);
// 數據軸精度
NumberAxis vn = (NumberAxis) plot.getRangeAxis();
// vn.setAutoRangeIncludesZero(true);
DecimalFormat df = new DecimalFormat("#0.00");
vn.setNumberFormatOverride(df); // 數據軸數據標籤的顯示格式
// x軸設置
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// 軸標題
domainAxis.setTickLabelFont(labelFont);// 軸數值
// Lable(Math.PI/3.0)度傾斜
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions
// .createUpRotationLabelPositions(Math.PI / 3.0));
domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 橫軸上的 Lable 是否完整顯示
// 設置距離圖片左端距離
domainAxis.setLowerMargin(0.1);
// 設置距離圖片右端距離
domainAxis.setUpperMargin(0.1);
// 設置 columnKey 是否間隔顯示
// domainAxis.setSkipCategoryLabelsToFit(true);
plot.setDomainAxis(domainAxis);
// 設置柱圖背景色(注意,系統取色的時候要使用16位的模式來查看顏色編碼,這樣比較準確)
plot.setBackgroundPaint(new Color(255, 255, 204));
// y軸設置
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(labelFont);
rangeAxis.setTickLabelFont(labelFont);
// 設置最高的一個 Item 與圖片頂端的距離
rangeAxis.setUpperMargin(0.15);
// 設置最低的一個 Item 與圖片底端的距離
rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);
BarRenderer renderer = new BarRenderer();
// 設置柱子寬度
renderer.setMaximumBarWidth(0.05);
// 設置柱子高度
renderer.setMinimumBarLength(0.2);
// 設置柱子邊框顏色
renderer.setBaseOutlinePaint(Color.BLACK);
// 設置柱子邊框可見
renderer.setDrawBarOutline(true);
// // 設置柱的顏色
renderer.setSeriesPaint(0, new Color(204, 255, 255));
renderer.setSeriesPaint(1, new Color(153, 204, 255));
renderer.setSeriesPaint(2, new Color(51, 204, 204));
// 設置每個地區所包含的平行柱的之間距離
renderer.setItemMargin(0.0);
// 顯示每個柱的數值,並修改該數值的字體屬性
renderer.setIncludeBaseInRange(true);
renderer
.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
plot.setRenderer(renderer);
// 設置柱的透明度
plot.setForegroundAlpha(1.0f);
FileOutputStream fos_jpg = null;
try
{
isChartPathExist(CHART_PATH);
String chartName = CHART_PATH + charName;
fos_jpg = new FileOutputStream(chartName);
ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);
return chartName;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
finally
{
try
{
fos_jpg.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* 橫向圖
*
* @param dataset 數據集
* @param xName x軸的說明(如種類,時間等)
* @param yName y軸的說明(如速度,時間等)
* @param chartTitle 圖標題
* @param charName 生成圖片的名字
* @return
*/
public String createHorizontalBarChart(CategoryDataset dataset,
String xName, String yName, String chartTitle, String charName)
{
JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 圖表標題
xName, // 目錄軸的顯示標籤
yName, // 數值軸的顯示標籤
dataset, // 數據集
PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
true, // 是否顯示圖例(對於簡單的柱狀圖必須是false)
false, // 是否生成工具
false // 是否生成URL鏈接
);
CategoryPlot plot = chart.getCategoryPlot();
// 數據軸精度
NumberAxis vn = (NumberAxis) plot.getRangeAxis();
//設置刻度必須從0開始
// vn.setAutoRangeIncludesZero(true);
DecimalFormat df = new DecimalFormat("#0.00");
vn.setNumberFormatOverride(df); // 數據軸數據標籤的顯示格式
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 橫軸上的
// Lable
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
domainAxis.setLabelFont(labelFont);// 軸標題
domainAxis.setTickLabelFont(labelFont);// 軸數值
domainAxis.setMaximumCategoryLabelWidthRatio(0.8f);// 橫軸上的 Lable 是否完整顯示
// domainAxis.setVerticalCategoryLabels(false);
plot.setDomainAxis(domainAxis);
ValueAxis rangeAxis = plot.getRangeAxis();
// 設置最高的一個 Item 與圖片頂端的距離
rangeAxis.setUpperMargin(0.15);
// 設置最低的一個 Item 與圖片底端的距離
rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);
BarRenderer renderer = new BarRenderer();
// 設置柱子寬度
renderer.setMaximumBarWidth(0.03);
// 設置柱子高度
renderer.setMinimumBarLength(30);
renderer.setBaseOutlinePaint(Color.BLACK);
// 設置柱的顏色
renderer.setSeriesPaint(0, Color.GREEN);
renderer.setSeriesPaint(1, new Color(0, 0, 255));
// 設置每個地區所包含的平行柱的之間距離
renderer.setItemMargin(0.5);
// 顯示每個柱的數值,並修改該數值的字體屬性
renderer
.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
// 設置柱的數值可見
renderer.setBaseItemLabelsVisible(true);
plot.setRenderer(renderer);
// 設置柱的透明度
plot.setForegroundAlpha(0.6f);
FileOutputStream fos_jpg = null;
try
{
isChartPathExist(CHART_PATH);
String chartName = CHART_PATH + charName;
fos_jpg = new FileOutputStream(chartName);
ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);
return chartName;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
finally
{
try
{
fos_jpg.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* 餅狀圖
*
* @param dataset 數據集
* @param chartTitle 圖標題
* @param charName 生成圖的名字
* @param pieKeys 分餅的名字集
* @return
*/
public String createValidityComparePimChar(PieDataset dataset,
String chartTitle, String charName, String[] pieKeys)
{
JFreeChart chart = ChartFactory.createPieChart3D(chartTitle, // chart
// title
dataset,// data
true,// include legend
true, false);
// 使下說明標籤字體清晰,去鋸齒類似於
// chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);的效果
chart.setTextAntiAlias(false);
// 圖片背景色
chart.setBackgroundPaint(Color.white);
// 設置圖標題的字體重新設置title
Font font = new Font("隸書", Font.BOLD, 25);
TextTitle title = new TextTitle(chartTitle);
title.setFont(font);
chart.setTitle(title);
PiePlot3D plot = (PiePlot3D) chart.getPlot();
// 圖片中顯示百分比:默認方式
// 指定餅圖輪廓線的顏色
// plot.setBaseSectionOutlinePaint(Color.BLACK);
// plot.setBaseSectionPaint(Color.BLACK);
// 設置無數據時的信息
plot.setNoDataMessage("無對應的數據,請重新查詢。");
// 設置無數據時的信息顯示顏色
plot.setNoDataMessagePaint(Color.red);
// 圖片中顯示百分比:自定義方式,{0} 表示選項, {1} 表示數值, {2} 表示所佔比例 ,小數點後兩位
plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}={1}({2})", NumberFormat.getNumberInstance(),
new DecimalFormat("0.00%")));
// 圖例顯示百分比:自定義方式, {0} 表示選項, {1} 表示數值, {2} 表示所佔比例
plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}={1}({2})"));
plot.setLabelFont(new Font("SansSerif", Font.TRUETYPE_FONT, 12));
// 指定圖片的透明度(0.0-1.0)
plot.setForegroundAlpha(0.65f);
// 指定顯示的餅圖上圓形(false)還橢圓形(true)
plot.setCircular(false, true);
// 設置第一個 餅塊section 的開始位置,默認是12點鐘方向
plot.setStartAngle(90);
// // 設置分餅顏色
plot.setSectionPaint(pieKeys[0], new Color(244, 194, 144));
plot.setSectionPaint(pieKeys[1], new Color(144, 233, 144));
FileOutputStream fos_jpg = null;
try
{
// 文件夾不存在則創建
isChartPathExist(CHART_PATH);
String chartName = CHART_PATH + charName;
fos_jpg = new FileOutputStream(chartName);
// 高寬的設置影響橢圓餅圖的形狀
ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 230);
return chartName;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
finally
{
try
{
fos_jpg.close();
System.out.println("create pie-chart.");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* 判斷文件夾是否存在,如果不存在則新建
* @param chartPath
*/
private void isChartPathExist(String chartPath)
{
File file = new File(chartPath);
if (!file.exists())
{
file.mkdirs();
// log.info("CHART_PATH="+CHART_PATH+"create.");
}
}
/**
* 折線圖
*
* @param chartTitle
* @param x
* @param y
* @param xyDataset
* @param charName
* @return
*/
public String createTimeXYChar(String chartTitle, String x, String y,
CategoryDataset xyDataset, String charName)
{
JFreeChart chart = ChartFactory.createLineChart(chartTitle, x, y,
xyDataset, PlotOrientation.VERTICAL, true, true, false);
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.WHITE);
// 設置圖標題的字體重新設置title
Font font = new Font("隸書", Font.BOLD, 25);
TextTitle title = new TextTitle(chartTitle);
title.setFont(font);
chart.setTitle(title);
// 設置面板字體
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
// x軸 // 分類軸網格是否可見
categoryplot.setDomainGridlinesVisible(true);
// y軸 //數據軸網格是否可見
categoryplot.setRangeGridlinesVisible(true);
categoryplot.setRangeGridlinePaint(Color.WHITE);// 虛線色彩
categoryplot.setDomainGridlinePaint(Color.WHITE);// 虛線色彩
categoryplot.setBackgroundPaint(Color.lightGray);
// 設置軸和麪板之間的距離
// categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
CategoryAxis domainAxis = categoryplot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// 軸標題
domainAxis.setTickLabelFont(labelFont);// 軸數值
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 橫軸上的
// Lable
// 45度傾斜
// 設置距離圖片左端距離
domainAxis.setLowerMargin(0.0);
// 設置距離圖片右端距離
domainAxis.setUpperMargin(0.0);
NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
// 獲得renderer 注意這裏是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot
.getRenderer();
lineandshaperenderer.setBaseShapesVisible(true); // series 點(即數據點)可見
lineandshaperenderer.setBaseLinesVisible(true); // series 點(即數據點)間有連線可見
// 顯示折點數據
// lineandshaperenderer.setBaseItemLabelGenerator(new
// StandardCategoryItemLabelGenerator());
// lineandshaperenderer.setBaseItemLabelsVisible(true);
FileOutputStream fos_jpg = null;
try
{
isChartPathExist(CHART_PATH);
String chartName = CHART_PATH + charName;
fos_jpg = new FileOutputStream(chartName);
// 將報表保存爲png文件
ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 510);
return chartName;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
finally
{
try
{
fos_jpg.close();
System.out.println("create time-createTimeXYChar.");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* 堆棧柱狀圖
*
* @param dataset
* @param xName
* @param yName
* @param chartTitle
* @param charName
* @return
*/
public String createStackedBarChart(CategoryDataset dataset, String xName,
String yName, String chartTitle, String charName)
{
// 1:得到 CategoryDataset
// 2:JFreeChart對象
JFreeChart chart = ChartFactory.createStackedBarChart(chartTitle, // 圖表標題
xName, // 目錄軸的顯示標籤
yName, // 數值軸的顯示標籤
dataset, // 數據集
PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
true, // 是否顯示圖例(對於簡單的柱狀圖必須是false)
false, // 是否生成工具
false // 是否生成URL鏈接
);
// 圖例字體清晰
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.WHITE);
// 2 .2 主標題對象 主標題對象是 TextTitle 類型
chart
.setTitle(new TextTitle(chartTitle, new Font("隸書", Font.BOLD,
25)));
// 2 .2.1:設置中文
// x,y軸座標字體
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
// 2 .3 Plot 對象 Plot 對象是圖形的繪製結構對象
CategoryPlot plot = chart.getCategoryPlot();
// 設置橫虛線可見
plot.setRangeGridlinesVisible(true);
// 虛線色彩
plot.setRangeGridlinePaint(Color.gray);
// 數據軸精度
NumberAxis vn = (NumberAxis) plot.getRangeAxis();
// 設置最大值是1
vn.setUpperBound(1);
// 設置數據軸座標從0開始
// vn.setAutoRangeIncludesZero(true);
// 數據顯示格式是百分比
DecimalFormat df = new DecimalFormat("0.00%");
vn.setNumberFormatOverride(df); // 數據軸數據標籤的顯示格式
// DomainAxis (區域軸,相當於 x 軸), RangeAxis (範圍軸,相當於 y 軸)
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// 軸標題
domainAxis.setTickLabelFont(labelFont);// 軸數值
// x軸座標太長,建議設置傾斜,如下兩種方式選其一,兩種效果相同
// 傾斜(1)橫軸上的 Lable 45度傾斜
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
// 傾斜(2)Lable(Math.PI 3.0)度傾斜
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions
// .createUpRotationLabelPositions(Math.PI / 3.0));
domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 橫軸上的 Lable 是否完整顯示
plot.setDomainAxis(domainAxis);
// y軸設置
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(labelFont);
rangeAxis.setTickLabelFont(labelFont);
// 設置最高的一個 Item 與圖片頂端的距離
rangeAxis.setUpperMargin(0.15);
// 設置最低的一個 Item 與圖片底端的距離
rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);
// Renderer 對象是圖形的繪製單元
StackedBarRenderer renderer = new StackedBarRenderer();
// 設置柱子寬度
renderer.setMaximumBarWidth(0.05);
// 設置柱子高度
renderer.setMinimumBarLength(0.1);
//設置柱的邊框顏色
renderer.setBaseOutlinePaint(Color.BLACK);
//設置柱的邊框可見
renderer.setDrawBarOutline(true);
// // 設置柱的顏色(可設定也可默認)
renderer.setSeriesPaint(0, new Color(204, 255, 204));
renderer.setSeriesPaint(1, new Color(255, 204, 153));
// 設置每個地區所包含的平行柱的之間距離
renderer.setItemMargin(0.4);
plot.setRenderer(renderer);
// 設置柱的透明度(如果是3D的必須設置才能達到立體效果,如果是2D的設置則使顏色變淡)
// plot.setForegroundAlpha(0.65f);
FileOutputStream fos_jpg = null;
try
{
isChartPathExist(CHART_PATH);
String chartName = CHART_PATH + charName;
fos_jpg = new FileOutputStream(chartName);
ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);
return chartName;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
finally
{
try
{
fos_jpg.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
發佈了44 篇原創文章 · 獲贊 11 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章