`
zhenping
  • 浏览: 83225 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

AChartEngine高级应用之CombinedXYChart(组合统计图)在单个统计图上显示多样化的数据

 
阅读更多

AChartEngine高级应用之CombinedXYChart(组合统计图)在单个统计图上显示多样化的数据

现在是信息飞速发展时代,单个的统计图已经无法满足实际生产的要求,人们只想通过快速的观察就能知道很多信息,所以组合统计图就运用而生了,诸如,人们想了解一个地方的大致情况,首先可能要了解当地的天气情况,交通运输情况等,以下我模拟的是一个地方的天气、光照时间分布情况的统计图。这个是AChartEngine图表的高级应用。

构建CombinedXYChart图的步骤主要分为以下三步,还需要在项目中引入AChartEngine依赖jar包,在Manifest中添加:<activityandroid:name="org.achartengine.GraphicalActivity" />

1.设置XYMultipleSeriesRenderer

XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();// 设置描绘器

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

}

renderer.setXLabels(12);// X轴均分12项

renderer.setYLabels(10);// Y轴均分10项

renderer.setShowGrid(true);// 显示表格

renderer.setXLabelsAlign(Align.RIGHT);// 右对齐

renderer.setYLabelsAlign(Align.RIGHT);

renderer.setZoomButtonsVisible(false);// 不显示放大缩小

renderer.setPanEnabled(false, false);// 上下左右都不可以移动

//dataset.addSeries(0, sunSeries);

dataset.addSeries(0, waterSeries);

//renderer.addSeriesRenderer(0, lightRenderer);

renderer.addSeriesRenderer(0, waterRenderer);

2.构建数据源XYMultipleSeriesDataset

// --------------------------曲线start---------------------------------------

String[] titles = new String[] { "最低温度", "最高温度", "平均光照时间" };// 曲线标题

List<double[]> x = new ArrayList<double[]>();

for (int i = 0; i < titles.length; i++) {

x.add(new double[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 });

}

List<double[]> values = new ArrayList<double[]>();

values.add(new double[] { -12.3, -8, -2, 3, 16, 18, 26.4, 26.9, 18.6,

12.3, -2, -10 });

values.add(new double[] { 9, 10, 11, 15, 19, 23, 38, 40, 37, 32, 23, 10 });

values.add(new double[] { 6.3, 7.5, 8.5, 9.8, 10.8, 11.3, 13.5, 14.1, 10.3, 9.5, 9.2, 8 });

int[] colors = new int[] { Color.GREEN, Color.RED, Color.YELLOW };// 绿色,红色

PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE,// 圆圈状

PointStyle.DIAMOND, PointStyle.SQUARE };// 菱形状,矩形状

XYSeries waterSeries = new XYSeries("平均温度");

waterSeries.add(1, -3);// 添加数据

waterSeries.add(2, 6);

waterSeries.add(3, 10);

waterSeries.add(4, 17);

waterSeries.add(5, 20);

waterSeries.add(6, 26);

waterSeries.add(7, 29);

waterSeries.add(8, 30);

waterSeries.add(9, 23);

waterSeries.add(10, 19);

waterSeries.add(11, 10);

waterSeries.add(12, -1);

renderer.setBarSpacing(0.5);

XYSeriesRenderer waterRenderer = new XYSeriesRenderer();

waterRenderer.setColor(Color.CYAN);// 青色

waterRenderer.setDisplayChartValues(true);// 显示数值

waterRenderer.setChartValuesTextSize(10);// 设置数值字体

XYMultipleSeriesDataset dataset = buildDataset(titles, x, values);

//dataset.addSeries(0, sunSeries);

dataset.addSeries(0, waterSeries);

//renderer.addSeriesRenderer(0, lightRenderer);

renderer.addSeriesRenderer(0, waterRenderer);

3.通过ChartFactory生成CombinedXYChartView组合统计图

mViewChart = ChartFactory.getCombinedXYChartView(

getApplicationContext(), dataset, renderer, types);// 通过ChartFactory生成图表

mLayout.addView(mViewChart, new LayoutParams(LayoutParams.FILL_PARENT,

LayoutParams.FILL_PARENT));// 将图表添加到布局中去

效果图:

Code:

package com.qiuzhping.achart;

import java.util.ArrayList;
import java.util.List;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.BarChart;
import org.achartengine.chart.BubbleChart;
import org.achartengine.chart.CubicLineChart;
import org.achartengine.chart.LineChart;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.model.XYValueSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.util.Log;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.LinearLayout;

public class CombinedChart extends Activity {
	protected XYMultipleSeriesRenderer buildRenderer(int[] colors,
			PointStyle[] styles) {
		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();// 设置两个描绘器
		setRenderer(renderer, colors, styles);
		return renderer;
	}

	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);// X轴颜色
		renderer.setLabelsColor(labelsColor);// Y轴颜色
	}

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

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

	protected XYMultipleSeriesDataset buildDataset(String[] titles,
			List<double[]> xValues, List<double[]> yValues) {// 设置数据集
		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
		addXYSeries(dataset, titles, xValues, yValues, 0);
		return dataset;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);// 消除标题栏
		setContentView(R.layout.xy_chart);
		LinearLayout mLinear = (LinearLayout) findViewById(R.id.chart);// 获取布局
		mLinear.setBackgroundColor(Color.BLACK);// 设置背景色
		// --------------------------曲线start---------------------------------------
		String[] titles = new String[] { "最低温度", "最高温度", "平均光照时间" };// 曲线标题
		List<double[]> x = new ArrayList<double[]>();
		for (int i = 0; i < titles.length; i++) {
			x.add(new double[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 });
		}
		List<double[]> values = new ArrayList<double[]>();
		values.add(new double[] { -12.3, -8, -2, 3, 16, 18, 26.4, 26.9, 18.6,
				12.3, -2, -10 });
		values.add(new double[] { 9, 10, 11, 15, 19, 23, 38, 40, 37, 32, 23, 10 });

		values.add(new double[] { 6.3, 7.5, 8.5, 9.8, 10.8, 11.3, 13.5, 14.1, 10.3, 9.5, 9.2, 8 });

		int[] colors = new int[] { Color.GREEN, Color.RED, Color.YELLOW };// 绿色,红色
		PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE,// 圆圈状
				PointStyle.DIAMOND, PointStyle.SQUARE };// 菱形状,矩形状
		// 还有其他类型:X("x"), CIRCLE("circle"), TRIANGLE("triangle"),
		// SQUARE("square"), DIAMOND("diamond"), POINT("point")
		// ----------------------------曲线end---------------------------------

		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();// 设置描绘器
		setRenderer(renderer, colors, styles);
		renderer.setPointSize(5.5f);
		int length = renderer.getSeriesRendererCount();
		for (int i = 0; i < length; i++) {
			XYSeriesRenderer r = (XYSeriesRenderer) renderer
					.getSeriesRendererAt(i);
			Log.i("length", "length = " + length);
			r.setLineWidth(2f);// 宽度
			r.setFillPoints(true);// 完全填充
		}
		setChartSettings(renderer, "气温光照分布图", "月份", "数量(度或小时)", 0.5, 12.5, -20, 40,
				Color.LTGRAY, Color.LTGRAY);// 设置图表的X轴,Y轴,标题

		renderer.setXLabels(12);// X轴均分12项
		renderer.setYLabels(10);// Y轴均分10项
		renderer.setShowGrid(true);// 显示表格
		renderer.setXLabelsAlign(Align.RIGHT);// 右对齐
		renderer.setYLabelsAlign(Align.RIGHT);
		renderer.setZoomButtonsVisible(false);// 不显示放大缩小
		renderer.setPanEnabled(false, false);// 上下左右都不可以移动

		/* -----------------------------光照分布图start------------------------------------
		XYValueSeries sunSeries = new XYValueSeries("光照时间");
		sunSeries.add(1f, 10, 4.3);
		sunSeries.add(2f, 10, 4.9);
		sunSeries.add(3f, 10, 5.9);
		sunSeries.add(4f, 10, 8.8);
		sunSeries.add(5f, 10, 10.8);
		sunSeries.add(6f, 10, 11.9);
		sunSeries.add(7f, 10, 13.6);
		sunSeries.add(8f, 10, 12.8);
		sunSeries.add(9f, 10, 11.4);
		sunSeries.add(10f, 10, 9.5);
		sunSeries.add(11f, 10, 7.5);
		sunSeries.add(12f, 10, 5.5);

		XYSeriesRenderer lightRenderer = new XYSeriesRenderer();
		lightRenderer.setColor(Color.YELLOW);
		-----------------------------光照分布图end------------------------------------*/ 

		XYSeries waterSeries = new XYSeries("平均温度");
		waterSeries.add(1, -3);// 添加数据
		waterSeries.add(2, 6);
		waterSeries.add(3, 10);
		waterSeries.add(4, 17);
		waterSeries.add(5, 20);
		waterSeries.add(6, 26);
		waterSeries.add(7, 29);
		waterSeries.add(8, 30);
		waterSeries.add(9, 23);
		waterSeries.add(10, 19);
		waterSeries.add(11, 10);
		waterSeries.add(12, -1);
		renderer.setBarSpacing(0.5);

		XYSeriesRenderer waterRenderer = new XYSeriesRenderer();
		waterRenderer.setColor(Color.CYAN);// 青色
		waterRenderer.setDisplayChartValues(true);// 显示数值
		waterRenderer.setChartValuesTextSize(10);// 设置数值字体

		XYMultipleSeriesDataset dataset = buildDataset(titles, x, values);
		//dataset.addSeries(0, sunSeries);
		dataset.addSeries(0, waterSeries);
		//renderer.addSeriesRenderer(0, lightRenderer);
		renderer.addSeriesRenderer(0, waterRenderer);

		String[] types = new String[] { BarChart.TYPE, LineChart.TYPE,
				LineChart.TYPE, CubicLineChart.TYPE };// 块状,泡沫,线性、柱形类型
		// 其他的还有RangeStackedBarChart区域图、BubbleChart泡沫状、ScatterChart
		// 散点、TimeChart时间

		GraphicalView mChartView = ChartFactory.getCombinedXYChartView(
				getApplicationContext(), dataset, renderer, types);
		mLinear.addView(mChartView, new LayoutParams(LayoutParams.FILL_PARENT,
				LayoutParams.FILL_PARENT));
	}
}

对应完整项目:http://download.csdn.net/detail/qiu_11/6864045

未完待续…..

AChartEngine应用系列文章

(一)AChartEngine简介

(二)AChartEngine应用之PieChart(饼图)

(三)AChartEngine应用之BarChart(柱形图)

(四)AChartEngine应用之PieChart(动态饼图,允许产生动态数据并显示)

(五)AChartEngine应用之LineChart(模拟生命特征值图)

(六)AChartEngine应用之LineChart(模拟三角函数sin,cos)

(七)AChartEngine高级应用CombinedXYChart(组合统计图)



分享到:
评论

相关推荐

    android Achartengine 统计图

    对于数据的可视化,之前,是想直接用Canvas 来画,不过,评估了一下,工作量挺大的,因为,是一个人开发,而且是从零开始,如果写一个Canvas 画报表的方法,太费时间了,于是,上网找了一下,使用AchartEngine,...

    achartengine 各种统计图demo .rar

    AChartEngine是一个轻量级且功能强大的图表库,专为Android平台设计,提供了丰富的图表类型,如柱状图、折线图等,便于开发者在应用中实现数据展示。本篇文章将深入探讨AChartEngine库的使用,通过实例分析其核心...

    Android柱状曲线等统计图AChartEngine

    在Android应用开发中,数据可视化是一个重要的环节,可以帮助用户更直观地理解复杂的数据。AChartEngine就是这样一款强大的图表库,它专为Android平台设计,允许开发者轻松创建各种类型的统计图表,如柱状图、曲线图...

    Achartengine

    **Achartengine** 是一个专为Android平台设计的开源图形库,它允许开发者轻松地在应用程序中集成各种类型的图表和统计图。这个强大的工具提供了丰富的功能,使得数据可视化变得简单而直观,尤其对于数据分析和报告...

    achartengine

    import org.achartengine.chart.BarChart; import org.achartengine.chart.BarChart.Type; import org.achartengine.chart.BubbleChart; import org.achartengine.chart.CombinedXYChart; import org.achartengine....

    直线统计图和弧线统计图

    总之,直线统计图和弧线统计图是数据可视化中的基本元素,它们在各种应用中都有广泛的应用。Android Studio提供了一系列工具和库,使得在移动平台上创建这些图表变得简单易行。通过深入研究和实践提供的代码,开发者...

    achartengine开发的关于时间的折线图

    总的来说,`ACHartEngine`是一个强大且灵活的工具,可以帮助开发者轻松地在Android应用中实现专业级别的数据可视化。时间轴折线图是一个常见的需求,通过上述方法,我们可以有效地利用`ACHartEngine`满足这种需求。

    Achartengine0.6-Demo

    在Android应用开发中,AChartEngine提供了一种简单且灵活的方式来展示数据,尤其适用于数据分析、可视化报告或者监控应用。 标题"Achartengine0.6-Demo"表明这是一个关于AChartEngine 0.6版本的示例项目,它展示了...

    用Achartengine的平滑曲线和温度柱状图

    Achartengine是一个强大的开源Java库,它允许开发者轻松地在Android平台上创建各种图表,包括折线图、柱状图、饼图等。在这个特定的例子中,我们关注的是如何使用Achartengine来绘制平滑曲线和温度柱状图。 首先,...

    AChartEngine图表库之动态柱状图

    Android图表引擎AChartEngine实现动态柱状图,可以实时传入数据实时刷新图表

    AchartEngine图表库之动态折线图(多条)

    在Android应用开发中,视觉数据展示是至关重要的,AchartEngine是一个开源的图表库,它提供了丰富的图表类型,包括折线图、柱状图、饼图等,方便开发者轻松地在应用程序中展示复杂的数据。本篇文章将深入探讨如何...

    achartengine-1.1.0-demo(android绘图开源库demo)

    在移动开发领域,尤其是在Android平台上,数据可视化是一项至关重要的任务。AChartEngine是一个强大的开源库,专为Android设计,用于绘制各种图表,如柱状图、饼图、折线图等。其简单易用的API和丰富的功能,使得...

    Android学习之AChartEngine折线图

    在Android开发中,数据可视化是十分重要的,AChartEngine是一个流行的开源库,它为开发者提供了在Android应用中绘制各种图表的能力,包括折线图、饼图、柱状图等。这篇博客“Android学习之AChartEngine折线图”将...

    AChartEngine绘图实时曲线 绘制折线图

    本实例是采用AChartEngine进行绘制折线图的一个例子,采用随机数作为采样点,同步参考博客http://blog.csdn.net/danming60520/article/details/14127639

    achartengine 生成柱状图demo

    在Android应用开发中,视觉元素的呈现对于用户体验至关重要,尤其是数据可视化。`achartengine`是一个开源库,专为Android平台设计,用于快速且轻松地创建各种图表,如柱状图、线图、饼图等。这个“achartengine生成...

    AchartEngine 画曲线图,柱形图

    对于那些刚开始接触数据可视化或者需要在Android应用中展示数据的新手开发者来说,AchartEngine是一个理想的选择。本文将深入探讨如何使用AchartEngine来绘制曲线图和柱形图,并分享一些将其应用于实际项目,例如...

    achartengine-1.2.0.jar

    在实际应用中,AChartEngine常用于统计分析、金融图表、健康跟踪器等领域。例如,一个健身应用可以使用AChartEngine展示用户的运动步数趋势图,或者一个股票应用可以展示股价的折线图。 五、进阶功能 除了基础功能...

    使用AChartEngine画动态曲线图

    在Android开发中,有时我们需要展示数据的变化趋势,这时动态曲线图是一种非常有效的视觉表现形式。AChartEngine是一个轻量级的库,专为Android平台设计,用于创建各种图表,包括线形图、饼图、柱状图等。在这个实例...

    Android高级应用源码-折线统计图.zip

    【标题】"Android高级应用源码-折线统计图.zip" 涉及的主要知识点是Android平台上的数据可视化,特别是折线图的实现。折线图是一种常见的图表类型,用于展示数据随时间的变化趋势,常见于各种数据分析和统计应用中。...

Global site tag (gtag.js) - Google Analytics