Android 圖表繪製 achartengine 示例解析

一. AChartEngine 簡介

 

 

1. 項目地址

 

AChartEngine 簡介 : AChartEngine 是 Android 平臺的圖表開發庫, 能繪製 折線圖, 餅圖, 氣泡圖, 柱狀圖, 散點圖, 面積圖等統計圖表;html

 

最新版本 : 1.1.0 版本;java

 

AChartEngine 地址 : https://code.google.com/p/achartengine/ ;android

-- 示例代碼下載地址 : https://achartengine.googlecode.com/files/achartengine-1.1.0-demo-source.zip;數組

-- 參考文檔下載地址 : https://achartengine.googlecode.com/files/achartengine-1.1.0-javadocs.zip;ide

-- jar包下載地址 : https://achartengine.googlecode.com/files/achartengine-1.1.0.jar;函數

 

CSDN資源下載 : http://download.csdn.net/detail/han1202012/7741579;字體

-- Google被牆因素 : 鑑於 Google 被河蟹了, 提供 CSDN 資源下載最新的 AChartEngine-1.1.0 版本的 JAR包 文檔 和 示例程序;ui

 

 

2. AChartEngine 運行機制

 

AChartEngine 運行示例圖 : 每一個圖表都須要一個數據集 (Dataset) 和 渲染器集合 (Renderer);google

-- 數據集 : 又由許多數據組成,spa

-- 渲染器 : 也由不一樣的子渲染器組成,

-- 獲取Activity 或 組件 : 圖表工廠 (ChartFactory) 經過調用 數據集 (Dataset) 和 渲染器集合 (Renderer) 能夠生成帶圖表的 GraphicalView 或者 GraphicalActivity;

/

 

AChartEngine 相關類介紹 :

-- ChartFactory : 圖表生成的工廠類, 經過你傳入 數據集 和 渲染器集合, 便可生成 GraphicalView 或者 GraphicalActivity;

-- XYMultipleSeriesDataset : 數據集, 其中能夠封裝圖表所需的數據;

-- XYSeries : 屬於 圖表數據集的一部分, 每一個都表明了一個數據集合 例如 折線, 一個圖表中能夠有多條折線, 全部的數據放在一塊兒就是 數據集 XYMultipleSeriesDataset ;

-- XYMultipleSeriesRenderer : 渲染器集合, 圖表中多個曲線的渲染器;

-- XYSeriesRenderer : 單個曲線或單元的渲染器, 一個圖表中可能有多條曲線或者柱狀圖等, 每一個都須要一個渲染器, 全部的渲染器放在一塊兒就是渲染器集合 XYMultipleSeriesRenderer;

 

 

二. AChartEngine 主要代碼解析

 

 

1. 曲線圖 柱狀圖 圖表數據集

 

 

(1) 針對 x y 軸數據都是 Double 的狀況

 

相關類介紹 :

-- XYMultipleSeriesDataset 類 : 該類能夠封裝 曲線圖 柱狀圖 等圖表的數據集, 這些圖表的共性是值都是由 x 和 y 數值組成的, 須要分別傳入 x 軸數據 和 y 軸數據;

-- XYSeries 類 : 圖表中有多個曲線, 該類封裝單個曲線的集合, XYMultipleSeriesDataset 封裝了多個 XYSeries;

 

須要準備的數據 :

-- 單組數據名稱集合 : String[] titles, 單組數據名稱 每條曲線可能有一個名稱, 一個圖表可能有多個曲線, 所以這裏須要一個 標題數組;

-- x軸數據組集合 : List<double[]> xValues, x 軸數據集合, 其中每一個數組都是一個 曲線的x軸數據, 整個 List 集合是多個曲線的數據;

-- y軸數據組集合 : List<double[]> yValues, y 軸數據集合, 整個 List 集合是多個曲線的 y 軸數據集合;

 

相關方法詳解 :

-- 建立 XYMultipleSeriesDataset 對象 : 直接調用無參數的構造方法便可, XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();

-- 建立 XYSeries 對象 : 該對象是單條曲線數據, 能夠設置 單條曲線標題, x 軸數據數組, y 軸數據數組, XYSeries series = new XYSeries(String titles, float scale);

