Установить метки в RadarChartData - PullRequest
1 голос
/ 10 марта 2019

Я использую фреймворк Charts v3.2.2 от danielgindi для iOS и macOS, чтобы нарисовать RadarChartView.Существует репозиторий github , который предоставляет пример проекта xcode, включая Playgrounds.Один для RadarChartView.

. Следуя примеру, я могу установить RadarChartData с двумя разными RadarChartDataSet с

var chartView = RadarChartView(frame: rect)
let data = RadarChartData(dataSets: [set1, set2])
chartView.data = data

. Он показывает диаграмму, подобную этой:

enter image description here

Зеленые метки, установленные на оси х, представляют собой числа от 0,0 до 4,0, но они должны быть строковыми метками.

Я не могу понять, как установить эти метки, которые должны быть нарисованы вокруг RadarChart в конце каждой веб-строки.Я думаю, это должно быть примерно так:

data.setLabels("London", "Paris", "Berlin", "New York", "Tokio")

Но это не работает, хотя это функция класса RadarChartData для установки нужных меток.

Может кто-нибудь помочь мне с этой проблемой?

РЕДАКТИРОВАТЬ: полный пример кода

import Cocoa
import Charts
import PlaygroundSupport

let r = CGRect(x: 0, y: 0, width: 400, height: 400)
var chartView = RadarChartView(frame: r)
// General settings
chartView.webColor = NSUIColor.lightGray
chartView.innerWebColor = NSUIColor.lightGray
chartView.webAlpha = 1.0
// xAxis settings
let xAxis = chartView.xAxis
xAxis.xOffset = 0.0
xAxis.yOffset = 0.0
xAxis.labelTextColor = NSUIColor.green
xAxis.drawLabelsEnabled = true

// yAxis settings
let yAxis = chartView.yAxis
yAxis.labelCount = 5
yAxis.axisMinimum = 0.0
yAxis.axisMaximum = 80.0
yAxis.drawLabelsEnabled = true
// Legend settings
let legend = chartView.legend
// ... (irrelevant)

// Description
chartView.chartDescription?.enabled = true
chartView.chartDescription?.text = "Radar demo"
chartView.chartDescription?.textColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)

// RadarChartDataEntry
let mult = 80.0
let min = 20.0
let cnt = 5

var entries1 = [RadarChartDataEntry]()
var entries2 = [RadarChartDataEntry]()

for i in 1...cnt
{
  let values1 = (Double(arc4random_uniform(UInt32(mult))) + min)
  entries1.append(RadarChartDataEntry(value: values1, data: "a" as AnyObject))
  let values2 = (Double(arc4random_uniform(UInt32(mult))) + min)
  entries2.append(RadarChartDataEntry(value: values2, data: "b" as AnyObject))
}

// RadarChartDataSet
let set1 = RadarChartDataSet(entries: entries1, label: "Last Week")
set1.drawFilledEnabled = true
set1.fillAlpha = 0.7
set1.lineWidth = 2.0
set1.drawHighlightCircleEnabled = true
set1.setDrawHighlightIndicators(false)

let set2 = RadarChartDataSet(entries: entries2, label: "This Week")
set2.drawFilledEnabled = true
set2.fillAlpha = 0.7
set2.lineWidth = 2.0
set2.drawHighlightCircleEnabled = true
set2.setDrawHighlightIndicators(false)

// RadarChartData
let data = RadarChartData(dataSets: [set1, set2])
data.setLabels("London", "Paris", "Berlin", "New York", "Tokio")
data.setDrawValues ( true )
data.setValueTextColor(  NSUIColor.white )
chartView.data = data
chartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInBounce)

// show chartView
PlaygroundPage.current.liveView = chartView

1 Ответ

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

Вам необходимо переопределить функцию IAxisValueFormatter func stringForValue(_ value: Double, axis: AxisBase?) -> String {}.

Как показано ниже:

Шаг 1: настройте xAxis с помощью пользовательского форматера.

let xValues = ["X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10"]
let chartFormatter = RadarChartFormatter(labels: xValues)
let xAxis = XAxis()
xAxis.valueFormatter = chartFormatter
self.xAxis.valueFormatter = xAxis.valueFormatter

Шаг 2: Реализация пользовательского форматера с помощью метода ниже.

private class RadarChartFormatter: NSObject, IAxisValueFormatter {

    var labels: [String] = []

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        if Int(value) < labels.count {
            return labels[Int(value)]
        }else{
            return String("")
        }
    }

    init(labels: [String]) {
        super.init()
        self.labels = labels
    }
}

В вашем RadarCharView вы получите вывод ниже:

enter image description here

Надеюсь, это поможет вам получить ваши собственные метки на карте радара!

...