iOS Charts: интервал и положение гистограммы - PullRequest
0 голосов
/ 16 марта 2019

Цель

Я пытаюсь отобразить данные из двух наборов (ACTIVE и REST) ​​на гистограмме.Наборы чередуются (имеется в виду один АКТИВНЫЙ интервал, за которым следует REST-интервал и т. Д.).Скорее, между каждыми двумя наборами ACTIVE всегда есть один набор REST.

Код, который я использовал, приведен ниже для справки.Я, однако, сталкиваюсь с проблемами с позициями стержней и расстоянием между ними.

Проблема: центрирующий стержень со значением x

Первая проблема, стержень не центрирован всоответствующее значение х.В приведенном ниже примере первая оранжевая полоса имеет x = 1.

enter image description here

Она явно начинается со значения 1 на оси x (ее левая сторона соответствуетпримерно до 1), но я хочу, чтобы он был центрирован вокруг значения 1 на оси х

Проблема: интервал между брусками

По какой-то причине пересечение барови расстояние не равно (см. скриншот).Обратите внимание на пробел между полосами 2 и 3 и отсутствие пробела между полосами 1 и 2.

Соответствующий код здесь:

let barWidth = 1.0
let barSpace = 0.10
let groupSpace = 0.1

chartData.groupBars(fromX: 1, groupSpace: groupSpace, barSpace: barSpace)
chartData.barWidth = barWidth

Индексирующие полосы и BarChartDataEntry

Каждый набор (REST и ACTIVE) поступает из разных массивов значений.

Если я нажму на 1-й строке REST, я бы хотела получить соответствующее значение 0. on1-й АКТИВНЫЙ бар, значение 0 тоже.2-ой АКТИВНЫЙ бар, значение 1 ...

Однако в chartValueSelected использование значения entry.x дает положение оси x на оси (НЕ значение x, которое я установил в коде), что является ошибками.

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

Код

//
//  MARK: Chart Setup
//
func setupBarChart() {

    let intervals = self.session!.getIntervals()

    //  Set chart delegate
    intervalBarChartView.delegate = self

    //
    // Create pairs (x, y) of values 
    //
    var values_ACTIVE : [BarChartDataEntry] = []
    var values_REST   : [BarChartDataEntry] = []

    for i in 0...(intervals.count - 1) {

        let newValue_ACTIVE    = intervals[i].duration!.doubleValue
        //            let newIndex_ACTIVE       = Double(2*i+1)
        let newIndex_ACTIVE      = Double(i)

        values_ACTIVE += [BarChartDataEntry(x: newIndex_ACTIVE, y: newValue_ACTIVE)]

        if i < (intervals.count - 1) {

            let newValue_REST      = (intervals[i+1].startTime!.doubleValue) - intervals[i].getEndTime()!
            //                let newIndex_REST         = Double(2*i+2)
            let newIndex_REST         = Double(i)

            values_REST += [BarChartDataEntry(x: newIndex_REST, y: newValue_REST)]

        }

    }

    //  Create data sets
    let dataSet_ACTIVE  = BarChartDataSet(values: values_ACTIVE, label: "ACTIVE")
    let dataSet_REST    = BarChartDataSet(values: values_REST, label: "REST")

    //Set chart data
    let chartData = BarChartData()
    chartData.addDataSet(dataSet_REST)
    chartData.addDataSet(dataSet_ACTIVE)

    self.intervalBarChartView.data = chartData

    //  Bar sizes
    let barWidth = 1.0
    let barSpace = 0.10
    let groupSpace = 0.1

    chartData.groupBars(fromX: 0, groupSpace: groupSpace, barSpace: barSpace)
    chartData.barWidth = barWidth

    //  Bar Colors
    dataSet_ACTIVE.colors = [runOrange]
    dataSet_REST.colors = [RunGreen]
    self.intervalBarChartView.gridBackgroundColor = NSUIColor.white

    //  Enable/Disable show values and position of values
    chartData.setDrawValues(false)
    intervalBarChartView.drawValueAboveBarEnabled = false

    //  Bar Axes: 
    intervalBarChartView.xAxis.axisMinimum = 0.0
    intervalBarChartView.xAxis.axisMaximum = 10
    intervalBarChartView.leftAxis.axisMinimum = 0.0
    intervalBarChartView.rightAxis.enabled = false

    //  Bar Axes: GridLines
    self.intervalBarChartView.xAxis.drawGridLinesEnabled = false
    self.intervalBarChartView.xAxis.drawAxisLineEnabled = false

    self.intervalBarChartView.rightAxis.drawAxisLineEnabled = true
    self.intervalBarChartView.rightAxis.drawGridLinesEnabled = false

    self.intervalBarChartView.leftAxis.drawGridLinesEnabled = false
    self.intervalBarChartView.leftAxis.drawAxisLineEnabled = false

    //  Bar Text
    self.intervalBarChartView.chartDescription?.text = "Barchart Demo"

    //  Control interaction
    self.intervalBarChartView.doubleTapToZoomEnabled = false

}

РЕДАКТИРОВАТЬ

Вот что я получаю с двумя различными компиляциями настроек:

С этими настройками:

    //  Bar sizes
    let barWidth = 0.3
    let barSpace = 0.10
    let groupSpace = 0.1

Разрыв междубары (более или менее) равны:

enter image description here

Однако при следующих значениях:

let groupSpace = 0.3
let barSpace = 0.05
let barWidth = 0.3

я получаю более широкий разрывмежду столбцами 2 и 3 (по сравнению с 1 и 2)

enter image description here

1 Ответ

1 голос
/ 18 марта 2019

Вам нужно изменить расчет barWidth, чтобы вы могли достичь того, чего ожидаете в своем выводе.

Логика GroupBarChart Расчет бара и интервала:

(baSpace + barWidth) * dataSet count + groupSpace = 1.0

Так что в вашем случае вам нужно обновить вышеуказанное значение следующим образом:

let groupSpace = 0.3
let barSpace = 0.05
let barWidth = 0.3
// (0.3 + 0.05) * 2 + 0.3 = 1.00 -> interval per "group"

let startVal = 0

chartData.barWidth = barWidth;
chartData.groupBars(fromX: Double(startVal), groupSpace: groupSpace, barSpace: barSpace)

Сделав это, вы получите правильное положение бара на графике.

Также еще одна опция установлена ​​только BarWidth для ваших графиков, как показано ниже:

let barChartData = BarChartData(dataSet: barChartDataSet)
barChartData.barWidth = 0.4

Надеюсь, это поможет!

...