achartengine显示多个图表

 我们可以使用的所有Series对象关系如下图

barfina

 

从图中,我们可以看出,XYMutilpleSeriesDataset 只能添加XYSeries,对于,线性图而言,我们需要明确输入x,y值,这样问题不是很大,但是,对于条形图,饼图,对于x轴的属性就有点多余了,对于非线性图而言,我们需要的数据仅仅只需要一个值,对于这种情况,我们就需要使用一个新的对象,CategorySeries ,因为,我们绘制的是二维坐标图,所有我们在添加到XYMutilpleSeriesDataset 时需要把CategorySeries 对象转换为二维坐标,

View or Intent?

在昨天的例子中,我直接构造了一个可以用于直接显示的Intent,这样做虽然,方便,但是,可编辑的地方就不多,例如,我需要在一个屏幕上显示多个图表那就无能为力了.对于这种情况,我们需要构造一个View,方法也很简单,这里先对比一下,两种情况的使用范围

  优点 缺点

Intent方式显示图表

简单方便,对于单单显示图表而言是个不错的选择 无法进行自定义操作

自定义View方式显示图表

可以在一个屏幕显示多个图表,可以自定义显示位置 需要进行一定的配置

 

说了这么多来一个例子吧:请认真看注释!!!

/**
 * Copyright (C) 2009, 2010 SC 4ViewSoft SRL
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.njzg.njhgwapplatform.chart;

import java.util.Random;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.BarChart.Type;
import org.achartengine.model.CategorySeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.DefaultRenderer;
import org.achartengine.renderer.SimpleSeriesRenderer;
import org.achartengine.renderer.XYMultipleSeriesRenderer;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.LinearLayout;

import com.njzg.njhgwapplatform.R;

public class MultiChartDemo extends Activity {

 private LinearLayout linearLayout1 = null;
 
 private LinearLayout linearLayout2 = null;

 private static int[] COLORS = new int[] { Color.GREEN, Color.BLUE,
   Color.MAGENTA, Color.CYAN, Color.YELLOW };

 private static final int SERIES_NR = 2;

 /** Called when the activity is first created. */
 @SuppressWarnings("deprecation")
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.multi_chart);
  
  linearLayout1 = (LinearLayout)findViewById(R.id.chart1);
  
  XYMultipleSeriesRenderer renderer = getBarDemoRenderer();
  setChartSettings(renderer);
  GraphicalView view1 = ChartFactory.getBarChartView(this, getBarDemoDataset(),
    renderer, Type.DEFAULT);
  linearLayout1.addView(view1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,  LinearLayout.LayoutParams.WRAP_CONTENT));
  
  
  linearLayout2 = (LinearLayout)findViewById(R.id.chart2);
  
  GraphicalView view2 = ChartFactory.getPieChartView(this, getPieDemoDataset(),
    getPieRender());
  linearLayout2.addView(view2, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
 }

 

 


 private XYMultipleSeriesDataset getBarDemoDataset() {
  XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
  final int nr = 10;
  Random r = new Random();
  for (int i = 0; i < SERIES_NR; i++) {
   CategorySeries series = new CategorySeries("Demo series " + (i + 1));
   for (int k = 0; k < nr; k++) {
    series.add(100 + r.nextInt() % 100);
   }
   dataset.addSeries(series.toXYSeries());
  }
  return dataset;
 }

 private CategorySeries getPieDemoDataset() {
  CategorySeries dataSet = new CategorySeries("");
  Random ran = new Random();
  for (int i = 0; i < 5; i++) {
   dataSet.add("Pie" + dataSet.getItemCount(), ran.nextInt(100));
  }
  return dataSet;
 }

 private DefaultRenderer getPieRender() {
  DefaultRenderer render = new DefaultRenderer();
  Random ran = new Random();
  for (int i = 0; i < 5; i++) {
   SimpleSeriesRenderer renderer = new SimpleSeriesRenderer();
   int rannum = Math.abs(ran.nextInt());
   renderer.setColor(COLORS[(rannum % 5)]);
   render.addSeriesRenderer(renderer);
  }
  return render;
 }

 

 public XYMultipleSeriesRenderer getBarDemoRenderer() {
  XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
  renderer.setAxisTitleTextSize(16);
  renderer.setChartTitleTextSize(20);
  renderer.setLabelsTextSize(15);
  renderer.setLegendTextSize(15);
  renderer.setMargins(new int[] { 20, 30, 15, 0 });
  SimpleSeriesRenderer r = new SimpleSeriesRenderer();
  r.setColor(Color.BLUE);
  renderer.addSeriesRenderer(r);
  r = new SimpleSeriesRenderer();
  r.setColor(Color.GREEN);
  renderer.addSeriesRenderer(r);
  return renderer;
 }

 private void setChartSettings(XYMultipleSeriesRenderer renderer) {
  //renderer.setChartTitle("条形图表统计");
  renderer.setXTitle("x values");
  renderer.setYTitle("y values");
  renderer.setXAxisMin(0.5);
  renderer.setXAxisMax(10.5);
  renderer.setYAxisMin(0);
  renderer.setYAxisMax(210);
 }

 
 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  
 }

}

 

我们还需要在布局文件里面添加:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="wrap_content">

 

 <LinearLayout android:id="@+id/chart1" android:orientation="horizontal"
  android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" />
 
   
 <LinearLayout android:id="@+id/chart2" android:orientation="horizontal"
  android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" />

</LinearLayout>

 

显示效果:

posted on 2013-01-11 11:03  aiyuaichou  阅读(443)  评论(0编辑  收藏  举报

导航