强制BarChart Y轴标签是整数?

Foz*_*efy 14 android bar-chart mpandroidchart

我使用MPAndroidChart创建了一个BarChart,我正在动态输入数据.这意味着我还需要动态确定Y轴.我的所有数据都表示为整数,但Y轴有时会将图例显示为带小数点1的十进制值.

我试图使用ValueFormatter来舍入值,但问题是有时Y值不在整数值位置(例如0.8,1.6,2.4等).因此,如果我只是将它们编辑为整数,则它们将不在正确的位置.

无论如何,我是否可以强制BarChart仅在Integer位置显示值?它可以跳过一些,实际上我希望它在值变大时.

编辑:当我说整数不在正确的位置时,我的意思是,一旦我修改了每个标签显示的内容,它们就不是'正确'.在我的例子中,我有5个条显示值3,4,2,3,2.第一个图像是'默认',第二个是我使用以下编辑值格式化程序后的图像:

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

在此输入图像描述 在此输入图像描述

正如我们从这些图像中看到的,我的整数值不是它们应该的位置(并且有两个'2').在这个例子中我除了显示值0,1,2,3,4.如果我有更多的数据,我希望它足够智能,只显示我有空间的值,所以例如,如果数据包含0-50的值,它将显示类似0,10,20,30 ,40,50或可能0,15,30,45等

Phi*_*oda 11

好吧,现在我看到了你的问题.的问题是,YAxis(YLabels)确定的每个标签之间的数字,因此步骤数自动.

不幸的是,目前无法自定义轴的计算方式或设置自定义标签.

我正在考虑将来添加这样一个功能,用户可以自定义哪些值作为轴标签绘制.

只是一个提示:

mEntries包含所有轴标签的数组是公共的.因此,一般情况下,您可以在创建后对其进行修改.但是,如果您手动修改轴,我绝对不确定轴的行为.

但也许值得一试:-) https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartLib/src/com/github/mikephil/charting/components/YAxis.java


NoI*_*ull 10

环顾四周没有可用的解决方案后,我决定查看 javadoc 并发现了这种方法:setGranularity(float). 要强制 YAxis 始终显示整数(或您想要的任何间隔),您只需要调用它:

yAxisLeft.setGranularity(1.0f);
yAxisLeft.setGranularityEnabled(true); // Required to enable granularity
Run Code Online (Sandbox Code Playgroud)

但是,如果图表的最小值和最大值太接近,则图表将不会兑现setLabelCount(),除非强制 when (这将使标签再次变为十进制),因此您需要在设置数据后调用它:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

就是这样!


Paw*_*lik 7

很简单.你需要的只是两件事:

  1. 轴值格式化程序

    mChart.getAxisLeft().setValueFormatter(new ValueFormatter() {
        @Override
        public String getFormattedValue(float value) {
            return String.valueOf((int) Math.floor(value));
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 轴标签计数

    int max = findMaxYValue(yourdata); // figure out the max value in your dataset
    mChart.getAxisLeft().setLabelCount(max);
    
    Run Code Online (Sandbox Code Playgroud)


Rya*_*ton 6

这就是我解决这个问题的方法.似乎y轴总是在最大值上绘制1(如果它不强制它).因此,将标签计数2设置为最大值(包括零和一个超过最大值),然后您需要做的就是使用轴格式化程序删除小数.如果所有y值都是整数,则无法确定它如何与十进制值一起使用.

    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);
Run Code Online (Sandbox Code Playgroud)