<p>рдЪрд╛рд░реНрдЯ 3.0.1 - рдкреНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде x рд▓реЗрдмрд▓ (рддрд╛рд░реАрдЦреЗрдВ) рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ</p>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдЬрдире░ 2017  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: danielgindi/Charts

рдореБрдЭреЗ рдЪрд╛рд░реНрдЯ рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 2 (рд╕реНрд╡рд┐рдлреНрдЯ 2.3) рд╕реЗ 3 (рд╕реНрд╡рд┐рдлреНрдЯ 3) рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд░рд╣реА рд╣реИред

рдореВрд▓ рд░реВрдк рд╕реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдВрдмрдВрдзрд┐рдд рднреВрдЦрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд x рд▓реЗрдмрд▓ (рддрд┐рдерд┐рдпрд╛рдВ) рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг 2 рдореЗрдВ рдерд╛:
https://i.stack.imgur.com/wOL3t.png

рд╕рдВрд╕реНрдХрд░рдг 2 рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ 7, 8, 10 рдФрд░ 11 рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рди рдереЗред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдмреАрдЪ рдореЗрдВ рдПрдХ рджрд┐рди рдпрд╛рдж рдЖ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд▓реЗрдмрд▓ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рднреВрдЦрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдереЗред

рдФрд░ рдпрд╣рд╛рдБ рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдВрд╕реНрдХрд░рдг 3 рдореЗрдВ рд╣реИ:
https://i.stack.imgur.com/arIL2.png

рд╕рдВрд╕реНрдХрд░рдг 3 рдореЗрдВ, x рдЕрдХреНрд╖ рдореЗрдВ "рд▓реЗрдмрд▓" рдХреЛ рдЕрдм рдбрдмрд▓ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ 1970 рд╕реЗ рдПрдХ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рд╣реИ), рдФрд░ рдПрдХ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЧреНрд░рд╛рдл рдЕрдм рдЕрдзрд┐рдХ "рд╕рд╣реА" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЪрд╛рд░реНрдЯ рд╕рд╣реА рдврдВрдЧ рд╕реЗ 9рд╡реАрдВ рдХреЗ рдорд╛рди рдХреЛ рдПрдХреНрд╕рдЯреНрд░рдкрд▓реЗрд╢рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рднреВрдЦрдВрдбреЛрдВ рдХреЗ рддрд╣рдд рд▓реЗрдмрд▓ рдХреИрд╕реЗ рд▓рдЧрд╛рдП рдЬрд╛рдПрдВред

рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:

```
рдЪрд╛рд░реНрдЯ рд╡реНрдпреВ = рд▓рд╛рдЗрди рдЪрд╛рд░реНрдЯ рд╡реНрдпреВ () рджреЗрдВ
...
рдЪрд▓реЛ xAxis = chartView.xAxis
xAxis.labelPosition = .bottom
xAxis.labelCount = entry.count
xAxis.drawLabelsEnabled = true
xAxis.drawLimitLinesBehindDataEnabled = true
xAxis.avoidFirstLastClippingEnabled = true

// x рдорд╛рди рджрд┐рдирд╛рдВрдХ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ
рдЪрд▓реЛ xValuesNumberFormatter = ChartXAxisFormatter ()
xValuesNumberFormatter.dateFormatter = dayNumberAndShortNameFormatter // рдЬреИрд╕реЗ "рд╡реЗрдб 26"
xAxis.valueFormatter = xValuesNumberFormatter

Here is the ChartXAxisFormatter class I created:

рдЗрдВрдкреЛрд░реНрдЯ рдлрд╛рдЙрдВрдбреЗрд╢рди
рдЖрдпрд╛рдд рдЪрд╛рд░реНрдЯ

рдХреНрд▓рд╛рд╕ рдЪрд╛рд░реНрдЯрдПрдХреНрд╕рдПрдХреНрд╕рд┐рд╕рдлреЙрд░реНрдореЗрдЯрд░: рдПрдирдПрд╕рдУрдмреНрдЬреЗрдХреНрдЯ {
var dateFormatter: DateFormatter?
}

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЪрд╛рд░реНрдЯXAxisFormatter: IAxisValueFormatter {

func stringForValue(_ value: Double, axis: AxisBase?) -> String {
    if let dateFormatter = dateFormatter {

        let date = Date(timeIntervalSince1970: value)
        return dateFormatter.string(from: date)
    }

    return ""
}

}
```
рддреЛ, рдпрд╣рд╛рдВ рдорд╛рди рд╕рд╣реА рд╣реИрдВ, рд╕реНрд╡рд░реВрдкрдг рд╕рд╣реА рд╣реИ, рдЪрд╛рд░реНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдмрдВрдзрд┐рдд рднреВрдЦрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЗрдмрд▓ рдХрд╛ рд╕рдВрд░реЗрдЦрдг рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдПрдХреНрд╕-рдЕрдХреНрд╖ рдкрд░ рдЬреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдПрдХ рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯреЗрдб рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╣реИред рдЗрд╕рдХрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рджрд┐рдирд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдмрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк _рдЖрдкрдХреЗ рд╕реНрдХреЛрд░_ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдирд╣реАрдВ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд▓реЗрдмрд▓ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ x рдорд╛рди [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] рд╣реИрдВред рдПрдХреНрд╕-рдЕрдХреНрд╖ рд░реЗрдВрдбрд░рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХреНрд╕-рдЕрдХреНрд╖ рдкрд░ рд▓реЗрдмрд▓ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд▓реЗрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ 2.5 рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╕-рдорд╛рди рдЖрдкрдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ _not_ рд╣реЛред рдпрджрд┐ рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ dateFormatter рдХреБрдЫ рдордзреНрдпрд╡рд░реНрддреА рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рджрд┐рдирд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджрд┐рди рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд▓реЗрдмрд▓ рдЖрдкрдХреЗ рд╕реНрдХреЛрд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ, рднрд▓реЗ рд╣реА рд▓реЗрдмрд▓ рд╕рд╣реА рд╣реЛ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рджрд┐рди рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЧреЛрд▓ рдХрд░рддреЗ рд╣реИрдВ)ред рдпрджрд┐ рдЖрдк _рджрд┐рди рдШрдВрдЯреЗ:рдорд┐рдирдЯ_ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд▓реЗрдмрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рддрд┐рдерд┐ рд╣реИред

