2

AchartEngine を使用して棒グラフを作成しました。下の画像のように、2 つの x グリッドの間のスペースに異なる色を設定するのが好きです。また、各軸ラベルの "-" 記号を削除する方法 (4hr- にある "-" を削除する必要があります)。色を設定できない場合は、4 つの y ラベルのみを表示し、最も高い値を一番上に表示します。また、2 つのラベルの間のスペースを自分で修正することも好きです。また、y ラベルに hr またはその他のテキストを追加する必要があります。以下のコードは私が使用するものです。また、値 0 の一部のデバイスでは、細い線が表示されます。値が 0 より大きい場合、バーのみが存在する必要があります。そして、私はこのようになります。質問の最後にあるようなグラフにしたいです。ここに画像の説明を入力

        int largest = y[0];
        for (int i = 1; i < y.length; i++) {
            if (y[i] > largest) {
                largest = y[i];
            }
        }
        CategorySeries series = new CategorySeries("");
        for (int i = 0; i < y.length; i++) {

            series.add("Bar" + (i + 1), y[i]);
        }

        XYMultipleSeriesDataset dataSet = new XYMultipleSeriesDataset();
        dataSet.addSeries(series.toXYSeries()); // number of series

        // customization of the chart

        XYSeriesRenderer renderer = new XYSeriesRenderer(); // one renderer for
                                                            // one series
        renderer.setColor(Color.RED);
        renderer.setDisplayChartValues(false);
        renderer.setChartValuesSpacing((float) 5.5d);
        renderer.setLineWidth((float) 1.5d);

        XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();

        mRenderer.addSeriesRenderer(renderer);
        // mRenderer.setChartTitle("Demo Graph");
        // mRenderer.setXTitle("xValues");

        mRenderer.setYTitle("minutes");

        mRenderer.setLabelsColor(getResources().getColor(R.color.txt_blue));

        mRenderer.setShowGridX(false); // this will show the grid in graph
        mRenderer.setShowGridY(false);
        // mRenderer.setAntialiasing(true);
        mRenderer.setBarSpacing(.5); // adding spacing between the line or
                                        // stacks
        // mRenderer.setApplyBackgroundColor(true);
        // mRenderer.setBackgroundColor(Color.BLACK);
        mRenderer.setXAxisMin(0);
        mRenderer.setYAxisMin(0);
        mRenderer.setXAxisMax(7);
        mRenderer.setZoomInLimitY(10);
        if (largest < 6) {
            mRenderer.setYAxisMax(6);
        } else {
            mRenderer.setYAxisMax(largest);
        }
        mRenderer.setScale(4);

        mRenderer.setXLabels(0);
        mRenderer.addXTextLabel(1, "Sun");
        mRenderer.addXTextLabel(2, "Mon");
        mRenderer.addXTextLabel(3, "Tue");
        mRenderer.addXTextLabel(4, "Wed");
        mRenderer.addXTextLabel(5, "Thu");
        mRenderer.addXTextLabel(6, "Fri");
        mRenderer.addXTextLabel(7, "Sat");
        // mRenderer.setYLabels(0);
        //
        // mRenderer.addYTextLabel(2, "2 min");
        //
        // mRenderer.addYTextLabel(4, "4 min");
        //
        // mRenderer.addYTextLabel(6, "6 min");
        // mRenderer.addYTextLabel(7, "Sat");
        mRenderer.setXLabelsColor(getResources().getColor(R.color.txt_blue));
        mRenderer.setYLabelsColor(0, getResources().getColor(R.color.txt_blue));
        mRenderer.setLabelsColor(getResources().getColor(R.color.txt_blue));
        // mRenderer.setYLabelsAlign(Align.RIGHT);
        mRenderer.setYLabelsPadding(20);
        mRenderer.setPanEnabled(false, false);
        mRenderer.setZoomEnabled(false, false);
        mRenderer.setPanEnabled(false, false); // will fix the chart position
        // Intent intent = ChartFactory.getBarChartIntent(context, dataSet,
        // mRenderer,Type.DEFAULT);
        mRenderer.setBarSpacing(1);
        // mRenderer.setYLabelsPadding(5);
        mRenderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01));
        mRenderer.setShowAxes(false);
        // mRenderer.setXAxisMin(-0.5);
        // 1080 x 1920
        if (screen_width == 480 && screen_height == 800) {

            mRenderer.setAxisTitleTextSize(15);
            mRenderer.setLabelsTextSize(15);
        } else if (screen_width > 480 && screen_width < 1000
                && screen_height > 800 && screen_height < 1700) {
            mRenderer.setAxisTitleTextSize(20);
            mRenderer.setLabelsTextSize(20);
        }

        else if (screen_width > 1000 && screen_height > 1700) {
            mRenderer.setAxisTitleTextSize(30);
            mRenderer.setLabelsTextSize(30);
        } else if (screen_width < 480 && screen_height < 800) {
            mRenderer.setAxisTitleTextSize(10);
            mRenderer.setLabelsTextSize(10);
        }

        mRenderer.setShowLegend(false);

        mChart = (GraphicalView) ChartFactory.getBarChartView(getBaseContext(),
                dataSet, mRenderer, Type.DEFAULT);

        // Adding the Line Chart to the LinearLayout
        chartContainer.addView(mChart);

