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); } }
执行效果 :