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

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



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


package com.secom.energymanager.UI;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.achartengine.ChartFactory;
import org.achartengine.chart.BarChart;
import org.achartengine.chart.CubicLineChart;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint.Align;

public class ChartC extends AbstractDemoChart {
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getDesc() {
		// TODO Auto-generated method stub
		return null;
	}

	public Intent execute(Context context) {
		// TODO Auto-generated method stub

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

		List<double[]> values = new ArrayList<double[]>();
		values.add(new double[] { 7771.54, 6232.36, 91.8, 429.89 });

		// 取出集合中所有数据中最大值的方法,便于柱形图Y轴高度绘制
		List<Double> getMax = new ArrayList<Double>();
		for (int i = 0; i < values.size(); i++) {
			for (double d : values.get(i)) {
				getMax.add(d);
			}

		}

		// 柱形图Y轴高度,在最大值基础上加2000,不会Y轴满屏
		double ymaxValue = Collections.max(getMax) + 2000;

		int[] colors = new int[] { Color.parseColor("#4386d8"),
				Color.parseColor("#35e007") };
		PointStyle[] styles = new PointStyle[] { PointStyle.POINT,
				PointStyle.POINT };
		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(2);
		setRenderer(renderer, colors, styles);
		int length = renderer.getSeriesRendererCount();
		for (int i = 0; i < length; i++) {
			XYSeriesRenderer r = (XYSeriesRenderer) renderer
					.getSeriesRendererAt(i);
			r.setLineWidth(2.5f);
		}
		setChartSettings(renderer, "分类分项柱状图", "用电项目", "能耗kWh", 0.3, 4.3, 0,
				ymaxValue, Color.LTGRAY, Color.LTGRAY);
		renderer.setXLabels(0);
		renderer.setYLabels(12);
		renderer.setZoomRate(1.05f);
		renderer.setPanEnabled(true, false);// 不允许左右拖动,不允许上下拖动.
		renderer.setBarSpacing(0.5f);// 柱子间宽度
		renderer.addXTextLabel(1, "照明插座用电");
		renderer.addXTextLabel(2, "空调用掉");
		renderer.addXTextLabel(3, "动力用电");
		renderer.addXTextLabel(4, "特殊用电");
		renderer.setShowGrid(true);
		renderer.setZoomButtonsVisible(true);

		renderer.setYTitle("昨日单位面积能耗", 1);
		renderer.setYLabelsPadding(-25);
		renderer.setYAxisAlign(Align.RIGHT, 1);
		renderer.setYLabelsAlign(Align.LEFT, 1);

		XYMultipleSeriesDataset dataset = buildDataset(titles, x, values);
		values.clear();
		values.add(new double[] { 230.52, 157.43, 2.31, 11.31 });
		addXYSeries(dataset, new String[] { " 昨日同期单位面积用电" }, x, values, 1);

		String[] types = new String[] { BarChart.TYPE, CubicLineChart.TYPE };
		Intent intent = ChartFactory.getCombinedXYChartIntent(context, dataset,
				renderer, types, "单位耗能走势 ");
		return intent;

	}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值