проблемы с библиотекой диаграмм iOS

#ios #swift #charts #mpandroidchart #ios-charts

#iOS #swift #Диаграммы #mpandroidchart #ios-диаграммы

Вопрос:

Я использую iOSCharts для swift от @danielgindi https://github.com/danielgindi/Charts

Итак, вот мой набор данных

 let dateArray = [26,27,28,29,30,01,02]
        let values = [11.0,5.0,0.0,0.0,4.0,1.0,0.0]

        var dataEntries: [BarChartDataEntry] = []

        for i in 0..<dateArray.count {
            let dataEntry = BarChartDataEntry(x: Double(i), y: values[i])
            dataEntries.append(dataEntry)
        }

        let data = BarChartData()
        let ds1 = BarChartDataSet(values: dataEntries, label: "Hello")
        ds1.colors = [NSUIColor.red]
        data.addDataSet(ds1)




        self.barChartView.data = data

         self.barChartView.fitBars = true

        self.barChartView.gridBackgroundColor = NSUIColor.white

        self.barChartView.chartDescription?.text = ""
  

чего я ожидаю, так это
введите описание изображения здесь

но то, что я получаю, это

введите описание изображения здесь

Итак, как вы можете видеть, проблемы приведены ниже

1) График, начинающийся с одной сетки выше, вы видите пробел внизу 2) метки xaxis разные, я не уверен, как их установить. 3) Я хочу показывать метки осей x и y как int, а не double.

Ответ №1:

Ознакомьтесь с основной версией BarchartViewController проекта ChartsDemo в проекте ChartsDemo, в нем реализованы оба ваших вопроса:

1) Выравнивание по левой оси, см.:

https://github.com/danielgindi/Charts/blob/master/ChartsDemo/Classes/Demos/BarChartViewController.m#L76

В частности, вы хотите установить axisMinimum на левой оси, для вашего примера это будет:

 self.barChartView.leftAxis.axisMinimum = 0.0
  

2) Форматирование значений оси X.

Это немного сложнее. Вы могли бы позаимствовать DayAxisValueFormatter из ChartsDemo, но это код Objective-C, поэтому вам нужно быть знакомым с добавлением Objective-C в ваш проект.

Вы также можете получить именно то, что просили, сделав свой контроллер представления IAxisValueFormatter и реализовав его следующим образом:

 class MyViewController: UIViewController, IAxisValueFormatter {

    var dateArray: [Int] = [26,27,28,29,30,01,02] //member variable

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        return dateArray[i]
    }

    //edit:  forgot to say this earlier, you need to do this somewhere in your bar graph setup code
    self.barChwrtView.xAxis.formatter = self
}
  

Вы должны синхронизировать dateArray и значения при каждом обновлении диаграммы.

Ответ №2:

Ваша вторая проблема, проблема с меткой X, возникает в этой строке:

пусть DataEntry = BarChartDataEntry(x: Double(i), y: значения [i])

x Значение устанавливается просто i равным (как двойное), когда я подозреваю, что вы хотели установить его Double(dateArray[i]) так:

пусть dateArray = [26,27,28,29,30,01,02] пусть значения = [11.0,5.0,0.0,0.0,4.0,1.0,0.0]

 var dataEntries: [BarChartDataEntry] = []

for i in 0..<dateArray.count {
    let dataEntry = BarChartDataEntry(x: Double(dateArray[i]), y: values[i])
    dataEntries.append(dataEntry)
}
  

Этот код можно сократить с помощью zip и map :

 let dataEntries = zip(dateArray, values).map(BarChartDataEntry.init(x:y:))
  

Этот код будет сопоставлять каждую дату dateArray со значением from value . Затем эти пары преобразуются путем передачи в BarChartDataEntry.init(x:y:) инициализатор. Этот метод хорош, потому что он устраняет необходимость dataEntries быть изменяемым.

Комментарии:

1. Привет, спасибо, можете ли вы помочь мне с первой проблемой. Почему ниже есть пробел

2. barChartView.legend.enabled = false

Ответ №3:

попробуйте leftAxis.axisMinValue = 0.0