Are multiple stacked Bar charts possible using Achartengine?

此生再无相见时 提交于 2019-12-01 04:51:41

问题


I tried adding another set of values to the demo example of stacked bar charts with achartengine, but the new values introduced by me don't appear on the chart. Is Stacking bars limited to two bars?

public Intent getIntent(Context context) {

    String[] titles = new String[] { "Good", "Defect", "Repair" };
    List<double[]> values = new ArrayList<double[]>();

    values.add(new double[] { 14230, 12300, 1424, 15240, 15900, 19200,
    22030, 21200, 19500, 15500, 12060, 14000 });
    values.add(new double[] { 14230, 12300, 14240, 15244, 15900, 19200,
            22030, 21200, 19500, 15500, 12600, 14000 });
    values.add(new double[] { 5230, 7300, 9240, 10540, 7900, 9200, 12030,
            11200, 9500, 10500, 11600, 13500 });

    int[] colors = new int[] { Color.GREEN, Color.YELLOW, Color.RED };

    XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);

    setChartSettings(renderer, "Machine Efficiency Rates",
            "Machine", "NET produce", 0.5, 12.5, 0, 24000, Color.GRAY,
            Color.LTGRAY);

    renderer.getSeriesRendererAt(0).setDisplayChartValues(true);
    renderer.getSeriesRendererAt(1).setDisplayChartValues(true);
    renderer.getSeriesRendererAt(2).setDisplayChartValues(true);
    renderer.setXLabels(12);
    renderer.setYLabels(5);
    renderer.setXLabelsAlign(Align.LEFT);
    renderer.setYLabelsAlign(Align.LEFT);
    renderer.setPanEnabled(true, false);
    renderer.setZoomEnabled(true);
    renderer.setZoomRate(1.1f);
    renderer.setBarSpacing(0.5f);
    return ChartFactory.getBarChartIntent(context,
            buildBarDataset(titles, values), renderer, Type.STACKED);

}

回答1:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/11864788/are-multiple-stacked-bar-charts-possible-using-achartengine

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