【Android 应用开发】Android 图表绘制 achartengine 示例解析(二)

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【Android 应用开发】Android 图表绘制 achartengine 示例解析(二)

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




执行效果 :

image.png


目录
相关文章
|
25天前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
29 2
|
6天前
|
前端开发 JavaScript 测试技术
安卓应用开发中的架构模式解析
【6月更文挑战第21天】在软件开发领域,架构模式是设计优雅、高效、可维护应用程序的基石。本文深入探讨了安卓应用开发中常见的架构模式,包括MVC、MVP、MVVM和Clean Architecture,旨在为开发者提供一个清晰的指导,帮助他们选择最适合自己项目的架构风格。通过对比分析这些架构模式的特点、优势以及适用场景,文章揭示了如何根据项目需求和团队能力来采用恰当的架构模式,以实现代码的可维护性、可扩展性和可测试性。
25 7
|
4天前
|
机器学习/深度学习 数据采集 算法
特征工程与数据预处理全解析:基础技术和代码示例
在机器学习和数据科学的世界里,数据的质量是建模成功与否的关键所在。这就是特征工程和数据预处理发挥作用的地方。本文总结的这些关键步骤可以显著提高模型的性能,获得更准确的预测,我们将深入研究处理异常值、缺失值、编码、特征缩放和特征提取的各种技术。
9 0
|
6天前
|
Java 开发工具 Android开发
安卓与iOS开发差异解析
【6月更文挑战第21天】本文旨在深入探讨安卓和iOS两大移动操作系统在应用开发过程中的主要差异。通过对比分析,揭示各自的设计哲学、编程语言选择、用户界面构建、性能优化策略以及发布流程的异同。文章将提供开发者视角下的实用信息,帮助他们更好地理解各自平台的特点和挑战,从而做出更明智的开发决策。
|
17天前
|
搜索推荐 Android开发 iOS开发
深入解析安卓与iOS操作系统的异同
安卓和iOS是目前两大主流移动操作系统,它们分别代表了开放性和封闭性的设计理念。本文将从系统架构、用户界面、应用生态等方面深入探讨安卓和iOS之间的异同,帮助读者更好地理解这两个操作系统的特点和优势。
31 3
|
21天前
|
文字识别 算法 API
印刷文字识别产品使用合集之适合解析图表吗
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
22天前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
15 1
|
1天前
|
Android开发 开发者
“List of Devices Attached“:Android设备连接问题解析
“List of Devices Attached“:Android设备连接问题解析
|
2天前
|
缓存 安全 Java
提升编程效率的利器: 解析Google Guava库之集合工具类-50个示例(八)
提升编程效率的利器: 解析Google Guava库之集合工具类-50个示例(八)
|
2天前
|
缓存 算法 Java
提升编程效率的利器: 解析Google Guava库之常用工具类-40个示例(七)
提升编程效率的利器: 解析Google Guava库之常用工具类-40个示例(七)

推荐镜像

更多