Диаграмма iOS Горизонтальная столбчатая диаграмма, на которой не отображаются значения столбцов

#swift #charts #ios-charts

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

Вопрос:

Я использую iOS charts (V3.3) для рисования горизонтальной столбчатой диаграммы для статистики производительности игроков в спортивном приложении. Я хочу, чтобы значение столбца отображалось рядом со столбцом в каждом случае. Я могу сделать так, чтобы это произошло при условии, что у проигрывателя есть как отрицательные, так и положительные показатели производительности, но если у проигрывателя есть только положительные показатели производительности, значения не отображаются.

На диаграмме с отрицательными и положительными точками показаны значения столбцов

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

У меня есть BarChartView в своем собственном классе, и я использую этот код

 import Charts

class PlayerPerformanceBarChart: HorizontalBarChartView, IValueFormatter {

override init(frame: CGRect) {
    super.init(frame: frame)
}

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func setChart(pf: [PerformanceStat]) {
    noDataTextColor = Style.labelText
    noDataText = gf.getLiteral("noPerformanceData")
    isUserInteractionEnabled = false
    legend.enabled = false
    leftAxis.enabled = false
    rightAxis.enabled = false
    chartDescription?.text = nil
    drawValueAboveBarEnabled = true

    // Data
    var dataEntries: [BarChartDataEntry] = []
    var labels: [String] = []
    for i in 0..<pf.count {
        dataEntries.append(BarChartDataEntry(x: Double(i), y: Double(pf[i].playerPoints)))
        labels.append(pf[i].playerAction)
    }
    let chartDataSet = BarChartDataSet(entries: dataEntries, label: nil)
    chartDataSet.colors = ChartColorTemplates.joyful()
    chartDataSet.valueFormatter = self
    let chartData = BarChartData(dataSets: [chartDataSet])
    chartData.setDrawValues(true)
    
    // X Axis - which for a Horizontal Bar Chart is actually the vertical (Y) axis - I know, crazy but true!!
    let xaxis = self.xAxis
    xaxis.drawGridLinesEnabled = false
    xaxis.labelPosition = .bottom
    xaxis.labelCount = pf.count
    xaxis.axisMinimum = -1
    xaxis.resetCustomAxisMin()
    xaxis.centerAxisLabelsEnabled = false
    xaxis.granularity = 1
    xaxis.granularityEnabled = true
    xaxis.labelTextColor = Style.chartText
    xaxis.valueFormatter = IndexAxisValueFormatter(values: labels)
    clipValuesToContentEnabled = true

    //Chart Format and Display
    data = chartData
}

func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String {
    return Int(value).description
}

}
  

Функция setChart вызывается содержащим представлением (которое является UIScrollView)

Это всего лишь один набор данных, поэтому группировки нет. Я не могу выяснить, почему значения не отображаются, когда нет отрицательных значений для отображения. Глядя на код Charts, это как-то связано с положением панели, находящейся за пределами обработчика viewport, но я не могу понять, почему это было бы так.

Будем признательны за любую помощь

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

1. leftAxis.axisMinimum = 0

Ответ №1:

Лучше создать отдельный класс, отвечающий за форматирование значений.

 import UIKit
import Charts

class ValueFormatter: NSObject, IAxisValueFormatter {
    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
       /// your code for formatting the values
    }
}

  

И вы должны назначить пользовательский класс в качестве вашего средства форматирования значений:

 xAxis.valueFormatter = ValueFormatter()
  

Помимо этого, пожалуйста, взгляните на этот замечательный учебник о том, как установить пользовательские значения для меток: https://medium.com/@spmandrus/ios-charts-custom-y-axis-values-e03cac8850c

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

1. Спасибо за ваши комментарии. Это решает проблему только для меток осей, и я уже отсортировал их. Чего не хватает, так это значения столбцов, показанного сбоку от каждого столбца в первом примере (6, 3, 5 и т.д.), Но не во втором. Единственное отличие заключается в том, что во втором примере нет отрицательных значений. Если бы я загрузил отрицательные значения во второй пример, значения столбцов появились бы.