#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 и т.д.), Но не во втором. Единственное отличие заключается в том, что во втором примере нет отрицательных значений. Если бы я загрузил отрицательные значения во второй пример, значения столбцов появились бы.