【问题标题】:MPAndroidChart Bar Chart with Various Bar Widths具有各种条形宽度的 MPAndroidChart 条形图
【发布时间】:2017-08-31 17:09:09
【问题描述】:

我需要创建一个图表,该图表沿 x 轴有时间,沿 y 轴有一个区域。该程序将记录某个活动在特定时间差内的数据,并在图表中显示数据,有点像这样 -> https://i.stack.imgur.com/s4MiC.png,但每隔一个条形就会交替颜色以对应一个单独的活动。我还没有找到使用 MPAndroidChart 的方法,每个条目似乎都有固定的宽度。如果有人知道如何使用 MPAndroidChart 或其他开源库帮助来实现这一点,我们将不胜感激,谢谢!

编辑:

这是我一直在尝试使用的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_data_report);  

    BarChart barChart = (BarChart) findViewById(R.id.barChart);
    List<BarEntry> entries = generateBarEntries();
    BarDataSet set = new BarDataSet(entries, "BarDataSet");
    BarData data = new BarData(set);
    barChart.setData(data);
}

private List<BarEntry> generateBarEntries() {
    List<BarEntry> entries = new ArrayList<>();
    for (int i = 0; i < timeValues.size(); i++) {
        float x = timeValues.get(i);
        float y = areaValues.get(i);
        entries.add(new BarEntry(x, y));
    }
    return entries;
}

timeValues 是一个 ArrayList,其值以秒为单位,例如 [3, 9, 21, 26, 33],areaValues 也是一个与 timeValues 大小相同的 ArrayList,现在每个值都为 30(即 [30, 30, 30, 30, 30])。

【问题讨论】:

  • 请贴出您目前尝试过的代码。
  • @petryuno1 查看编辑后的帖子

标签: android bar-chart mpandroidchart


【解决方案1】:

好的,所以我想出了如何解决这个问题。我没有创建条形图,而是创建了一个带有水平线的折线图并填充了每条线下方的区域。

LineChart timeChart = (LineChart) findViewById(R.id.timeChart);
List<ILineDataSet> dataSets = generateLineData();
LineData data = new LineData(dataSets);
timeChart.setData(data);
timeChart.invalidate();

private List<ILineDataSet> generateLineData() {
    List<ILineDataSet> dataSets = new ArrayList<>();
    for (int i = 0; i < areaValues.size(); i++) {
        List<Entry> barPoints = new ArrayList<>();
        Entry barPoint1;
        Entry barPoint2;
        LineDataSet dataSet;
        if (areaValues.get(i) >= 0) {
            barPoint1 = new Entry(timeValues.get(i), areaValues.get(i));
            barPoint2 = new Entry(timeValues.get(i+1), areaValues.get(i));
            barPoints.add(barPoint1);
            barPoints.add(barPoint2);
            dataSet = new LineDataSet(barPoints, "");
            dataSet.setColor(getResources().getColor(R.color.green));
            dataSet.setFillDrawable(ContextCompat.getDrawable(this, R.color.green));
        }
        dataSet.setDrawCircles(false);
        dataSet.setDrawFilled(true);
        dataSet.setDrawValues(false);
        dataSets.add(dataSet);
    }
    return dataSets;
}

效果非常好。

【讨论】:

  • 您能告诉我您的 areaValuestimeValues 的示例吗?
  • @RahulSharma areaValues 只是出于我的目的随机生成的数字。并且 timeValues 只需要每次递增,并且 timeValues 应该总是比 areaValues 多一个条目。示例条目可以是:timeValues = [0, 12, 15, 19, 33] areaValues = [20, 9, 12, 16]
【解决方案2】:

没有简单的方法可以实现这一点。您必须在 MPAndroidChart 中挖掘条形图源代码并找到名为 BarBuffer 的类。有一个方法叫做 addBar()。在那里您可以更改条形宽度。在我的例子中,我仍然有 24 个单独的条,但是如果你改变宽度,你可以让它看起来像大块。

protected void addBar(float left, float top, float right, float bottom) {

    buffer[index++] = left;
    buffer[index++] = top;
    buffer[index++] = right;
    buffer[index++] = bottom;
}

【讨论】:

  • 我在找这个,你有例子吗?我不知道如何使用您的解决方案。万事如意
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多