-- 爲單個曲線添加數據 : 即未 XYSeries 對象添加兩個數組, 分別是 x 軸和 y 軸的數據, series.add(xV[k], yV[k]);

-- 將 XYSeries 對象添加到 XYMultipleSeriesDataset 對象中 : dataset.addSeries(series);

 

代碼示例 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
  * 曲線圖(數據集) : 建立曲線圖圖表數據集
  *
  * @param 賦予的標題
  * @param xValues x軸的數據
  * @param yValues y軸的數據
  * @return XY軸數據集
  */
protected XYMultipleSeriesDataset buildDataset(String[] titles, List< double []> xValues,
     List< double []> yValues) {
   XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); /* 建立圖表數據集 */
   addXYSeries(dataset, titles, xValues, yValues, 0 );              /* 添加單條曲線數據到圖表數據集中 */
   return dataset;
}
 
/**
  * 曲線圖(被調用方法) : 添加 XY 軸座標數據 到 XYMultipleSeriesDataset 數據集中
  *
  * @param dataset 最後的 XY 數據集結果, 至關與返回值在參數中
  * @param titles  要賦予的標題
  * @param xValues x軸數據集合
  * @param yValues y軸數據集合
  * @param scale   縮放
  *
  * titles 數組個數 與 xValues, yValues 個數相同
  * tittle 與 一個圖標可能有多條曲線, 每一個曲線都有一個標題
  * XYSeries 是曲線圖中的 一條曲線, 其中封裝了 曲線名稱, X軸和Y軸數據
  */
public void addXYSeries(XYMultipleSeriesDataset dataset, String[] titles, List< double []> xValues,
     List< double []> yValues, int scale) {
   int length = titles.length;                         /* 獲取標題個數 */
   for ( int i = 0 ; i < length; i++) {
     XYSeries series = new XYSeries(titles[i], scale); /* 單條曲線數據 */
     double [] xV = xValues.get(i);                     /* 獲取該條曲線的x軸座標數組 */
     double [] yV = yValues.get(i);                     /* 獲取該條曲線的y軸座標數組 */
     int seriesLength = xV.length;
     for ( int k = 0 ; k < seriesLength; k++) {
       series.add(xV[k], yV[k]);                       /* 將該條曲線的 x,y 軸數組存放到 單條曲線數據中 */
     }
     dataset.addSeries(series);                        /* 將單條曲線數據存放到 圖表數據集中 */
   }
}</ double []></ double []></ double []></ double []>



 

(2) x 軸是日期 y 軸是 Double

 

相關類介紹 :

-- XYMultipleSeriesDataset : 這種 日期-值 圖, 使用的圖表數據集也是該類;

-- TimeSeries : 這裏就不一樣了, 單個曲線的數據中由於要封裝 Date 數組, 所以要使用該類封裝 Date[] 和 Double[] 數據;

 

須要準備的數據 :

-- String[] titles : 圖表中有多個折線, 數組中每一個元素都是一個折線的標題;

-- List<date[]> xValues : List 集合中每一個 Date[] 都是一條曲線的 x 軸數據;

-- List<double[]> yValues : List 集合中每一個 double[] 都是一條曲線的 y 軸數據;

 

相關方法介紹 :

-- 建立單條曲線數據 TimeSeries 對象 : TimeSeries series = new TimeSeries(titles[i]), 參數是該條曲線的標題名稱;

-- 設置 日期 和 值數組給 TimeSeries 對象 : series.add(xV[k], yV[k]);

-- 將 TimeSeries 對象設置給 XYMultipleSeriesDataset 對象 : dataset.addSeries(series);

 

代碼示例 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
  * 曲線圖(日期數據集) : 建立曲線圖數據集, x軸是日期, y軸是具體的數值
  *
  * @param titles 各條曲線的標題, 放在一個數組中
  * @param xValues x軸的日誌值數組組成的集合
  * @param yValusey軸具體的數據值數組組成的集合
  * @return 具體的曲線圖圖表
  */
