-9

achartengine を使用して BarChart を作成しようとしていますが、これまでのところ、次の効果を取り除くことができませんでした: バーの幅は、値が画面の端にある場合にのみ正しく表示されますが、起動時にバーが表示されます。はるかに大きく、バーの値を隠すことさえあります。これは、データ セットが x 値の連続したシリーズではないことに関係している可能性がありますか? x=17 に 1 つのポイントがあり、次の値は x=24 にあり、これら 2 つの値の間でバーの幅が変化しているようです。このグラフの見栄えを良くするのを手伝ってくれる人はいますか?

よろしくお願いいたします。

[フラグメントの開始時に表示されるグラフ] フラグメントの開始時に表示されるグラフ

【左スクロール時のグラフ表示】 左にスクロールしたときに表示されるグラフ

グラフを作成するコード:

    XYSeries xySerie = new XYSeries("Climb Level Statistics");
    XYSeriesRenderer serieRenderer;
    XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();
    XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();

    //Adding data to XYSerie and adding XYSerie to mDataset
    //stats is an int[] containing level id, value for the level, level id, ...
    //example of dataset used for image shown above: {17, 4, 24, 3, 25, 7, 26, 10, 27, 4}
    int statsSize = stats.size();
    double routeLevel;
    double climbsQuantity;
    for (int counter = 0; counter<statsSize; counter++){
        routeLevel = stats.get(counter);
        counter++;
        climbsQuantity = stats.get(counter);
        xySerie.add(routeLevel, climbsQuantity);
    }
    mDataset.addSeries(xySerie);

    //Setting series renderer properties and adding it to the mRenderer
    serieRenderer = new XYSeriesRenderer();
    serieRenderer.setChartValuesTextSize(28);
    serieRenderer.setDisplayChartValues(true);
    mRenderer.addSeriesRenderer(serieRenderer);

    //Setting main renderer properties
    mRenderer.setApplyBackgroundColor(true);
    mRenderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01));
    mRenderer.setBackgroundColor(Color.TRANSPARENT);
    mRenderer.setLabelsTextSize(15);
    mRenderer.setMargins(new int[] { 30, 30, 30, 30 });
    mRenderer.setZoomButtonsVisible(false);
    mRenderer.setPanLimits(new double[]{0,48, 0, 5000});
    mRenderer.setBarSpacing(1.5);
    mRenderer.setLabelsTextSize(28);
    mRenderer.setLabelsColor(Color.BLACK);
    mRenderer.setXLabels(0);
    mRenderer.setXLabelsColor(Color.BLACK);
    String[] routeLevels = context.getResources().getStringArray(R.array.route_levels);
    int routeLevelsSize = routeLevels.length;
    for (int x=1;x<routeLevelsSize+1;x++){
        mRenderer.addXTextLabel(x, routeLevels[x-1]);
    }
    mRenderer.setYLabels(0);
    mRenderer.setYAxisMin(0);
    mRenderer.setShowLegend(false);
    mRenderer.setZoomEnabled(false);
    mRenderer.setZoomEnabled(false, false);
    mRenderer.setPanEnabled(true, false);


    GraphicalView graphView = ChartFactory.getBarChartView(context, mDataset, mRenderer, BarChart.Type.STACKED);
    graphView.setBackgroundColor(Color.argb(255, 247, 247, 247));
4

2 に答える 2

3

セリエが x 値の「完璧な」スイートであることを確認することで、バーの幅の変化の問題を解決できました。

これ: {17, 4, 24, 3, 25, 7, 26, 10, 27, 4}

これに: {17, 4, 18, 0, 19, 0, 20, 0, 21, 0, 22, 0, 23, 0, 24, 3, 25, 7, 26, 10, 27, 4}

それを達成するために、最初の for ループを変更して、欠落している x 値をチェックしました。

for (int x = 0; x<statsSize; x++){
        routeLevel = currentLevel;
        x++;
        currentLevel++;
        climbsQuantity = stats.get(x);
        xySerie.add(routeLevel, climbsQuantity);

        //if not at the last x/y couple of the array, fill the blanks in the serie
        if (x<statsSize-1){ 
            while (stats.get(x+1)>currentLevel){
                routeLevel = currentLevel;
                climbsQuantity = 0;
                xySerie.add(routeLevel, climbsQuantity);
                currentLevel++;
            }
        }
}

スクロールしてもバーの幅がまったく変わらなくなりました。ただし、これは回避策ですが、追加した「塗りつぶし」のカップルはすべて値として 0 を示しているため、少し奇妙に感じます。これらの 0 値を非表示にする方法を見つけたら、回答を編集します...

グラフの現在の外観 ここに画像の説明を入力

于 2013-06-20T10:11:47.800 に答える