web-dev-qa-db-ja.com

棒グラフのY軸ラベルを整数に強制しますか?

MPAndroidChartを使用して棒グラフを作成し、データを動的に入力しています。これは、Y軸も動的に決定する必要があることを意味します。私のデータはすべて整数で表されていますが、Y軸に凡例が小数点以下1桁の10進値として表示されることがあります。

ValueFormatterを使用して値を丸めようとしましたが、問題は、Y値が整数値の場所(0.8、1.6、2.4など)にない場合があることです。したがって、これらを整数に編集するだけでは、正しい場所に配置されません。

とにかく、BarChartに整数の場所の値のみを表示するように強制することはできますか?いくつかスキップしても大丈夫です。実際、値が大きくなったときに実行したいと思います。

編集:整数が正しい場所にないと言ったとき、各ラベルが表示するものを変更すると、それらは「正しくない」ことを意味しました。私の例では、値3,4,2,3,2を表示する5つのバーがあります。最初の画像は「デフォルト」で、2番目の画像は次を使用して値フォーマッターを編集した後の画像です。

myBarChart.getYLabels().setFormatter(new ValueFormatter()
{
    @Override
    public String getFormattedValue(float v)
    {
        return ((int) v)+"";
    }
});

enter image description hereenter image description here

これらの画像からわかるように、私の整数値は本来あるべき場所にありません(そして、2つの「2」があります)。この例では、値0、1、2、3、4を表示することを除いて行います。より多くのデータがある場合は、余裕のある値のみを表示するのに十分スマートであると期待しています。たとえば、データに0〜50の値が含まれている場合、0、10、20、30のように表示されます。 、40,50または場合によっては0,15,30,45など。

15
Fozefy

了解しました。問題が発生しました。問題は、YAxis(YLabels)が桁数を決定し、したがって各ラベル間のステップを自動的に決定することです。

残念ながら、軸がそれ自体を計算する方法をカスタマイズしたり、カスタムラベルを設定したりすることは現在不可能です

将来的には、軸ラベルとして描画する値をユーザーが自分で定義できる機能を追加することを検討しています。

ヒント:

すべての軸ラベルを保持するmEntries配列はパブリックです。したがって、一般的には、作成後に変更できます。ただし、手動で変更した場合の軸の動作はまったくわかりません。

しかし、試してみる価値があるかもしれません:-) https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartLib/src/com/github/mikephil/charting/components/YAxis.Java

11
Philipp Jahoda

ものすごく単純。必要なのは2つだけです。

  1. 軸値フォーマッタ

    mChart.getAxisLeft().setValueFormatter(new ValueFormatter() {
        @Override
        public String getFormattedValue(float value) {
            return String.valueOf((int) Math.floor(value));
        }
    });
    
  2. 軸ラベル数

    int max = findMaxYValue(yourdata); // figure out the max value in your dataset
    mChart.getAxisLeft().setLabelCount(max);
    
7
Paweł Rychlik

これが私がこの問題を解決した方法です。 y軸は常に最大値より1上に描画されているようです(強制されていない場合)。したがって、ラベルカウント2を最大値より上に設定し(ゼロと最大値より1を含む)、必要なのは軸フォーマッタで小数を削除することだけです。これは、すべてのy値が整数であり、10進値でどのように機能するかわからない場合に機能します。

    barChart.getAxisLeft().setLabelCount(maxYvalue + 2, true);
    barChart.getAxisLeft().setAxisMinValue(0f);
    barChart.getAxisLeft().setAxisMaxValue(maxYvalue + 1);
    YAxisValueFormatter customYaxisFormatter = new YAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, YAxis yAxis) {
            return String.valueOf((int)value);
        }
    };
    barChart.getAxisLeft().setValueFormatter(customYaxisFormatter);
6
Ryan Johnston

利用可能な解決策がない状態で調べた後、javadocを調べて、このメソッドsetGranularity(float)について調べることにしました。 YAxisに常に整数(または任意の間隔)を表示させるには、次のように呼び出す必要があります。

_yAxisLeft.setGranularity(1.0f);
yAxisLeft.setGranularityEnabled(true); // Required to enable granularity
_

ただし、グラフの最小値と最大値が近すぎると、強制されない限り、グラフはsetLabelCount()を尊重しません(ラベルが再び10進数になります)。したがって、これを呼び出す必要があります。データ設定後:

_private void calculateMinMax(BarLineChartBase chart, int labelCount) {
    float maxValue = chart.getData().getYMax();
    float minValue = chart.getData().getYMin();

    if ((maxValue - minValue) < labelCount) {
        float diff = labelCount - (maxValue - minValue);
        maxValue = maxValue + diff;
        chart.getAxisLeft().setAxisMaximum(maxValue);
        chart.getAxisLeft().setAxisMinimum(minValue);
    }
}
_

以上です!

4
NoImNotNull

回答が非常に遅いことは承知していますが、将来のユーザーが同じことについてもう少し知識を持てるように、この問題にもう少し光を当てようとしています。

私も同じ問題に直面しました。 MyYAxisValueFormatterを使用して、_Y-Axis_の整数値のみを表示しました。以下は同じためのコードです。

_public class MyYAxisValueFormatter implements YAxisValueFormatter {

    private DecimalFormat mFormat;

    public MyYAxisValueFormatter () {
        mFormat = new DecimalFormat("###,###,##0");
    }

    @Override
    public String getFormattedValue(float value, YAxis yAxis) {
        // write your logic here
        // access the YAxis object to get more information
        return mFormat.format(value);
    }
}
_

このクラスを使用すると、Y軸の値が整数形式で表示されるだけでなく、一部の値が重複することになります。これは、float値が整数に変換されるためです。

たとえば、0.4が0に変換されるため、Y軸に2つまたはそれ以上の0の値があるとします。

これが_@Fozefy_の場合に起こっていることだと思います。

この問題とその機能を魅力のように解決するために、以下のコードを実装しました。 setAxisMaxValue関数を使用してY軸のカスタム最大値を設定し、setLabelCountを使用してY軸のラベルエントリの数を設定しました。

_    YAxis yAxis = chart.getAxis(YAxis.AxisDependency.LEFT);

    // Minimum section is 1.0f, could be 0.25f for float values
    float labelInterval = 1.0f / 2f;

    int sections; //No of sections in Y-Axis, Means your Highest Y-value.
    do {
        labelInterval *= 2; //Interval between labels in Y-Axis
        sections = ((int) Math.ceil(chart.getYMax() / labelInterval));
    } while (sections > 10);

    // If the ymax lies on one of the top interval, add another one for some spacing
    if (chart.getYMax() == sections * labelInterval) {
        sections++;
    }

    yAxis.setAxisMaximum(labelInterval * sections);
    yAxis.setLabelCount(sections + 1, true);
_

最大y値が10未満の場合、ラベル間隔は1のままです。それ以外の場合は、2です。要件に応じてこの動作をカスタマイズし、do-whileループを変更してラベル間隔を増やすこともできます。

また、setLabelCount(int count, boolean force)メソッドを使用し、force値をtrueに渡していることを確認してください。

3

私の解決策:

mChart.getAxisLeft().setValueFormatter(new ValueFormatter() {
    @Override
    public String getFormattedValue(float value) {
        return String.valueOf((int) Math.floor(value));
    }
});

int max = (int) mChart.getData().getYMax(); 
mChart.getAxisLeft().setLabelCount(max);
0
Faisal Shaikh

ソリューションに追加するために、誰かが小数値と繰り返し値を削除したいだけの場合は、次のようにすることができます。

IAxisValueFormatter yAxisValueFormatter = new IAxisValueFormatter() {
      @Override
      public String getFormattedValue(float v, AxisBase axisBase) {
//check for decimal value
        if (v - (int) v != 0) {
          return "";
        } else {
          return String.valueOf((int) v);
        }
      }
    }; 
    leftAxis.setValueFormatter(yAxisValueFormatter);
    rightAxis.setValueFormatter(yAxisValueFormatter);
0
DISHA

これが答えを探している人に役立つ簡単な解決策です。

  1. Y軸ラベルカウント

    barChart.getAxisLeft().setLabelCount(7, true); //if you want 6 labels then value should be 7

  2. maxValueを計算します

    • 値からmaxValueを取得するには、グラフに含める必要があります
    int maxValueMod = (maxValue + 2) % 6; //calc mod, here 2 is to display Legend and 6 is no of labels
    maxValue = maxValue + (6-maxValueMod); // calculate final maxValue to set in barchart
    barChart.getAxisLeft().setAxisMaximum(maxValue+2); ```
    
0
satuser