protected XYMultipleSeriesDataset buildDateDataset(String[] titles, List<date[]> xValues,
     List< double []> yValues) {
   XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); /* 建立圖表數據集 */
   int length = titles.length;                                     /* 獲取曲線個數, 每一個曲線都有一個標題 */
   for ( int i = 0 ; i < length; i++) {
     TimeSeries series = new TimeSeries(titles[i]);                /* 帶日期的單條曲線數據 */
     Date[] xV = xValues.get(i);                                   /* 獲取該條曲線數據的 日期數組 */
     double [] yV = yValues.get(i);                                 /* 獲取該條曲線數據的 值數組 */
     int seriesLength = xV.length;                                 /* 獲取該條曲線的值的個數, 即x軸點個數 */
     for ( int k = 0 ; k < seriesLength; k++) {
       series.add(xV[k], yV[k]);                                   /* 將日期數組 和 值數組設置給 帶日期的單條曲線數據 */
     }
     dataset.addSeries(series);                                    /* 將單條曲線數據設置給 圖標曲線數據集 */
   }
   return dataset;
}</ double []></date[]>



 

2. 曲線圖圖表渲染器

 

 

(1) 曲線渲染

 

相關類介紹 :

-- XYMultipleSeriesRenderer : 曲線圖總體渲染器, 其中封裝了許多 XYSeriesRenderer 單曲線渲染器;

-- XYSeriesRenderer : 單個曲線渲染器, 設置曲線的顏色 和 風格樣式;

 

數據準備 :

-- int[] colors : 顏色集合, 每種曲線都要有一個顏色值;

-- PointStyle[] styles : 曲線樣式集合, 每條曲線都有其繪製樣式;

 

XYMultipleSeriesRenderer 相關方法介紹 :

-- 設置 xy 軸標題字體大小 : setAxisTitleTextSize(int size);

-- 設置表格標題大小 : setChartTitleTextSize(int size);

-- 設置標籤文字大小 : setLabelsTextSize(int size);

-- 設置說明文字大小 : setLegendTextSize(int size);

-- 設置點的大小: setPointSize(int size);

-- 添加單曲線渲染器 : addSeriesRenderer(render);

 

XYSeriesRenderer 相關方法介紹 :

-- 建立對象 : XYSeriesRenderer r = new XYSeriesRenderer();

-- 設置單個曲線顏色 : r.setColor(colors[i]);

-- 設置單個曲線繪製風格 : r.setPointStyle(styles[i]);

 

代碼示例 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
  * 曲線圖(渲染器) : 建立曲線圖圖表渲染器
  *
  * @param 每條曲線要渲染的顏色, 把這些顏色放入數組
  * @param 每條曲線繪製點的風格
  * @return 數據渲染器集合
  */
protected XYMultipleSeriesRenderer buildRenderer( int [] colors, PointStyle[] styles) {
   XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); /* 建立曲線圖圖表渲染器 */
   setRenderer(renderer, colors, styles);                             /* 爲曲線圖渲染器設置顏色和樣式 */
   return renderer;
}
 
/**
  * 曲線圖(渲染器 - 被調用方法) : 設置座標軸渲染器
  *
  * @param renderer 設置的渲染器集合, 這個參數至關與返回值, 設置渲染器結果保存在這個參數中
  * @param colors   要渲染的顏色集合
  * @param styles   要渲染的樣式集合
  */
protected void setRenderer(XYMultipleSeriesRenderer renderer, int [] colors, PointStyle[] styles) {
   renderer.setAxisTitleTextSize( 16 );                  /* 設置XY軸標題字體大小 */
   renderer.setChartTitleTextSize( 20 );                 /* 設置表格標題文字大小 */
   renderer.setLabelsTextSize( 15 );                     /* 設置標籤文字大小 */
   renderer.setLegendTextSize( 15 );                     /* 設置說明文字大小 */
   renderer.setPointSize(5f);                          /* 設置點的大小 */
   renderer.setMargins( new int [] { 20 , 30 , 15 , 20 });  /* 設置 margin, 單位像素 */
   int length = colors.length;                         /* 獲取渲染器的個數, 即有多少條曲線 */
   for ( int i = 0 ; i < length; i++) {
     XYSeriesRenderer r = new XYSeriesRenderer();      /* 單個曲線的渲染器 */
     r.setColor(colors[i]);                            /* 爲單個曲線渲染器設置曲線顏色 */
     r.setPointStyle(styles[i]);                       /* 爲單個曲線渲染器設置曲線風格 */
     renderer.addSeriesRenderer(r);                    /* 將單個曲線渲染器設置到渲染器集合中 */
   }
}



 