ここに画像の説明を入力

4

1 に答える 1

3

2つのこと:

  • この種の背景を取得する方法は、x 軸に 1 つの値、y 軸に必要な数の値を持つ積み上げ棒グラフを追加することです。この積み上げ棒グラフを最初にレンダリングし、その上に実際の棒グラフをレンダリングします。逆に、背景色を透明に設定し、チャートの背後に描画可能な背景を設定するのは困難です。私はそれを試みましたが、背景をチャートの値と同期させる方法が見つかりませんでした (基本的に、これをあきらめ、「背景シリーズ」で成功しました)。

  • ダッシュをなくす: 私の考えは、ダッシュを透明な色に設定することでした。しかし、AChartEngine の色は、軸の色ではなく、ラベルの色に依存します。そのため、Renderer の一部を書き直さない限り、このバージョン (現在は 1.1) で値のダッシュを削除することはできません。

編集: 最初のポイントの例。

それ自体の背景を生成するための短いコードを次に示します。

public Intent execute(Context context) {
    // The demo source counts series by number of titles here
    String[] titles = new String[] { "The Background", "", "" };

    // "stacked" values. The highest first. It's printed first.
    List<double[]> values = new ArrayList<double[]>();
    values.add(new double[] { 6d, 6d, 6d, 6d, 6d, 6d, 6d });
    values.add(new double[] { 4d, 4d, 4d, 4d, 4d, 4d, 4d });
    values.add(new double[] { 2d, 2d, 2d, 2d, 2d, 2d, 2d });

    // Background colors. Here blue and white to actually differentiate it
    int[] colors = new int[] { Color.BLUE, Color.WHITE, Color.BLUE};

   // Some settings for the renderer. Change as necessary
    XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
    setChartSettings(
        renderer, "", "", "", 1d, 7d, 0d, 6d,
        Color.TRANSPARENT, Color.TRANSPARENT);
    renderer.setXLabels(0);
    renderer.setYLabels(0);
    renderer.setPanEnabled(false, false);
    renderer.setZoomEnabled(false);
    renderer.setBarSpacing(0d);
    renderer.setShowLegend(false);

    // done. start activity with given intent
    return ChartFactory.getBarChartIntent(
        context, buildBarDataset(titles, values), renderer, Type.STACKED);
}
  • コードをできるだけ短くするために、デモ ソースを使用しました。私が使用する方法はbuildBarRendererbuildBarDatasetおよびsetChartSettingsです。AbstractDemoChartそれらはすべてクラスで見つけることができます。

    • 最小値と最大値は、1 ~ 7 (平日の場合) と 0 ~ 6 の y 値にハードコードされています。また、設定はすべての装飾を遠ざけるだけです。あなたの場合、例で示したように設定します。

    • aChartEngine には積み重ねられたバーの実際の概念がないため、バーを互いの後ろに描画するだけで、最も高い値を持つバーが他のバーの上に表示されるようになります。値リストの最後に新しい値として値を追加する必要があります。シリーズ。

于 2013-11-10T13:43:05.013 に答える