Gráfico de barras usando achartengine
Quiero dibujar un gráfico de barras que contiene cinco barras individuales – He utilizado Achartengine. Soy capaz de mostrar las cinco barras en el 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…
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);
- ¿Cómo puedo diseñar las pestañas de Android para obtener un aspecto 3D?
- Tabla de soporte de diseño de Android Contenido solapado de superposición
- Android: agregar botones a un diseño existente mediante programación
- Divisores entre TabWidgets
- Bibliotecas de gráficos Android
- ¿Cómo puedo crear un diseño con pestañas completamente en XML?
- Gráfico de barras con eje x textual - achartengine
- ¿Cómo puedo obtener un Android TableLayout para llenar la pantalla?
- ¿Por qué Tab host no muestra el icono en android?
- Android - Navegación con pestañas en orientación horizontal
Puede lograrse ampliando las clases SimpleSeriesRenderer y BarChart. Aquí está mi solución para RangeBarChart (todos gracias a gilenodm, ojalá tuviera alguna reputación para 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 ); } } } }
Hice un hack para lograr este efecto. Org.achartengine.SimpleSeriesRenderer
cambió la clase, agregué un int[] colors
y un boolean multipleColorsEnabled
con sus getters y setters. Por lo tanto, he cambiado, org.achartengine.BarChart
en la clase, el método drawSeries, donde se establece el color de cada barra en un bucle, de la siguiente manera:
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);
Ha pasado un tiempo desde que uso el achartengine, pero creo que cada serie tiene que tener su propio color. Como solución, puede crear la barra que desea diferenciar un miembro de su propia serie y establecer un color diferente para esa serie. Tal vez alguien tiene una mejor manera aunque.
Tienes que usar diferentes SimpleSeriesRenderer dentro de la llamada a buildBarRenderer () y definir tantas series como el número deseado de colores, de esta manera (reemplazando tus 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 tuyo, pero no lo he probado. AFAIK necesita diferentes series , ya que cada serie solo puede tener un color.