(2) 座標軸設置

 

渲染器參數設置 : 座標軸渲染主要是對 XYMultipleSeriesRenderer 進行一系列的參數設置, 都是調用的 XYMultipleSeriesRenderer 對象中的方法;

-- 設置曲線標題 : setChartTitle(String tittle);

-- 設置 x 軸標題 : setXTitle(String tittle);

-- 設置 y 軸標題 : setYTitle(String tittle);

-- 設置 x 軸最小值 : setXAxisMin(double);

-- 設置 x 軸最大值 : setXAxisMax(double);

-- 設置 y 軸最小值 : setYAxisMin(double);

-- 設置 y 軸最大值 : setYAxisMax(double);

-- 設置座標軸顏色 : setAxesColor();

-- 設置標籤顏色 : setLabelsColor();

 

代碼示例 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
  * 座標軸(渲染器) : 對曲線圖渲染器進行配置, 主要配置座標軸
  *
  * @param renderer 要進行配置的渲染器
  * @param title 圖表的名稱
  * @param xTitle x軸座標的名稱
  * @param yTitle y軸座標的名稱
  * @param xMin x軸最小值
  * @param xMax x軸最大值
  * @param yMin y軸最小值
  * @param yMax y軸最大值
  * @param axesColor 座標軸的顏色
  * @param labelsColor 標籤的顏色
  */
protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle,
     String yTitle, double xMin, double xMax, double yMin, double yMax, int axesColor,
     int labelsColor) {
   renderer.setChartTitle(title);          /* 設置曲線圖標題 */
   renderer.setXTitle(xTitle);             /* 設置x軸標題 */
   renderer.setYTitle(yTitle);             /* 設置y軸標題 */
   renderer.setXAxisMin(xMin);             /* 設置x軸最小值 */
   renderer.setXAxisMax(xMax);             /* 設置x軸最大值 */
   renderer.setYAxisMin(yMin);             /* 設置y軸最小值 */
   renderer.setYAxisMax(yMax);             /* 設置y軸最大值 */
   renderer.setAxesColor(axesColor);       /* 設置座標軸顏色 */
   renderer.setLabelsColor(labelsColor);   /* 設置標籤顏色 */
}



 

3. 餅圖數據集

 

 

(1) 單個餅圖數據集

 

相關類介紹 :

-- CategorySeries : 餅圖數據集;

 

相關方法介紹 :

-- 添加數據元素 : CategorySeries.add(String category, double value), 參數分別是 名稱 和 值;

 

代碼示例 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
  * 餅圖(單數據) : 建立只包含一個餅圖的圖表數據集
  *
  * @param titles 餅圖的標題
  * @param values 餅圖的值組成的數組
  * @return 返回餅圖
  */
protected CategorySeries buildCategoryDataset(String title, double [] values) {
   CategorySeries series = new CategorySeries(title);  /* 建立單個餅狀圖數據, 傳入餅狀圖標題 */
   int k = 0 ;
   for ( double value : values) {
     series.add(Project  + ++k, value);                /* 鍵值對, 鍵是餅圖元素的標題, 值是大小 */
   }
 
   return series;
}



 

(2) 多餅圖圖表數據集

 

相關類介紹 :

-- MultipleCategorySeries : 多餅圖圖表數據集, 該類對象與單餅圖圖表數據集 CategorySeries 對象沒有包含關係;

 

準備數據 :

-- 餅圖每一個元素名稱 : List<string[]> titles, 其中集合中的數組就是一個餅圖每一個元素的集合;

-- 餅圖每一個元素的大小 : List<double[]> values, 其中的數組就是一個餅圖每一個元素的大小;

 

相關方法介紹 :

-- 建立多餅圖數據集 : MultipleCategorySeries series = new MultipleCategorySeries(title), 傳入圖表的名稱;

-- 添加一個餅圖的數據 : series.add(tittle, titles.get(k), value), 第一個參數是單個餅圖名稱, 第二個參數是餅圖元素名稱字符串數組, 第三個是餅圖元素大小 double[] 數組;

 

