首页 文章

使用achartengine的条形图

提问于
浏览
12

我想绘制一个条形图,其中包含五个单独的条形图 - 我使用过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);

4 回答

  • 0

    可以通过扩展SimpleSeriesRenderer和BarChart类来实现 . 这是我对RangeBarChart的解决方案(所有感谢gilenodm,希望我有一些声誉来支持你的答案):

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

    我做了一个黑客来达到这个效果 . Org.achartengine.SimpleSeriesRenderer 改变了这个类,我添加了 int[] colorsboolean multipleColorsEnabled 及其getter和setter . 所以,我在类中更改了 org.achartengine.BarChart ,方法是drawSeries,其中设置循环中每个条的颜色,如下所示:

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

    在加载所用数据的类中:

    seriesRenderer.setMultipleColorsEnabled(true);
    seriesRenderer.setColors(myColors);
    
  • 2

    我使用achartengine已经有一段时间了,但我认为每个系列都必须有自己的颜色 . 作为一种解决方法,您可以创建要区分其自己的系列成员的栏,并为该系列设置不同的颜色 . 也许其他人有更好的方法 .

  • 5

    你必须使用不同的 SimpleSeriesRenderer 内部buildBarRenderer()调用,并以这种方式定义尽可能多的系列颜色(替换前两行代码):

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

    其余代码应与您的相同,但我没有测试过 . AFAIK you need different series ,因为每个系列只能有一种颜色 .

相关问题