рдореИрдВрдиреЗ рдПрдХреНрд╕-рдЕрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдХрд╕реНрдЯрдо рдПрдХреНрд╕-рдЕрдХреНрд╖ рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рд░рдгреА рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛:

import Foundation
import Charts

class MyCustomBottomAxisFormatter: NSObject, IAxisValueFormatter {
    private var scores: [MyScoreObject]?

    lazy private var dateFormatter: DateFormatter = {
        // set up date formatter using locale
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale.current
        dateFormatter.dateStyle = .short
        dateFormatter.timeStyle = .none
        return dateFormatter
    }()

    convenience init(usingScores scores: [MyScoreObject]) {
        self.init()
        self.scores = scores
    }

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        let index = Int(value)

        guard let scores = scores, index < scores.count, let date = scores[index].date else {
            return "?"
        }

        return dateFormatter.string(from: date)
    }
}

рд╕рднреА 12 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдПрдХреНрд╕-рдЕрдХреНрд╖ рдкрд░ рдЬреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдПрдХ рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯреЗрдб рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╣реИред рдЗрд╕рдХрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рджрд┐рдирд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдмрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк _рдЖрдкрдХреЗ рд╕реНрдХреЛрд░_ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдирд╣реАрдВ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд▓реЗрдмрд▓ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ x рдорд╛рди [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] рд╣реИрдВред рдПрдХреНрд╕-рдЕрдХреНрд╖ рд░реЗрдВрдбрд░рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХреНрд╕-рдЕрдХреНрд╖ рдкрд░ рд▓реЗрдмрд▓ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд▓реЗрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ 2.5 рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╕-рдорд╛рди рдЖрдкрдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ _not_ рд╣реЛред рдпрджрд┐ рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ dateFormatter рдХреБрдЫ рдордзреНрдпрд╡рд░реНрддреА рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рджрд┐рдирд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджрд┐рди рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд▓реЗрдмрд▓ рдЖрдкрдХреЗ рд╕реНрдХреЛрд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ, рднрд▓реЗ рд╣реА рд▓реЗрдмрд▓ рд╕рд╣реА рд╣реЛ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рджрд┐рди рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЧреЛрд▓ рдХрд░рддреЗ рд╣реИрдВ)ред рдпрджрд┐ рдЖрдк _рджрд┐рди рдШрдВрдЯреЗ:рдорд┐рдирдЯ_ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд▓реЗрдмрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рддрд┐рдерд┐ рд╣реИред