示例代碼 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
  * 餅圖(數據集) : 建立包含多個餅圖的圖表數據集
  *    多個餅圖經過大小環嵌套形式展現
  *
  * @param titles 圖表的標題
  * @param tittles 圖表中 每一個餅圖的標題 組成的數組
  * @param values 餅圖的值組成的數組 組成的集合
  * @return 返回餅圖圖表
  */
protected MultipleCategorySeries buildMultipleCategoryDataset(String title,
     List<string[]> titles, List< double []> values) {
   MultipleCategorySeries series = new MultipleCategorySeries(title);  /* 多個餅圖組成的圖表 */
   int k = 0 ;
   for ( double [] value : values) {
     /*
      * 第一個參數是 餅圖的名稱
      * 第二個參數是 餅圖的元素名稱組成的數組
      * 第三個參數是 餅圖的元素對應的數值組成的數組SimpleSeriesRenderer
      *
      * 注意 餅圖元素名稱數組 與 餅圖值數組 個數是相同的, 而且是對應的
      */
     series.add( 2007 + k + , titles.get(k), value);
     k++;
   }
   return series;
}</ double []></string[]>



 

4. 餅圖渲染器

 

相關類介紹 :

-- DefaultRenderer : 餅圖渲染器, 單餅圖 和 多餅圖使用的渲染器都是同一個;

-- DefaultRenderer : 餅圖單個元素渲染器, 一個餅圖有多個該渲染器渲染, 整個圖表有多組該渲染器;

 

數據準備 :

-- 餅圖元素的顏色 : int[] colors, 將餅圖中全部的顏色放在一個數組中, 每一個元素都有一個顏色;

 

DefaultRenderer 類方法介紹 :

-- 構造方法 : DefaultRenderer renderer = new DefaultRenderer();

-- 設置標籤文字大小 : setLabelsTextSize(int size);

-- 設置說明文字大小 : setLegendTextSize(int size);

-- 設置邊距 : setMargins(new int[] { 20, 30, 15, 0 });

-- 添加SimpleSeriesRenderer對象到該渲染器集合 : addSeriesRenderer(r);

 

SimpleSeriesRenderer 方法 :

-- 構造函數 : SimpleSeriesRenderer r = new SimpleSeriesRenderer();

-- 設置顏色 : setColor(color);

 

示例代碼 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
  * 餅圖(渲染器) : 使用現有顏色建立餅圖渲染器
  *
  * @param colors 顏色數組
  * @return 返回餅圖渲染器
  */
protected DefaultRenderer buildCategoryRenderer( int [] colors) {
   DefaultRenderer renderer = new DefaultRenderer();       /* 默認的餅圖圖表渲染器 */
   renderer.setLabelsTextSize( 15 );                         /* 設置標籤文字大小 */
   renderer.setLegendTextSize( 15 );                         /* 設置說明文字大小 */
   renderer.setMargins( new int [] { 20 , 30 , 15 , 0 });       /* 設置邊距 */
   for ( int color : colors) {
     SimpleSeriesRenderer r = new SimpleSeriesRenderer();  /* 餅狀圖中單個數據的顏色渲染器 */
     r.setColor(color);
     renderer.addSeriesRenderer(r);                        /* 將單個元素渲染器設置到餅圖圖表渲染器中 */
   }
   return renderer;
}

 

 

 

5. 柱狀圖數據集

 

相關類介紹 :

-- XYMultipleSeriesDataset : 封裝柱狀圖的數據, 其中可能有多個柱狀圖, 每一個都封裝了若干個 CategorySeries 單個數據集對象;

-- CategorySeries : 柱狀圖圖表中單個柱狀圖的數據, 能夠被封裝入 XYMultipleSeriesDataset 數據集中;

 

數據準備 :

-- 柱狀圖標題 : String[] titles, 因爲一個柱狀圖圖表中可能有多個柱狀圖, 所以須要一個字符串數組存放這些標題;

-- 柱狀圖值 : List<double[]> values, 集合中的每一個數組都表明了一個柱狀圖的值;

 

CategorySeries 方法介紹 :

-- 構造函數 : CategorySeries series = new CategorySeries(titles[i]), 傳入的參數是柱狀圖的值;

