Android 强制条形图Y轴标签为整数?
我使用MPAndroidChart创建了一个条形图,并动态输入数据。这意味着我还需要动态确定Y轴。我的所有数据都表示为整数,但Y轴有时会将图例显示为带1个小数点的十进制值 我尝试使用ValueFormatter对值进行舍入,但问题是有时Y值不在整数值位置(例如0.8、1.6、2.4等)。因此,如果我只是把它们编辑成整数,它们就不会在正确的位置 我是否可以强制条形图仅在整数位置显示值?如果它跳过一些就可以了,事实上,当值变大时,我希望它跳过一些 编辑:当我说整数不在正确的位置时,我的意思是,一旦我修改每个标签显示的内容,它们就不“正确”。在我的示例中,我有5个条形图显示值3,4,2,3,2。第一个图像是“默认”,第二个图像是我使用以下方法编辑值格式化程序后的图像:Android 强制条形图Y轴标签为整数?,android,bar-chart,mpandroidchart,Android,Bar Chart,Mpandroidchart,我使用MPAndroidChart创建了一个条形图,并动态输入数据。这意味着我还需要动态确定Y轴。我的所有数据都表示为整数,但Y轴有时会将图例显示为带1个小数点的十进制值 我尝试使用ValueFormatter对值进行舍入,但问题是有时Y值不在整数值位置(例如0.8、1.6、2.4等)。因此,如果我只是把它们编辑成整数,它们就不会在正确的位置 我是否可以强制条形图仅在整数位置显示值?如果它跳过一些就可以了,事实上,当值变大时,我希望它跳过一些 编辑:当我说整数不在正确的位置时,我的意思是,一旦我
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 {
""
}
}
}