рдореИрдВрдиреЗ рдПрдХреНрд╕-рдЕрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдХрд╕реНрдЯрдо рдПрдХреНрд╕-рдЕрдХреНрд╖ рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рд░рдгреА рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛:

import Foundation
import Charts

class MyCustomBottomAxisFormatter: NSObject, IAxisValueFormatter {
    private var scores: [MyScoreObject]?

    lazy private var dateFormatter: DateFormatter = {
        // set up date formatter using locale
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale.current
        dateFormatter.dateStyle = .short
        dateFormatter.timeStyle = .none
        return dateFormatter
    }()

    convenience init(usingScores scores: [MyScoreObject]) {
        self.init()
        self.scores = scores
    }

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        let index = Int(value)

        guard let scores = scores, index < scores.count, let date = scores[index].date else {
            return "?"
        }

        return dateFormatter.string(from: date)
    }
}

рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реВрдд рдмрд╣реВрдд рдзрдиреНрдпрд╡рд╛рдж!
рдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╛рдЦреНрдпрд╛, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдореИрдВ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж!

@ 4np рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ
рдЗрд╕ рддрд░рд╣ :

// Define chart yValues
        var entries = [ChartDataEntry]()
        for (index, score) in scores.enumerated() {
            let yValue = score.value
            let entry = ChartDataEntry(x: Double(index), y: yValue)
            entries.append(entry)
        }

@ 4np рдареАрдХ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛! рдореЗрд░рд╛ рдЪрд╛рд░реНрдЯ рдЕрдм рд╕рдВрд╕реНрдХрд░рдг 2 рдЬреИрд╕рд╛ рд╣реА рд╣реИред

рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рдЕрдкрдиреЗ xAxis рдореЗрдВ 2 рдФрд░ рдЪреАрдЬрд╝реЗрдВ рдЬреЛрдбрд╝рдиреА рдкрдбрд╝реАрдВ:

  // Show the limit lines behind each plot
  xAxis.drawLimitLinesBehindDataEnabled = true

  // Make sure that only 1 x-label per index is shown
  xAxis.granularityEnabled = true
  xAxis.granularity = 1

рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕рд╛рде рд╣реА, рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ StackOverflow рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЦреЛрд▓реА:
http://stackoverflow.com/questions/41720445/ios-charts-3-0-align-x-labels-dates-with-plots

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ SO рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдЕрдкрдирд╛ рдЙрддреНрддрд░ рд╡рд╣рд╛рдВ рдХреЙрдкреА/рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЖрдкрдХрд╛ рдЙрддреНрддрд░ рд╡рд╣рд╛рдВ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдзрдиреНрдпрд╡рд╛рдж
рдлреНрд░реЗрдб

рд╕рд╛рде рд╣реА, рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рддрдм рддрдХ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрдм рддрдХ рдХрд┐ рдЪрд╛рд░реНрдЯ рджреЗрд╡реЛрдВ рдХреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рдореМрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪреБрдирдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рд▓реЗрдмрд▓ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрдм 2 рдЦрд░рд╛рдм рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдирд╛ рд╣реИ:

  • рдпрд╛ рддреЛ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ xValues тАЛтАЛтАЛтАЛрдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВ (рдЬреЛ рд╡рд╣ рднрд╛рд╡рдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдм DataEntry рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП), рд▓реЗрдХрд┐рди рдЧрд▓рдд рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде,
  • рдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ xValues тАЛтАЛтАЛтАЛрдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЬреЛ рдЪрд╛рд░реНрдЯ 2.0 рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЗрд╕ рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рде рдХрд┐ рд▓рдЧрд╛рддрд╛рд░ рд╕реВрдЪрдХрд╛рдВрдХ рдЧреИрд░-рд▓рдЧрд╛рддрд╛рд░ рджрд┐рдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ)ред

рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВред

@ рдлрд╝реНрд░реЗрдбрд░рд┐рдХ-рдЕрдбреНрдбрд╛

рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛
XAxis.granularity = 1.0 рдПрдХ рджрд┐рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
рд╕рдмрд╕реЗ рдЫреЛрдЯреА рддрд╛рд░реАрдЦ 0 . рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

(рдЯрд╛рдЗрдордЗрдирд╕реЗрдХрдВрдб - рдорд┐рдиреАрдбреЗрдЯ) / (3600.0 * 24.0)
capture d ecran 2017-01-30 a 12 35 22