-- 設置值大小 : series.add(double), 具體的值須要一個一個去設定;

-- 轉換類型 : series.toXYSeries(), 只有轉換成 XYSeries 對象, 才能加入到 XYMultipleSeriesDataset 對象中;

 

示例代碼 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
  * 柱狀圖(數據集) : 使用現有的數據, 建立一個柱狀圖數據集
  *
  * @param titles 柱狀圖名稱數組
  * @param values 每一個柱狀圖中具體的多個值組成的數組 組成的 集合
  * @return the XY multiple bar dataset
  */
protected XYMultipleSeriesDataset buildBarDataset(String[] titles, List< double []> values) {
   XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();    /* 建立 XYMultipleSeriesDataset對象, 圖表的總數據集 */
   int length = titles.length;                                         /* 獲取圖表中柱狀圖個數 */
   for ( int i = 0 ; i < length; i++) {
     CategorySeries series = new CategorySeries(titles[i]);            /* 建立一個 CategorySeries對象, 單個柱狀圖數據 */
     double [] v = values.get(i);                                       /* 獲取本柱狀圖數值數組 */
     int seriesLength = v.length;                                      /* 獲取單個柱狀圖值的個數 */
     for ( int k = 0 ; k < seriesLength; k++) {                          
       series.add(v[k]);                                               /* 將具體的值設置給 CategorySeries對象, 單個柱狀圖數據 */
     }
     dataset.addSeries(series.toXYSeries());                           /* 將單個柱狀圖數據 CategorySeries對象 設置給 圖表數據集 XYMultipleSeriesDataset對象 */
   }
   return dataset;
}</ double []>



 

6. 柱狀圖渲染器

 

相關類介紹 :

-- XYMultipleSeriesRenderer : 柱狀圖渲染器集合, 與曲線圖的渲染器是同樣的, 其中封裝了不少 SimpleSeriesRenderer 對象;

-- SimpleSeriesRenderer : 柱狀圖中的單個柱狀圖渲染器, 能夠封裝到 XYMultipleSeriesRenderer 對象中;

 

準備數據 :

-- 柱狀圖顏色 : int[] colors, 一個柱狀圖的圖表中含有若干個柱狀圖, 每一個柱狀圖都設定一個顏色;

 

代碼示例 :

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
  * 柱狀圖(渲染器) : 建立柱狀圖渲染器
  *
  * @param colors 柱狀圖的顏色數組
  * @return 返回柱狀圖渲染器colors
  */
protected XYMultipleSeriesRenderer buildBarRenderer( int [] colors) {
   XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); /* 建立圖表渲染器 */
   renderer.setAxisTitleTextSize( 16 );                                  /* 設置座標軸標題字體大小 */
   renderer.setChartTitleTextSize( 20 );                                 /* 設置圖表標題字體大小 */
   renderer.setLabelsTextSize( 15 );                                     /* 設置標籤字體大小 */
   renderer.setLegendTextSize( 15 );                                     /* 設置說明文字字體大小 */
   int length = colors.length;                                         /* 獲取圖表中柱狀圖個數 */
   for ( int i = 0 ; i < length; i++) {
     SimpleSeriesRenderer r = new SimpleSeriesRenderer();              /* 單個柱狀圖渲染器 */
     r.setColor(colors[i]);                                            /* 爲單個柱狀圖渲染器設置顏色 */
     renderer.addSeriesRenderer(r);                                    /* 將單個柱狀圖渲染器設置給圖表渲染器 */
   }
   return renderer;
}

 

 

 

三. 銷售額對比圖(折線圖 面積圖)示例

 

需求分析 : 給出 2007 年和 2008 年銷售額, 將銷售額繪製到折線圖中, 並將它們的差繪製到面積圖中;

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package org.achartengine.chartdemo.demo.chart;
 
import java.util.ArrayList;
import java.util.List;
 
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer.FillOutsideLine;
 
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
 
/**
  * 銷售額對比圖表
  */
public class SalesComparisonChart extends AbstractDemoChart {
   /**
    * 獲取圖表名稱
    *
    * @return 圖表名稱
    */
   public String getName() {
     return 銷售額對比;
   }
 
