【问题标题】:MPAndroidChart: How to reverse the order of a HorizontalBarChart?MPAndroidChart:如何反转 Horizo​​ntalBarChart 的顺序?
【发布时间】:2017-05-30 00:54:33
【问题描述】:

只是希望这里有人可以解释如何反转 Horizo​​ntalBarChart 的顺序,该顺序显示在MPAndroidChart 的屏幕截图中(所以不是 44.0 位于顶部,而是位于底部)。

下面的代码显示了我如何创建用于生成 Horizo​​ntalBarChart 的 BarDataSet。

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 循环,以便以相反的方式添加数据集,但似乎生成了相同的 Horizo​​ntalBarChart。

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

【问题讨论】:

  • 我看到 mpandroidchart 的两个奇怪行为... 1. 您尝试反转 YAxis 但显然 XAxis 发生了变化 2. 反转后,顶部的 XAxis 标签更改(降序)但在最下面的顺序还是正常的(升序)……不知道是不是bug,也应该改成降序
  • @user0815 尝试了一段时间后,我越来越相信这是图书馆的问题,但我想我会发布这个问题以防我错过了什么。如果你想关注这个问题,可以在这里找到:github.com/PhilJay/MPAndroidChart/issues/2715

标签: android mpandroidchart


【解决方案1】:

chart.getAxisLeft().setInverted(true);

取自GitHub PhilJay/MPAndroidChart

是的。如果您愿意,可以反转 y 轴: chart.getAxisLeft().setInverted(true); 这将使高值出现在图表底部,低值出现在顶部。 x 轴不能按顺序操作。 请注意,此功能不包含在最新的预发布中,仅包含在前面的提交中。

【讨论】:

  • 不起作用。我已经更新了这个问题,截图显示了当您包含反转左轴所需的代码时会发生什么。
  • 这很奇怪...根据docs 这应该可以工作setInverted(boolean enabled): If set to true, this axis will be inverted which means the highest value will be on the bottom, the lowest value on top.
  • 请注意,HorizontalBarChart 中的“左轴”实际上是上轴,同样,“右轴”是下轴。所以这不是提问者想要的。提问者想反转“x轴”。
【解决方案2】:

您只是错过了将i * spaceForBar 替换为(count - i) * spaceForBar

所以渲染时的坐标序列就变成了(假设count = 10):

(10 * 2, 0 * 4) =&gt; (9 * 2, 1 * 4) =&gt; (8 * 2, 2 * 4) =&gt; ... =&gt; (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");

【讨论】:

  • 这解决了我的问题!谢谢!我没有使用count - i,而是在for循环开始之前创建了一个新的int x,并将其设置为count的值,然后在每个循环结束时用x--;减去1。
  • 由于某种原因,此技巧不适用于水平地面条形图。出于某种原因!
  • 实际上,我不确定为什么这个技巧应该有效。也许它在最新版本中不起作用,因为几年前有人问过这个问题。
猜你喜欢
  • 2016-05-08
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多