<p>์ฐจํŠธ 3.0.1 - x ๋ ˆ์ด๋ธ”(๋‚ ์งœ)์„ ํ”Œ๋กฏ์— ์ •๋ ฌ</p>

์— ๋งŒ๋“  2017๋…„ 01์›” 18์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: danielgindi/Charts

์ฐจํŠธ๋ฅผ ๋ฒ„์ „ 2(Swift 2.3)์—์„œ 3(Swift 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๋…„ ์ดํ›„์˜ timeInterval์ž„) ํฌ๋งทํ„ฐ๋ฅผ ํ†ตํ•ด ํ˜•์‹์ด ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฐจํŠธ๊ฐ€ 9๋ฒˆ์งธ ๊ฐ’์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์™ธ์‚ฝํ•˜๋ฏ€๋กœ ์ด์ œ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋” "์ •ํ™•"ํ•˜์ง€๋งŒ ํ•ด๋‹น ํ”Œ๋กฏ ์•„๋ž˜์— ๋ ˆ์ด๋ธ”์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ์€ ๋ถ€์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ x ์ถ•์— ๋Œ€ํ•œ ๋‚ด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

```
chartView = LineChartView() ํ•˜์ž
...
xAxis = chartView.xAxis ํ•˜์ž
xAxis.labelPosition = .bottom
xAxis.labelCount = ํ•ญ๋ชฉ ์ˆ˜
xAxis.drawLabelsEnabled = true
xAxis.drawLimitLinesBehindDataEnabled = true
xAxis.avoidFirstLastClippingEnabled = true

// x ๊ฐ’ ๋‚ ์งœ ํฌ๋งทํ„ฐ ์„ค์ •
let xValuesNumberFormatter = ChartXAxisFormatter()
xValuesNumberFormatter.dateFormatter = dayNumberAndShortNameFormatter // ์˜ˆ: "์ˆ˜ 26"
xAxis.valueFormatter = xValuesNumberFormatter

Here is the ChartXAxisFormatter class I created:

์ˆ˜์ž… ์žฌ๋‹จ
์ฐจํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ

ํด๋ž˜์Šค ChartXAxisFormatter: NSObject {
var dateFormatter: DateFormatter?
}

ํ™•์žฅ ChartXAxisFormatter: IAxisValueFormatter {

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

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

    return ""
}

}
```
๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์˜ ๊ฐ’์€ ์ •ํ™•ํ•˜๊ณ  ํ˜•์‹์€ ์ •ํ™•ํ•˜๋ฉฐ ์ฐจํŠธ์˜ ๋ชจ์–‘์€ ์ •ํ™•ํ•˜์ง€๋งŒ ๋ ˆ์ด๋ธ”๊ณผ ํ•ด๋‹น ํ”Œ๋กฏ์˜ ์ •๋ ฌ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด์ „์— ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋ฌธ์ œ์—์„œ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ x์ถ•์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์ด ๋ณด๊ฐ„๋œ ํƒ€์ž„์Šคํƒฌํ”„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ dateFormatter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ _์ ์ˆ˜์— ๋Œ€ํ•œ ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ_ ๋ ˆ์ด๋ธ”์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด x ๊ฐ’ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. x-์ถ• ๋ Œ๋”๋Ÿฌ๋Š” ํŠน์ • x-๊ฐ’์ด ๋ฐ์ดํ„ฐ์„ธํŠธ์—์„œ _not_์ด๋”๋ผ๋„ x-์ถ•์— ๋ ˆ์ด๋ธ”์„ ๊ณ ๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ ˆ์ด๋ธ”๋กœ ์‹ค์ œ๋กœ 2.5๋ฅผ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด dateFormatter๊ฐ€ ์ผ๋ถ€ ์ค‘๊ฐ„ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋‚ ์งœ๋กœ ํ˜•์‹ํ™”ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ˜•์‹์„ ์ง€์ •ํ•˜๋ฉด ๋ ˆ์ด๋ธ”์ด ์ •ํ™•ํ•˜๋”๋ผ๋„(๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ ์งœ๋ฅผ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋ฏ€๋กœ) ๋ ˆ์ด๋ธ”์ด ์ ์ˆ˜์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. _day hour:minute_ ์œผ๋กœ ํ˜•์‹์„ ์ง€์ •ํ•˜๋ฉด ๋ ˆ์ด๋ธ”์ด ์‹ค์ œ๋กœ ๋ณด๊ฐ„๋œ ๋‚ ์งœ

x์ถ•์— ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • X์ถ• ํฌ๋งทํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ตญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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์ถ•์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์ด ๋ณด๊ฐ„๋œ ํƒ€์ž„์Šคํƒฌํ”„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ dateFormatter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ _์ ์ˆ˜์— ๋Œ€ํ•œ ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ_ ๋ ˆ์ด๋ธ”์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด x ๊ฐ’ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. x-์ถ• ๋ Œ๋”๋Ÿฌ๋Š” ํŠน์ • x-๊ฐ’์ด ๋ฐ์ดํ„ฐ์„ธํŠธ์—์„œ _not_์ด๋”๋ผ๋„ x-์ถ•์— ๋ ˆ์ด๋ธ”์„ ๊ณ ๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ ˆ์ด๋ธ”๋กœ ์‹ค์ œ๋กœ 2.5๋ฅผ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด dateFormatter๊ฐ€ ์ผ๋ถ€ ์ค‘๊ฐ„ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋‚ ์งœ๋กœ ํ˜•์‹ํ™”ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ˜•์‹์„ ์ง€์ •ํ•˜๋ฉด ๋ ˆ์ด๋ธ”์ด ์ •ํ™•ํ•˜๋”๋ผ๋„(๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ ์งœ๋ฅผ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋ฏ€๋กœ) ๋ ˆ์ด๋ธ”์ด ์ ์ˆ˜์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. _day hour:minute_ ์œผ๋กœ ํ˜•์‹์„ ์ง€์ •ํ•˜๋ฉด ๋ ˆ์ด๋ธ”์ด ์‹ค์ œ๋กœ ๋ณด๊ฐ„๋œ ๋‚ ์งœ