   /**
    * 獲取圖表的描述信息
    *
    * @return 返回圖表的詳細信息
    */
   public String getDesc() {
     return 2 年內的月度銷售額發展 (插入了 折線圖 和 面積圖);
   }
 
   /**
    * 獲取圖表
    *
    * @param context 上下文對象
    * @return the built intent
    */
   public Intent execute(Context context) {
     String[] titles = new String[] { 2008 年銷售額, 2007 年銷售額,
         2008 年銷售額與 2007 年對比 };
     
     /* 初始化數據集 */
     List< double []> values = new ArrayList< double []>();
     /* 2008年銷售額 */
     values.add( new double [] { 14230 , 12300 , 14240 , 15244 , 14900 , 12200 , 11030 , 12000 , 12500 , 15500 ,
         14600 , 15000 });
     /* 2007年銷售額 */
     values.add( new double [] { 10230 , 10900 , 11240 , 12540 , 13500 , 14200 , 12530 , 11200 , 10500 , 12500 ,
         11600 , 13500 });
     
     /* 計算出兩年銷售額的對比差 2008年 減去 2007年 */
     int length = values.get( 0 ).length;
     double [] diff = new double [length];
     for ( int i = 0 ; i < length; i++) {
       diff[i] = values.get( 0 )[i] - values.get( 1 )[i];
     }
     values.add(diff);
     
     /* 第一條線 藍色 08年銷售額, 第二條線 藍綠色 07年銷售額, 第三個面積圖 綠色 兩年銷售額對比 */
     int [] colors = new int [] { Color.BLUE, Color.CYAN, Color.GREEN };
     PointStyle[] styles = new PointStyle[] { PointStyle.POINT, PointStyle.POINT, PointStyle.POINT };
     
     /* 建立圖表渲染器 */
     XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
     setChartSettings(renderer,  /* 渲染器 */
             兩年內的月度銷售額,  /* 圖表標題 */
             月份,                 /* x軸標題 */
             銷售單位,           /* y軸標題 */
             0.75 ,               /* x軸最小值 */
             12.25 ,              /* x軸最大值 */
             - 5000 ,              /* y軸最小值 */
             19000 ,              /* y軸最大值 */
             Color.GRAY,         /* 座標軸顏色 */
             Color.LTGRAY);      /* 標籤顏色 標籤即 圖表標題 xy軸標題 */
     
     renderer.setXLabels( 12 );                                /* 設置 x 軸刻度個數 */
     renderer.setYLabels( 10 );                                /* 設置 y 軸刻度個數 */
     renderer.setChartTitleTextSize( 20 );                     /* 設置表格標題字體大小 */
     renderer.setTextTypeface(sans_serif, Typeface.BOLD);    /* 設置字體 */
     renderer.setLabelsTextSize(14f);                        /*  */
     renderer.setAxisTitleTextSize( 15 );
     renderer.setLegendTextSize( 15 );
     length = renderer.getSeriesRendererCount();
 
     for ( int i = 0 ; i < length; i++) {
       /* 獲取具體的 渲染器 */
       XYSeriesRenderer seriesRenderer = (XYSeriesRenderer) renderer.getSeriesRendererAt(i);
       if (i == length - 1 ) {
         /* 單獨對面積圖渲染器進行設置 */
         FillOutsideLine fill = new FillOutsideLine(FillOutsideLine.Type.BOUNDS_ALL);
         fill.setColor(Color.GREEN);
         seriesRenderer.addFillOutsideLine(fill);
       }
       
       /* 設置折線圖渲染器 */
       seriesRenderer.setLineWidth( 2 .5f);
       seriesRenderer.setDisplayChartValues( true );
       seriesRenderer.setChartValuesTextSize(10f);
     }
     /*  */
     GraphicalView view = ChartFactory.getCubeLineChartView(context, buildBarDataset(titles, values), renderer, 0 .5f);
     return ChartFactory.getCubicLineChartIntent(context, buildBarDataset(titles, values), renderer,
         0 .5f);
   }
}
</ double []></ double []>



 

執行效果 :

/

 

 

做者 : 韓曙亮

轉載請註明出處 : http://blog.csdn.net/shulianghan/article/details/38420197

相關文章
相關標籤/搜索