作者 : 韩曙亮
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38420197
一. 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);
代码示例 :
-
-
-
-
-
-
-
-
- protected XYMultipleSeriesDataset buildDataset(String[] titles, List<double[]> xValues,
- List<double[]> yValues) {
- XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
- addXYSeries(dataset, titles, xValues, yValues, 0);
- return dataset;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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);
- double[] yV = yValues.get(i);
- int seriesLength = xV.length;
- for (int k = 0; k < seriesLength; k++) {
- series.add(xV[k], yV[k]);
- }
- 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);
代码示例 :
-
-
-
-
-
-
-
-
- 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;
- 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]);
代码示例 :
-
-
-
-
-
-
-
- protected XYMultipleSeriesRenderer buildRenderer(int[] colors, PointStyle[] styles) {
- XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
- setRenderer(renderer, colors, styles);
- return renderer;
- }
-
-
-
-
-
-
-
-
- protected void setRenderer(XYMultipleSeriesRenderer renderer, int[] colors, PointStyle[] styles) {
- renderer.setAxisTitleTextSize(16);
- renderer.setChartTitleTextSize(20);
- renderer.setLabelsTextSize(15);
- renderer.setLegendTextSize(15);
- renderer.setPointSize(5f);
- renderer.setMargins(new int[] { 20, 30, 15, 20 });
- 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();
代码示例 :
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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);
- renderer.setYTitle(yTitle);
- renderer.setXAxisMin(xMin);
- renderer.setXAxisMax(xMax);
- renderer.setYAxisMin(yMin);
- renderer.setYAxisMax(yMax);
- renderer.setAxesColor(axesColor);
- renderer.setLabelsColor(labelsColor);
- }
3. 饼图数据集
(1) 单个饼图数据集
相关类介绍 :
-- CategorySeries : 饼图数据集;
相关方法介绍 :
-- 添加数据元素 : CategorySeries.add(String category, double value), 参数分别是 名称 和 值;
代码示例 :
-
-
-
-
-
-
-
- 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[] 数组;
示例代码 :
-
-
-
-
-
-
-
-
-
- protected MultipleCategorySeries buildMultipleCategoryDataset(String title,
- List<String[]> titles, List<double[]> values) {
- MultipleCategorySeries series = new MultipleCategorySeries(title);
- int k = 0;
- for (double[] value : values) {
-
-
-
-
-
-
-
- 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);
示例代码 :
-
-
-
-
-
-
- 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 对象中;
示例代码 :
-
-
-
-
-
-
-
- protected XYMultipleSeriesDataset buildBarDataset(String[] titles, List<double[]> values) {
- XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
- int length = titles.length;
- for (int i = 0; i < length; i++) {
- CategorySeries series = new CategorySeries(titles[i]);
- double[] v = values.get(i);
- int seriesLength = v.length;
- for (int k = 0; k < seriesLength; k++) {
- series.add(v[k]);
- }
- dataset.addSeries(series.toXYSeries());
- }
- return dataset;
- }
6. 柱状图渲染器
相关类介绍 :
-- XYMultipleSeriesRenderer : 柱状图渲染器集合, 与曲线图的渲染器是一样的, 其中封装了很多 SimpleSeriesRenderer 对象;
-- SimpleSeriesRenderer : 柱状图中的单个柱状图渲染器, 可以封装到 XYMultipleSeriesRenderer 对象中;
准备数据 :
-- 柱状图颜色 : int[] 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 {
-
-
-
-
-
- public String getName() {
- return "销售额对比";
- }
-
-
-
-
-
-
- public String getDesc() {
- return "2年内的月度销售额发展 (插入了 折线图 和 面积图)";
- }
-
-
-
-
-
-
-
- public Intent execute(Context context) {
- String[] titles = new String[] { "2008 年销售额", "2007 年销售额",
- "2008年销售额与2007年对比" };
-
-
- List<double[]> values = new ArrayList<double[]>();
-
- values.add(new double[] { 14230, 12300, 14240, 15244, 14900, 12200, 11030, 12000, 12500, 15500,
- 14600, 15000 });
-
- values.add(new double[] { 10230, 10900, 11240, 12540, 13500, 14200, 12530, 11200, 10500, 12500,
- 11600, 13500 });
-
-
- 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);
-
-
- 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,
- "两年内的月度销售额",
- "月份",
- "销售单位",
- 0.75,
- 12.25,
- -5000,
- 19000,
- Color.GRAY,
- Color.LTGRAY);
-
- renderer.setXLabels(12);
- renderer.setYLabels(10);
- 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);
- }
- }
执行效果 :
作者 : 韩曙亮
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38420197