2011-03-23 29 views
12

Quiero dibujar un gráfico de barras que contenga cinco barras individuales - He utilizado Achartengine. Puedo mostrar las cinco barras del mismo color pero quiero diferenciar una barra con un color diferente, pero no puedo mostrar más de un color. Por favor muéstrame cómo mostrar diferentes colores. Mi código ...Gráfico de barras usando achartengine

  values.add(new double[] {21,56,33,10,20});   
     int[] colors = new int[] { Color.rgb(227, 121, 15) }; 
     XYMultipleSeriesRenderer renderer = buildBarRenderer(colors); 
     setChartSettings(renderer, "", "", "", 0,5, 0,100, Color.WHITE, Color.WHITE); 
     renderer.setXLabels(8); 
     renderer.setYLabels(10); 
     renderer.setDisplayChartValues(true); 
     mChartView= ChartFactory.getBarChartView(context, buildBarDataset(titles, values), renderer, 
      Type.DEFAULT); 
     layout.addView(mChartView, 350, 500); 
+0

hizo u obtener una solución para este caso afirmativo [responder a esta pregunta] (http://stackoverflow.com/q/15969486/1752560) es similar – Kiran

+0

@Kiran ¿Utilizaste la siguiente solución? En caso afirmativo, ¿podrían compartir la implementación de las clases mencionadas a continuación? . –

Respuesta

6

Se puede lograr ampliando las clases SimpleSeriesRenderer y BarChart. Aquí está mi solución para RangeBarChart (todo gracias a gilenodm, deseo que tenía cierta reputación a upvote su respuesta):

import org.achartengine.renderer.SimpleSeriesRenderer; 
public class AdvancedSeriesRenderer extends SimpleSeriesRenderer 
{ 
    private int [] colors; 

    public void AdvancedSeriesRenderer() 
    { 
    } 

    public int getColor (int position) 
    { 
     return colors[position]; 
    } 
} 

import org.achartengine.chart.RangeBarChart; 
import org.achartengine.model.XYMultipleSeriesDataset; 
import org.achartengine.renderer.SimpleSeriesRenderer; 
import org.achartengine.renderer.XYMultipleSeriesRenderer; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 

public class AdvancedRangeBarChart extends RangeBarChart 
{ 
    private int [] barChartColors; 

    public AdvancedRangeBarChart (XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, Type type) 
    { 
     super (dataset, renderer, type); 
    } 

    public void setColors (int [] colorsIn) 
    { 
     barChartColors = colorsIn; 
    } 

    @Override 
    public void drawSeries (Canvas canvas, Paint paint, float [] points, SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex) 
    { 
     int seriesNr = mDataset.getSeriesCount(); 
     int length = points.length; 
     paint.setStyle (Style.FILL); 
     float halfDiffX = getHalfDiffX (points, length, seriesNr); 
     int start = 0; 
     if (startIndex > 0) 
     { 
      start = 2; 
     } 
     for (int i = start; i < length; i += 4) 
     { 
      int colorIndex = (int) (i/4) % barChartColors.length; 
      paint.setColor (barChartColors[colorIndex]); 
      if (points.length > i + 3) 
      { 
       float xMin = points[i]; 
       float yMin = points[i + 1]; 
       // xMin = xMax 
       float xMax = points[i + 2]; 
       float yMax = points[i + 3]; 
       drawBar (canvas, xMin, yMin, xMax, yMax, halfDiffX, seriesNr, seriesIndex, paint); 
      } 
     } 
    } 
} 
+0

Puedes compartir con un ejemplo completo. No estoy geeting lo que estás tratando de hacer. –

+0

@Astron ¿Podría compartir el proyecto de muestra? Me he quedado atrapado en mi proyecto después de probar con MPAndroidChart. Ahora estoy intentando con AChartEngine. Será útil si comparte la muestra. Estoy trabajando con Bar Chart. –

+0

@Astron ¿cómo usar esta clase en fragmento o Actividad? –

2

Ha sido un tiempo desde que uso achartengine, pero creo que cada serie tiene que tener su propio color. Como solución alternativa, puede crear la barra que desee para diferenciar un miembro de su propia serie y establecer un color diferente para esa serie. Sin embargo, tal vez alguien más tenga una mejor manera.

+0

¿Puedes mostrarlo con un ejemplo? – AndroidDev

0

usted tiene que utilizar diferentes SimpleSeriesRenderer dentro buildBarRenderer() llamada, y definir tantos serie como el número deseado de colores, de esta manera (la sustitución de las dos primeras líneas de código):

values.add(new double[] {21}); 
values.add(new double[] {56}); 
values.add(new double[] {33}); 
//ETC. 
int[] colors = new int[] { Color.rgb(227, 121, 15), 
          Color.rgb(227, 121, 227), 
          Color.rgb(127, 121, 127) }; 

El resto del código debe ser el mismo que el suyo, pero no lo he probado. AFAIK necesita diferentes series, porque cada serie solo puede tener un color.

5

Hice un truco para lograr este efecto. Org.achartengine.SimpleSeriesRenderer cambió la clase, agregué un int[] colors y un boolean multipleColorsEnabled con sus getters y setters. Así, he cambiado, org.achartengine.BarChart en clase, los drawSeries método, en donde se establecen el color de cada barra en un bucle, como sigue:

int j = startIndex; 
for (int i = 0; i < length; i += 2) { 
    if (seriesRenderer.isMultipleColorsEnabled()) { 
     paint.setColor(seriesRenderer.getColors()[j++]); 
    } else { 
     paint.setColor(seriesRenderer.getColor()); 
    } 
    float x = points[i]; 
    float y = points[i + 1]; 
    drawBar(canvas, x, yAxisValue, x, y, halfDiffX, seriesNr, 
     seriesIndex, paint); 
} 

En la clase que carga los datos utilizados:

seriesRenderer.setMultipleColorsEnabled(true); 
seriesRenderer.setColors(myColors); 
Cuestiones relacionadas