12

5 つの個別の棒を含む棒グラフを描画したい - 私は Achartengine を使用しました。5 つのバーをすべて同じ色で表示できますが、1 つのバーを別の色で区別したいのですが、複数の色を表示することはできません。異なる色を表示する方法を教えてください。私のコード...

         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

4 に答える 4

6

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 );
            }
        }
    }
}
于 2012-06-02T05:13:14.383 に答える
5

私はこの効果を達成するためにハックをしました。 Org.achartengine.SimpleSeriesRendererクラスを変更し、ゲッターとセッターでint[] colorsとを追加しました。boolean multipleColorsEnabledそこで、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);
于 2012-05-29T00:36:34.887 に答える
2

チャートエンジンを使うのは久しぶりですが、各シリーズにはそれぞれの色が必要だと思います。回避策として、区別したいバーを独自のシリーズのメンバーにして、そのシリーズに別の色を設定することができます。おそらく他の誰かがより良い方法を持っています。

于 2011-03-23T15:09:01.680 に答える
0

buildBarRenderer()呼び出し内で異なるSimpleSeriesRendererを使用し、必要な色数と同じ数のシリーズを次のように定義する必要があります(最初の2行のコードを置き換えます)。

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

残りのコードはあなたのものと同じであるはずですが、私はそれをテストしていません。すべてのシリーズは1つの色しか持てないため、異なるシリーズが必要です。

于 2012-05-03T13:22:01.120 に答える