Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 强制条形图Y轴标签为整数?_Android_Bar Chart_Mpandroidchart - Fatal编程技术网

Android 强制条形图Y轴标签为整数?

Android 强制条形图Y轴标签为整数?,android,bar-chart,mpandroidchart,Android,Bar Chart,Mpandroidchart,我使用MPAndroidChart创建了一个条形图,并动态输入数据。这意味着我还需要动态确定Y轴。我的所有数据都表示为整数,但Y轴有时会将图例显示为带1个小数点的十进制值 我尝试使用ValueFormatter对值进行舍入,但问题是有时Y值不在整数值位置(例如0.8、1.6、2.4等)。因此,如果我只是把它们编辑成整数,它们就不会在正确的位置 我是否可以强制条形图仅在整数位置显示值?如果它跳过一些就可以了,事实上,当值变大时,我希望它跳过一些 编辑:当我说整数不在正确的位置时,我的意思是,一旦我

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

我尝试使用ValueFormatter对值进行舍入,但问题是有时Y值不在整数值位置(例如0.8、1.6、2.4等)。因此,如果我只是把它们编辑成整数,它们就不会在正确的位置

我是否可以强制条形图仅在整数位置显示值?如果它跳过一些就可以了,事实上,当值变大时,我希望它跳过一些

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

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


正如我们从这些图像中看到的,我的整数值不是它们应该在的位置(有两个“2”)。在本例中,我希望它显示值0,1,2,3,4。如果我有更多的数据,我希望它足够智能,只显示我可以容纳的值,例如,如果数据包含0-50的值,它将显示0,10,20,30,40,50或可能的0,15,30,45等。好了,现在我看到了你的问题。 问题在于,
YAxis
(YLabels)决定了位数,因此每个标签之间的步数自动地

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

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

只是一个提示:

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

但也许值得一试:-)
非常简单。您只需要两件事:

  • 轴值格式化程序

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

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

  • 我就是这样解决这个问题的。看起来y轴总是在最大值上画1(如果不是强制的话)。因此,在最大值上设置标签计数2(包括0和最大值上的1),然后只需使用轴格式化程序删除小数。如果您的所有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);
    

    我知道我回答得很晚,但我正试图在这个问题上提供更多的信息,以便未来的用户对同样的问题有更多的了解

    我也面临同样的问题。我使用
    MyYAxisValueFormatter
    仅在
    Y轴中显示整数值。下面是相同的代码

    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轴值,但也会复制一些值。这是因为浮点值转换为整数

    例如,假设0.4将转换为0,因此将有两个或多个 Y轴上可能有多个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 否则两个。您可以根据需要自定义此行为 还可以通过修改do while循环来增加标签间隔


    还要确保您正在使用
    setLabelCount(int count,boolean force)
    方法,并将
    force
    值传递给
    true

    在没有可用解决方案的情况下,我决定查看javadoc并了解此方法:
    setGranularity(float)
    。要强制YAxis始终显示整数(或您想要的任何间隔),只需调用以下命令:

    yAxisLeft.setGranularity(1.0f);
    yAxisLeft.setGranularityEnabled(true); // Required to enable granularity
    
    但是,如果图表的最小值和最大值太接近,则图表将不会执行
    setLabelCount()
    ,除非强制执行(这将使标签再次以十进制显示),因此您需要在设置数据后调用此选项:

    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);
        }
    }
    
    private void calculateminax(BarLineChartBase图表,int-labelCount){
    float maxValue=chart.getData().getYMax();
    float minValue=chart.getData().getYMin();
    if((最大值-最小值)
    就这样

    我的解决方案:

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

    下面是一个简单的解决方案,它将使正在寻找答案的人受益

  • Y轴标签计数

    barChart.getAxisLeft().setLabelCount(7,true)//如果需要6个标签,则值应为7

  • 计算
    maxValue

    • 从图表中需要包含的值获取
      maxValue
      from

  • 要添加到解决方案中,如果有人只想删除十进制值和重复值,可以执行以下操作:

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

    我有同样的问题,我得到:

    要仅显示“整数”(在本例中为“10”),请尝试以下操作:

    chart.axisLeft.valueFormatter = object : ValueFormatter() {
        override fun getFormattedValue(value: Float): String {
            return if (value == value.toInt().toFloat()) {
                (floor(value.toDouble()).toInt()).toString()
            } else {
                ""
            }
        }
    }
    
    结果:


    正如我在问题中提到的:“我尝试使用ValueFormatter对值进行四舍五入,但问题是有时Y值不在整数值位置(例如0.8、1.6、2.4等)。因此,如果我只是将它们编辑为整数,它们就不会在正确的位置。”当然不会
    chart.axisLeft.valueFormatter = object : ValueFormatter() {
        override fun getFormattedValue(value: Float): String {
            return if (value == value.toInt().toFloat()) {
                (floor(value.toDouble()).toInt()).toString()
            } else {
                ""
            }
        }
    }