Are multiple stacked Bar charts possible using Achartengine?

核能气质少年 提交于 2019-12-01 06:29:26

There is a misunderstanding in the way AChartEngine displays stacked bar charts. It doesn't really stack them, but displays them one over the other. This means that you will want to always add the bigger values first then the smaller and so on as it renders the first series, the second one above the first and so on.

UPDATE: As of version 1.2.0, there is the new HEAP stacked bar charts, which are displayed in the manner you need.

I could not find a good answer. However, you can use the getCombinedXYChartIntent to create a multiple stacked bars.

I use the CombinedTemperatureChart as a template and modified to achieve this.

The initial raw code is this

package org.achartengine.chartdemo.demo.chart;

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

import org.achartengine.ChartFactory;
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.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint.Align;

/**
 * Combined temperature demo chart.
 */
public class CombinedTemperatureChart extends AbstractDemoChart {
  /**
   * Returns the chart name.
   * 
   * @return the chart name
   */
  public String getName() {
    return "Combined temperature";
  }

  /**
   * Returns the chart description.
   * 
   * @return the chart description
   */
  public String getDesc() {
    return "The average temperature in 2 Greek islands, water temperature and sun shine hours (combined chart)";
  }

  /**
   * Executes the chart demo.
   * 
   * @param context the context
   * @return the built intent
   */
  public Intent execute(Context context) {
    String[] titles = new String[] { "Crete Air Temperature", "Skiathos Air Temperature" };
    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, 12.5, 13.8, 16.8, 20.4, 24.4, 26.4, 26.1, 23.6, 20.3, 17.2, 13.9 });
    values.add(new double[] { 9, 10, 11, 15, 19, 23, 26, 25, 22, 18, 13, 10 });
    int[] colors = new int[] { Color.GREEN, Color.rgb(200, 150, 0) };
    PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE, PointStyle.DIAMOND };
    XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
    //renderer.setPointSize(5.5f);
    int length = renderer.getSeriesRendererCount();
    for (int i = 0; i < length; i++) {
      XYSeriesRenderer r = (XYSeriesRenderer) renderer.getSeriesRendererAt(i);
      r.setDisplayChartValues(true);
      r.setChartValuesTextSize(25);
      //r.setLineWidth(2);
      r.setFillPoints(true);
    }
    setChartSettings(renderer, "Weather data", "Month", "Temperature", -1, 12.5, 0, 40,
        Color.LTGRAY, Color.LTGRAY);

    renderer.setXLabels(12);
    renderer.setYLabels(10);
    renderer.setShowGrid(true);
    renderer.setXLabelsAlign(Align.RIGHT);
    renderer.setYLabelsAlign(Align.RIGHT);
    renderer.setZoomButtonsVisible(true);
    renderer.setPanLimits(new double[] { -10, 20, -10, 40 });
    renderer.setZoomLimits(new double[] { -10, 20, -10, 40 });


    XYValueSeries sunSeries = new XYValueSeries("Sunshine hours");
    sunSeries.add(0.5, 17);
    sunSeries.add(1.5, 18);
    sunSeries.add(2.5, 19);
    sunSeries.add(3.5, 19);
    sunSeries.add(4.5, 20.8);
    sunSeries.add(5.5, 24.9);
    sunSeries.add(6.5, 26);
    sunSeries.add(7.5, 27.8);
    sunSeries.add(8.5, 28.4);
    sunSeries.add(9.5, 25.5);
    sunSeries.add(10.5, 23.5);
    sunSeries.add(11.5, 19.5);

    XYSeriesRenderer lightRenderer = new XYSeriesRenderer();
    lightRenderer.setColor(Color.YELLOW);

    XYSeries waterSeries = new XYSeries("Water Temperature");
    waterSeries.add(0.5, 16);
    waterSeries.add(1.5, 15);
    waterSeries.add(2.5, 16);
    waterSeries.add(3.5, 17);
    waterSeries.add(4.5, 20);
    waterSeries.add(5.5, 23);
    waterSeries.add(6.5, 25);
    waterSeries.add(7.5, 25.5);
    waterSeries.add(8.5, 26.5);
    waterSeries.add(9.5, 24);
    waterSeries.add(10.5, 22);
    waterSeries.add(11.5, 18);

    renderer.setBarSpacing(2);
    renderer.setBarWidth(2);
    XYSeriesRenderer waterRenderer = new XYSeriesRenderer();
    waterRenderer.setColor(Color.argb(250, 0, 210, 250));

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

    waterRenderer.setDisplayChartValues(true);
    waterRenderer.setChartValuesTextSize(25);

    lightRenderer.setDisplayChartValues(true);
    lightRenderer.setChartValuesTextSize(25);

    String[] types = new String[] {  BarChart.TYPE, BarChart.TYPE, BarChart.TYPE, BarChart.TYPE };
    Intent intent = ChartFactory.getCombinedXYChartIntent(context, dataset, renderer, types,
        "Weather parameters");
    return intent;
  }

}

I hope someone still need this, it take a some time figure it out. Unfortunately, I don't have the points to paste an image.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!