MPAndroidChart: горизонтальная столбчатая диаграмма с накоплением: проблема с левым полем и количеством меток - PullRequest
0 голосов
/ 29 мая 2020

Я создаю горизонтальную столбчатую диаграмму с помощью MPAndroidChart (v3.1.0). Я использую Android Studio, а в моем проекте используются API уровня 17 и Kotlin. Отлично работает, и в настоящее время я получаю следующий результат:

First attempt with horizontal stacked barchart

Значения правильно начинаются с 0 (зеленые полосы) и заканчиваются на 20 для самая большая полоса (красная часть). Теперь я хочу избавиться от левого поля (пространство перед зелеными полосами), и я хочу установить нижние метки на интервал 1.

Это мой код:

class MainActivity : AppCompatActivity() {

private lateinit var chart : HorizontalBarChart

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    chart = findViewById(R.id.chart1)

    setData()
}

private fun setData(){
    val barWidth = 9f

    val values1: ArrayList<BarEntry> = ArrayList()
    values1.add(BarEntry(0F, floatArrayOf(3f, 3f, 2f)))
    values1.add(BarEntry(10F, floatArrayOf(6f, 3f, 2f)))
    values1.add(BarEntry(20F, floatArrayOf(9f, 3f, 2f)))
    values1.add(BarEntry(30F, floatArrayOf(12f, 3f, 2f)))
    values1.add(BarEntry(40F, floatArrayOf(15f, 3f, 2f)))

    val set1: BarDataSet

    if (chart.data != null && chart.data.dataSetCount > 0) {
        set1 = chart.data.getDataSetByIndex(0) as BarDataSet
        set1.values = values1

        chart.data.notifyDataChanged()
        chart.notifyDataSetChanged()
    } else {
        set1 = BarDataSet(values1, "DataSet 1")
        set1.setDrawIcons(false)
        set1.colors = getColors()

        val dataSets: ArrayList<IBarDataSet> = ArrayList()
        dataSets.add(set1)
        val data = BarData(dataSets)
        data.setValueTextSize(10f)
        data.barWidth = barWidth
        chart.data = data
    }

    chart.xAxis.setDrawLabels(false)
    chart.xAxis.setDrawGridLines(false)

    chart.axisLeft.setDrawLabels(false)
    chart.axisLeft.setDrawGridLines(false)

    chart.axisRight.granularity = 1f
    chart.axisRight.isGranularityEnabled = true
    chart.axisRight.setCenterAxisLabels(false)

    chart.description.isEnabled = false
    chart.setFitBars(true)
}

private fun getColors(): List<Int> {
    // have as many colors as stack-values per entry
    val colors = IntArray(3)
    System.arraycopy(ColorTemplate.MATERIAL_COLORS, 0, colors, 0, 3)
    return colors.toMutableList()
} 
}

Я не мог понять, как избавиться от левого поля. Для интервала меток я добавил эту строку:

chart.axisRight.labelCount = 20

И вот результат:

Result after trying to set label interval to 1

Вдруг я не получается 20 меток, как я настроил в коде, но я получаю 25 меток, и мои метки начинаются с -2. Зачем? Когда я пытаюсь установить минимальное значение на 0F, становится еще хуже, и мои полосы больше не выровнены правильно по сравнению с линиями сетки меток.

Также попытался установить setVisibleYRangeMaximum (20F, YAxis.AxisDependency.RIGHT) и setViewPortOffsets (0F, 0F, 0F, 0F), но ни один из них не дает желаемого результата и только ухудшит его.

Как я могу настроить диаграмму так, чтобы она начиналась с нуля, без левого поля и заканчиваются на 20, все метки отображаются с интервалом 1, и все полосы выровнены правильно по сравнению с метками?

...