Android利用AChartEngine繪製圖表

CSDN發表於2014-08-13

一. AChartEngine 簡介

1. 專案地址

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

最新版本 : 1.1.0 版本;

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

– 示例程式碼下載地址 : https://achartengine.googlecode.com/files/achartengine-1.1.0-demo-source.zip;

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

– 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包 文件 和 示例程式;

2. AChartEngine 執行機制

AChartEngine 執行示例圖 : 每個圖表都需要一個資料集 (Dataset) 和 渲染器集合 (Renderer);

 資料集 : 又由許多資料組成,

– 渲染器 : 也由不同的子渲染器組成,

– 獲取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);

程式碼示例 :

/**
* 曲線圖(資料集) : 建立曲線圖圖表資料集
*
* @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); /* 將單條曲線資料存放到 圖表資料集中 */
}
}

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

 

程式碼示例 :

/**
* 曲線圖(日期資料集) : 建立曲線圖資料集, 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;
}

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

 

程式碼示例 :

/**
* 曲線圖(渲染器) : 建立曲線圖圖表渲染器
*
* @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();

 

程式碼示例 :

/**
* 座標軸(渲染器) : 對曲線圖渲染器進行配置, 主要配置座標軸
*
* @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), 引數分別是 名稱 和 值;

 

程式碼示例 :

/**
* 餅圖(單資料) : 建立只包含一個餅圖的圖表資料集
*
* @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[] 陣列;

 

示例程式碼 :

/**
* 餅圖(資料集) : 建立包含多個餅圖的圖表資料集
* 多個餅圖通過大小環巢狀形式展示
*
* @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;
}

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

 

示例程式碼 :

/**
* 餅圖(渲染器) : 使用現有顏色建立餅圖渲染器
*
* @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 物件中;

 

示例程式碼 :

/**
* 柱狀圖(資料集) : 使用現有的資料, 建立一個柱狀圖資料集
*
* @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;
}

6. 柱狀圖渲染器

相關類介紹 :

– XYMultipleSeriesRenderer : 柱狀圖渲染器集合, 與曲線圖的渲染器是一樣的, 其中封裝了很多 SimpleSeriesRenderer 物件;

 SimpleSeriesRenderer : 柱狀圖中的單個柱狀圖渲染器, 可以封裝到 XYMultipleSeriesRenderer 物件中;

 

準備資料 :

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

 

程式碼示例 :

/**
* 柱狀圖(渲染器) : 建立柱狀圖渲染器
*
* @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 年銷售額, 將銷售額繪製到折線圖中, 並將它們的差繪製到面積圖中;

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

執行效果 :

相關文章