рдФрд░ рд╕рд╛рд░реА рддрд░рдХреАрдм рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдореЗрдВ рд╣реИ
рд╣рдо рддрд╛рд░реАрдЦ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдкрд░реАрдд рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ
рдорд╛рди рд▓реАрдЬрд┐рдП date2 = рджрд┐рдирд╛рдВрдХ (timeIntervalSince1970: (рдорд╛рди * 3600 * 24) + рдорд┐рдиреАрдЯрд╛рдЗрдо)
рд╡рд╛рдкрд╕реА dateFormatter.string (рд╕реЗ: date2)
рдордд рднреВрд▓реЛ
DateFormatter.timeZone = NSTimeZone (рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо: "GMT + 0: 00") рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЗ рд░реВрдк рдореЗрдВ!
рдбреЗрдореЛ macOS рд╣реИ
рд▓рд┐рдВрдХ рд╣реИ https://github.com/thierryH91200/Charts-log
рд▓рд╛рдЗрди рджрд┐рдирд╛рдВрдХ рдЯреИрдм

@thierryH91200 рдзрдиреНрдпрд╡рд╛рдж рдерд┐рдпрд░реА!
рдореИрдВ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рддреБрд░рдВрдд рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

рд╡реЛ рдХрд░ рдЧрдпрд╛ рдХрд╛рдо! рд╢рд╛рдирджрд╛рд░!
рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХреВрд▓ @thierryH91200 , рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд▓рдЧрддрд╛ рд╣реИ

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

@ рдлреНрд░реЗрдбрд░рд┐рдХ-рдЕрдбреНрдбрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ ??
рдПрдХреНрд╕-рдПрдХреНрд╕рд┐рд╕ рдкрд░ рддрд┐рдерд┐рдпрд╛рдВ рджрд┐рдЦрд╛рддреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореИрдВ рдЪрд╛рд░реНрдЯрдбрд╛рдЯрд╛рдПрдВрдЯреНрд░реА рдХреЗ рдПрдХреНрд╕-рд╡реИрд▓реНрдпреВ рдХреЛ рдЯрд╛рдЗрдордЗрдВрдЯрд░рд╡рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдХреЗ рдПрдХреНрд╕-рдПрдХреНрд╕рд┐рд╕ рдкрд░ рддрд┐рдерд┐рдпрд╛рдВ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЪрд╛рд░реНрдЯ рдбреЗрдЯрд╛ рдХреЛ рдареАрдХ рд╕реЗ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдЪрд╛рд░реНрдЯрдбрд╛рдЯрд╛рдПрдВрдЯреНрд░реА рдХреЗ рдПрдХреНрд╕-рд╡реИрд▓реНрдпреВ рдХреЛ рдПрд░реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдЪрд╛рд░реНрдЯрдбрд╛рдЯрд╛рдПрдВрдЯреНрд░реА рдХреЗ рдПрдХреНрд╕-рд╡реИрд▓реНрдпреВ рдХреЛ рдЯрд╛рдЗрдордЗрдВрдЯрд░рд╡рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдХреЗ рд▓рд┐рдП (int i = 0; i < self.temperatureUpdates.count; i++)
{
SFTtemperatureUpdate *temperatureUpdate = [self.temperatureUpdates obje ctAtIndex:i ];
рдбрдмрд▓ yVal = [рддрд╛рдкрдорд╛рдирдЕрдкрдбреЗрдЯ.рд╡реИрд▓реНрдпреВ рдлреНрд▓реЛрдЯрд╡реИрд▓реНрдпреВ];
NSTimeInterval timeInterval = [temperatureUpdate.careatedAt timeIntervalSince1970];
рдбрдмрд▓ xVal = рд╕рдордп рдЕрдВрддрд░рд╛рд▓;
[yVals1 addObject:[[ChartDataEntry alloc] initWithX:xVal y:yVal]];

}

dummydata
Uploading OriginalData.pngтАж

рдПрдХ рдЧреНрд░рд╛рдл рдкрд░ рдПрдХрд╛рдзрд┐рдХ LineChartDataSets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ?

рдЬрдм рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдХрд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред
рдЕрд░реНрдерд╛рдд

let x = LineChartDataSet(values: values1, label: "test 1") // count 5
let y = LineChartDataSet(values: values2, label: "test 2") // count 8
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

cilasgimenez picture cilasgimenez  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kwstasna picture kwstasna  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sjdevlin picture sjdevlin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ahmedsafadii picture ahmedsafadii  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

valeIT picture valeIT  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