1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SwiftUI】折れ線グラフのデータ補完を設定する

Posted at

はじめに

折れ線グラフのデータ補完と言われてもわかりにくいと思うので、軽く説明します。

折れ線グラフって値のある箇所を線で繋いでいるので、実際には線のある箇所にはデータがない状態です。

スクリーンショット 2024-01-15 21.23.29.png

その補完をどのように表示するのかを設定することができます。

サンプルアプリ

Simulator Screen Recording - iPhone 15 - 2024-01-15 at 21.20.42.gif

サンプルアプリの全体実装

import SwiftUI
import Charts

struct Temperature {
    let day: Int
    let max: Double
    let min: Double
}

enum Interpolation: String, CaseIterable, Identifiable {
    case cardinal
    case linear
    case monotone
    case stepCenter
    case stepStart
    case stepEnd
    case catmullRom
    
    var id: String { rawValue }
    
    var method: InterpolationMethod {
        switch self {
        case .cardinal:
            InterpolationMethod.cardinal
        case .linear:
            InterpolationMethod.linear
        case .monotone:
            InterpolationMethod.monotone
        case .stepCenter:
            InterpolationMethod.stepCenter
        case .stepStart:
            InterpolationMethod.stepStart
        case .stepEnd:
            InterpolationMethod.stepEnd
        case .catmullRom:
            InterpolationMethod.catmullRom
        }
    }
}

struct ContentView: View {
    @State private var temperatures: [Temperature] = [
        .init(day: 1, max: 23, min: 13),
        .init(day: 2, max: 25, min: 10),
        .init(day: 3, max: 23, min: 11),
        .init(day: 4, max: 21, min: 11),
        .init(day: 5, max: 18, min: 12),
        .init(day: 6, max: 19, min: 13),
        .init(day: 7, max: 18, min: 15),
        .init(day: 8, max: 22, min: 9),
        .init(day: 9, max: 23, min: 10),
        .init(day: 10, max: 24, min: 13),
    ]
    
    @State var selectedInterpolation: Interpolation = .cardinal
    
    var body: some View {
        VStack {
            Picker("", selection: $selectedInterpolation) {
                ForEach(Interpolation.allCases) { interpolation in
                    Text(interpolation.rawValue).tag(interpolation)
                }
            }
            .pickerStyle(.wheel)
            
            Chart {
                ForEach(temperatures, id: \.day) { temperature in
                    LineMark(
                        x: .value("day", temperature.day),
                        y: .value("max", temperature.max)
                    )
+                   .interpolationMethod(selectedInterpolation.method)
                }
            }
            .frame(width: 300, height: 300)
        }
    }
}

設定の種類と見た目

cardinal

スクリーンショット 2024-01-15 22.07.19.png

linear

スクリーンショット 2024-01-15 22.07.30.png

monotone

スクリーンショット 2024-01-15 22.07.48.png

stepCenter

スクリーンショット 2024-01-15 22.08.02.png

stepStart

スクリーンショット 2024-01-15 22.08.14.png

stepEnd

スクリーンショット 2024-01-15 22.08.25.png

catmullRom

スクリーンショット 2024-01-15 22.08.37.png

おわり

Chartsって出てきたばかりなのにめっちゃ機能充実してますよね

公式ドキュメント

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?