使用AChartEngine绘制双Y轴的柱形--曲线图

来源:互联网 发布:视频马赛克去除软件 编辑:程序博客网 时间:2024/05/13 18:01

这两天自己琢磨AChartEngine绘制图表有关的内容,确实要比自己去画来得简单的多,性能也要好,而且自带的Demo里面各种图表的使用例子也很详细,要是单纯绘制简单的常用图表足够用了。不过我想要的是一种图表显示双Y轴,然后双柱对比形图和曲线走势图合在一起的效果,查过很多,没找到理想的效果,也尝试去看文档也没发现合适的办法,仅仅看到一个双Y轴单柱形-曲线的范例,也算比较符合,实在不满足就考虑将复杂图表分解开来了。下面分享的这个就是双Y轴单柱形--曲线的效果:



        代码部分采用了给出的Demo的写法,定义一个 AbstractDemoChart抽象类,实现接口IDemoChart接口,这个类中封装了构建DataSet和renderer的方法,目的快速构建我们的dataset和renderer


[java] view plaincopy
  1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.secom.energymanager.UI;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.List;  
  6. import org.achartengine.ChartFactory;  
  7. import org.achartengine.chart.BarChart;  
  8. import org.achartengine.chart.CubicLineChart;  
  9. import org.achartengine.chart.PointStyle;  
  10. import org.achartengine.model.XYMultipleSeriesDataset;  
  11. import org.achartengine.renderer.XYMultipleSeriesRenderer;  
  12. import org.achartengine.renderer.XYSeriesRenderer;  
  13. import android.content.Context;  
  14. import android.content.Intent;  
  15. import android.graphics.Color;  
  16. import android.graphics.Paint.Align;  
  17.   
  18. public class ChartC extends AbstractDemoChart {  
  19.     @Override  
  20.     public String getName() {  
  21.         // TODO Auto-generated method stub  
  22.         return null;  
  23.     }  
  24.   
  25.     @Override  
  26.     public String getDesc() {  
  27.         // TODO Auto-generated method stub  
  28.         return null;  
  29.     }  
  30.   
  31.     public Intent execute(Context context) {  
  32.         // TODO Auto-generated method stub  
  33.   
  34.         String[] titles = new String[] { "今日累计用电" };  
  35.   
  36.         List<double[]> x = new ArrayList<double[]>();  
  37.         for (int i = 0; i < titles.length; i++) {  
  38.             x.add(new double[] { 1234 });  
  39.         }  
  40.   
  41.         List<double[]> values = new ArrayList<double[]>();  
  42.         values.add(new double[] { 7771.546232.3691.8429.89 });  
  43.   
  44.         // 取出集合中所有数据中最大值的方法,便于柱形图Y轴高度绘制  
  45.         List<Double> getMax = new ArrayList<Double>();  
  46.         for (int i = 0; i < values.size(); i++) {  
  47.             for (double d : values.get(i)) {  
  48.                 getMax.add(d);  
  49.             }  
  50.   
  51.         }  
  52.   
  53.         // 柱形图Y轴高度,在最大值基础上加2000,不会Y轴满屏  
  54.         double ymaxValue = Collections.max(getMax) + 2000;  
  55.   
  56.         int[] colors = new int[] { Color.parseColor("#4386d8"),  
  57.                 Color.parseColor("#35e007") };  
  58.         PointStyle[] styles = new PointStyle[] { PointStyle.POINT,  
  59.                 PointStyle.POINT };  
  60.         XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(2);  
  61.         setRenderer(renderer, colors, styles);  
  62.         int length = renderer.getSeriesRendererCount();  
  63.         for (int i = 0; i < length; i++) {  
  64.             XYSeriesRenderer r = (XYSeriesRenderer) renderer  
  65.                     .getSeriesRendererAt(i);  
  66.             r.setLineWidth(2.5f);  
  67.         }  
  68.         setChartSettings(renderer, "分类分项柱状图""用电项目""能耗kWh"0.34.30,  
  69.                 ymaxValue, Color.LTGRAY, Color.LTGRAY);  
  70.         renderer.setXLabels(0);  
  71.         renderer.setYLabels(12);  
  72.         renderer.setZoomRate(1.05f);  
  73.         renderer.setPanEnabled(truefalse);// 不允许左右拖动,不允许上下拖动.  
  74.         renderer.setBarSpacing(0.5f);// 柱子间宽度  
  75.         renderer.addXTextLabel(1"照明插座用电");  
  76.         renderer.addXTextLabel(2"空调用掉");  
  77.         renderer.addXTextLabel(3"动力用电");  
  78.         renderer.addXTextLabel(4"特殊用电");  
  79.         renderer.setShowGrid(true);  
  80.         renderer.setZoomButtonsVisible(true);  
  81.   
  82.         renderer.setYTitle("昨日单位面积能耗"1);  
  83.         renderer.setYLabelsPadding(-25);  
  84.         renderer.setYAxisAlign(Align.RIGHT, 1);  
  85.         renderer.setYLabelsAlign(Align.LEFT, 1);  
  86.   
  87.         XYMultipleSeriesDataset dataset = buildDataset(titles, x, values);  
  88.         values.clear();  
  89.         values.add(new double[] { 230.52157.432.3111.31 });  
  90.         addXYSeries(dataset, new String[] { " 昨日同期单位面积用电" }, x, values, 1);  
  91.   
  92.         String[] types = new String[] { BarChart.TYPE, CubicLineChart.TYPE };  
  93.         Intent intent = ChartFactory.getCombinedXYChartIntent(context, dataset,  
  94.                 renderer, types, "单位耗能走势 ");  
  95.         return intent;  
  96.   
  97.     }  
  98.   
  99. }  
  100. </span>  

        比较郁闷的是,两种图形的X轴并不是十分匹配的,总是对不齐,效果差强人意,但是总体趋势可以看得出来,想进一步去绘制复杂的图表,看来还得多研究才行。

0 0
原创粉丝点击