x์ถ•์— ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • X์ถ• ํฌ๋งทํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ตญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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 ๊ทธ๋Ÿฌ๋ฉด ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ ๋Œ€์‹  xValues๋ฅผ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ChartDataEntry ๋ฐฐ์—ด์„ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?
๊ทธ๋ ‡๊ฒŒ :

// 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 ๊ณ„์ •์ด ์žˆ๊ณ  ๊ฑฐ๊ธฐ์— ๋‹ต์„ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฑฐ๊ธฐ์—์„œ ๊ท€ํ•˜์˜ ๋‹ต๋ณ€์„ ์ˆ˜๋ฝํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”
ํ”„๋ ˆ๋“œ

๋˜ํ•œ Charts ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด ๋ฌธ์ œ๋ฅผ ์—ด์–ด๋‘๊ณ  ๋ ˆ์ด๋ธ”์„ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ 2๊ฐœ์˜ ์ข‹์ง€ ์•Š์€ ์†”๋ฃจ์…˜ ์ค‘์—์„œ ์„ ํƒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ xValues(์ด๋Š” DataEntry๊ฐ€ ์ด์ œ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š” ์ •์‹ )๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ ˆ์ด๋ธ”์ด ์ž˜๋ชป ์ •๋ ฌ๋œ ๊ฒฝ์šฐ
  • ๋˜๋Š” ์ธ๋ฑ์Šค๋ฅผ xValues(์ฐจํŠธ 2.0์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•)๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์—ฐ์†์ ์ธ ์ธ๋ฑ์Šค๊ฐ€ ๋น„์—ฐ์†์ ์ธ ๋‚ ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋‚ด ์˜ˆ์—์„œ์™€ ๊ฐ™์ด).

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

@frederic-adda

๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ๋‹ค
XAxis.granularity = 1.0์€ 1์ผ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค
๊ฐ€์žฅ ์ž‘์€ ๋‚ ์งœ๋Š” 0์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(TimeInSeconds - miniDate) / (3600.0 * 24.0)
capture d ecran 2017-01-30 a 12 35 22

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ํŠธ๋ฆญ์€ ํฌ๋งทํ„ฐ์— ์žˆ์Šต๋‹ˆ๋‹ค
๋‚ ์งœ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋Œ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
date2 = ๋‚ ์งœ(timeIntervalSince1970: (๊ฐ’ * 3600 * 24) + miniTime)๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.
dateFormatter.string ๋ฐ˜ํ™˜(from: date2)
์žŠ์ง€ ๋งˆ์š”
DateFormatter.timeZone = NSTimeZone(์•ฝ์–ด: "GMT + 0:00")์„ TimeZone์œผ๋กœ!
๋ฐ๋ชจ๋Š” macOS์ž…๋‹ˆ๋‹ค.
๋งํฌ๋Š” https://github.com/thierryH91200/Charts-log์ž…๋‹ˆ๋‹ค.
๋ผ์ธ ๋‚ ์งœ ํƒญ

@hierryH91200 ํ‹ฐ์—๋ฆฌ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์„ ์ฆ‰์‹œ ๊ตฌํ˜„ํ•˜๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‹ค! ํ™˜์ƒ์ ์ด์•ผ!
๋‹น์‹ ์˜ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฉ‹์ ธ์š” @thierryH91200 ์ •๋ง ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€์•ผ ํ•  ๊ธธ์ด ๋ณด์ด๋„ค์š” ๐Ÿ‘

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

@frederic-adda ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?
์‹ค์ œ๋กœ X์ถ•์— ๋‚ ์งœ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ChartDataEntry์˜ X ๊ฐ’์„ TimeInterval๋กœ ์„ค์ •ํ•˜์—ฌ X์ถ•์— ๋‚ ์งœ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ฐจํŠธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ChartDataEntry์˜ X ๊ฐ’์„ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ChartDataEntry์˜ X ๊ฐ’์„ TimeInterval๋กœ ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
for (int i = 0; i < self.temperatureUpdates.count; i++)
{
SFTemperatureUpdate * temperatureUpdate = [self.temperatureUpdates ๊ฐœ์ฒด ctAtIndex:i ];
์ด์ค‘ yVal = [์˜จ๋„ ์—…๋ฐ์ดํŠธ ๊ฐ’ floatValue];
NSTimeInterval timeInterval = [temperatureUpdate.careatedAt timeIntervalSince1970];
๋”๋ธ” xVal = timeInterval;
[yVals1 addObject:[[ChartDataEntry ํ• ๋‹น] 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 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

ahmedsafadii picture ahmedsafadii  ยท  3์ฝ”๋ฉ˜ํŠธ

sjdevlin picture sjdevlin  ยท  3์ฝ”๋ฉ˜ํŠธ

valeIT picture valeIT  ยท  3์ฝ”๋ฉ˜ํŠธ

coop44483 picture coop44483  ยท  3์ฝ”๋ฉ˜ํŠธ

Bharati555 picture Bharati555  ยท  4์ฝ”๋ฉ˜ํŠธ