MPAndroidChart:带间隙的水平条形图
MPAndroidChart: horizontal bar chart with gaps
我在 Android Studio 中使用 MPAndroidChart with Kotlin。我设法根据示例构建了标准图表,但我需要一些不同的东西。
是否可以构建一个条形包含间隙的水平条形图?
类似这样的东西:
horizontal bar chart with gaps
我想要实现的是在时间轴上(例如从 0 小时到 24 小时 -> 一整天)显示特定事件(例如事件 1、事件 2、事件 3 和事件 4)的发生酒吧。
所以在上图中,粗略估计:事件1从0H > 1H发生,然后从6H > 10H再次发生,其他事件类似。
我可以用 MPAndroidChart 做到这一点吗?
以下是我根据我所说的设法做到的:
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
class:
data class Event(val category: Int,
val time: Float,
val duration: Float)
结果:
我在 Android Studio 中使用 MPAndroidChart with Kotlin。我设法根据示例构建了标准图表,但我需要一些不同的东西。
是否可以构建一个条形包含间隙的水平条形图? 类似这样的东西: horizontal bar chart with gaps
我想要实现的是在时间轴上(例如从 0 小时到 24 小时 -> 一整天)显示特定事件(例如事件 1、事件 2、事件 3 和事件 4)的发生酒吧。
所以在上图中,粗略估计:事件1从0H > 1H发生,然后从6H > 10H再次发生,其他事件类似。
我可以用 MPAndroidChart 做到这一点吗?
以下是我根据我所说的设法做到的:
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
class:
data class Event(val category: Int,
val time: Float,
val duration: Float)
结果: