【问题标题】:MPAndroidChart: horizontal bar chart with gapsMPAndroidChart:带间隙的水平条形图
【发布时间】:2020-09-11 07:28:17
【问题描述】:

我在 Android Studio 中使用 MPAndroidChart 和 Kotlin。我设法从示例中构建标准图表,但我需要一些不同的东西。

是否可以构建一个水平条形图,其中条形包含间隙? 与此类似的东西: horizontal bar chart with gaps

我想要实现的是使用条形图在时间线(例如从 0 小时到 24 小时 -> 一整天)上显示特定事件(例如事件 1、事件 2、事件 3 和事件 4)的发生情况。

所以在上图中,粗略估计:事件 1 从 0H > 1H 发生,然后从 6H > 10H 再次发生,其他事件类似。

我可以用 MPAndroidChart 做到这一点吗?

【问题讨论】:

  • 不,这不可能直接。你可以做一个水平堆积条形图,白色和彩色条交替出现。请参阅this answer 了解如何制作堆叠条形图。
  • 好的,我之前找到了那个例子,但不确定我是否遗漏了明显的 .使用折线图,我可以使用多个数据集来完成此操作,但是我无法将线宽增加到 10F 以上,因此线条对于我想要的来说太细了。我将尝试使用堆叠条形图和交替颜色的方法:) 谢谢!

标签: android kotlin bar-chart mpandroidchart


【解决方案1】:

根据我所说的,这是我设法做到的:

val events = listOf(
        Event(0, 0f, 1.5f),
        Event(2, 1.5f, 1.5f),
        Event(1, 3f, 3f),
        Event(3, 6f, 1f),
        Event(0, 7f, 3f),
        Event(1, 10f, 1f),
        Event(2, 11f, 7f),
        Event(3, 18f, 8f))

val categoryColors = listOf(
        Color.parseColor("#ff3f1f"),
        Color.parseColor("#9fff3f"),
        Color.parseColor("#ffff3f"),
        Color.parseColor("#1fbf3f"))

val bgColor = requireContext().obtainStyledAttributes(
        intArrayOf(android.R.attr.windowBackground)).use {
    it.getColor(0, 0)
}

val chart = binding.barChart
val dataSets = mutableListOf<IBarDataSet>()
val vals = events.mapIndexed { i, event ->
    event.duration
}.toFloatArray()
for (i in 0 until 4) {
    val colors = events.mapIndexed { j, event ->
        if (event.category == i) categoryColors[i] else bgColor
    }.toIntArray()
    dataSets += BarDataSet(listOf(BarEntry(i.toFloat(), vals, null)), i.toString()).apply {
        stackLabels = arrayOfNulls(1)
        setColors(*colors)
        isHighlightEnabled = false
        setDrawValues(false)
    }
}
chart.apply {
    data = BarData(dataSets)
    description = null
    axisRight.apply {
        setDrawGridLines(false)
    }
    axisLeft.apply {
        setDrawLabels(false)
        setDrawGridLines(false)
    }
    xAxis.apply {
        setDrawLabels(false)
        setDrawGridLines(false)
    }
    legend.isEnabled = false
}

还有Event 类:

data class Event(val category: Int,
                 val time: Float,
                 val duration: Float)

结果:

【讨论】:

  • 谢谢尼古拉斯!这正是我一直在寻找的,经过一些调整,但我会设法解决这个问题:)
  • 样式肯定有改进的余地:)