MPAndroidChart:如何反转HorizontalBarChart的顺序?

8

希望有人能够解释如何颠倒水平条形图中的顺序,这是MPAndroidChart截图中的显示方式(因此44.0将位于底部而不是顶部)。

下面的代码显示了我创建的BarDataSet,用于生成HorizontalBarChart。

ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
for (int i = 0; i < count; i++) {
            float val = (float) (Math.random() * range);
            yVals1.add(new BarEntry(i * spaceForBar, i * 4));
}
BarDataSet set1 = new BarDataSet(yVals1, "DataSet 1");

我尝试反向使用for循环,这样数据集就会以相反的方式添加,但似乎仍然生成了同样的水平条形图。

ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
for (int i = count-1; i >= 0; i--) {
            float val = (float) (Math.random() * range);
            yVals1.add(new BarEntry(i * spaceForBar, i * 4));
}
BarDataSet set1 = new BarDataSet(yVals1, "DataSet 1");

希望有人能向我展示如何反转此图表的顺序。

我已经尝试了下面的代码,这是一个答案建议的。我之前已经找到了他们分享的完全相同的链接。这行代码翻转了图形,使其位于另一侧(请参见第二个屏幕截图)。

mChart.getAxisLeft().setInverted(true);

Screenshot of HorizontalBarChart

Screenshot of HorizontalBarChart with inverted left axis


我发现mpandroidchart有两个奇怪的行为... 1. 您尝试反转Y轴,但显然X轴也改变了;2. 一旦反转,顶部的X轴标签会改变(变为降序),但底部的顺序仍然是正常的(升序)... 我不知道这是否是一个错误,是否应该将其改为降序。 - user0815
1
@user0815 经过一段时间的尝试后,我越来越相信这是一个库的问题,但我还是想发布这个问题,以防我遗漏了什么。如果你想跟进此问题,可以在这里找到:https://github.com/PhilJay/MPAndroidChart/issues/2715 - Mark O'Sullivan
2个回答

4

chart.getAxisLeft().setInverted(true);

这段代码是从GitHub PhilJay/MPAndroidChart中摘取的。

是的。如果需要,您可以倒转 y 轴: chart.getAxisLeft().setInverted(true); 这将让高值显示在图表底部,低值则显示在顶部。 x 轴无法按顺序进行操作。 请注意,此功能未包含在最新的预发布版本中,仅包含在提交记录中。


不起作用。我已经更新了问题,并附上了一个屏幕截图,显示了在包含左轴反转所需的代码时发生的情况。 - Mark O'Sullivan
这很奇怪... 根据文档,这应该可以工作 setInverted(boolean enabled): 如果设置为true,则此轴将被反转,这意味着最高值将位于底部,最低值位于顶部。 - user0815
请注意,在HorizontalBarChart中,“axis left”实际上是顶部轴,“axis right”是底部轴。因此,这不是提问者想要的。提问者想要反转“x轴”。 - Adil Hussain

2

你刚刚错过了将 i * spaceForBar 替换为 (count - i) * spaceForBar

因此,在渲染时,坐标序列变为(假设 count = 10):

(10 * 2, 0 * 4) => (9 * 2, 1 * 4) => (8 * 2, 2 * 4) => ... => (0 * 2, 10 * 4)

因此,您的代码应该是:

ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry> ();
for (int i = 0; i < count; i++) {
    float val = (float) (Math.random () * range);
    yVals1.add (new BarEntry ((count - i) * spaceForBar, i * 4));
}
BarDataSet set1 = new BarDataSet (yVals1, "DataSet 1");

1
这解决了我的问题!谢谢!我没有使用 count - i,而是在 for 循环开始之前创建了一个新的 int 变量 x,并将其设置为 count 的值,然后在每次循环结束时只需使用 x--; 减去 1。 - Mark O'Sullivan
由于某些原因,这个技巧在水平地面条形图上不起作用。为什么呢! - Ofcourse
其实,我不确定这个技巧为什么能够奏效。也许它在最新版本中不起作用,因为这个问题是几年前提出的。 - Ofcourse
我尝试过这个。顺序确实改变了,但是X轴标签也随之改变(可能是因为BarEntry被修改了,这会改变轴标签-->值的映射)。必须对XAxis进行一些更改才能获得正确的标签。xAxis.setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return String.valueOf((int) (count - value)); } }); - Mihir Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接