它将一个人的睡眠分为4个类别:清醒、快速、核心和深度.我得到了我想要的图表,显示了晚上不同时间(每小时)的睡眠数据,但我不知道如何让我的Y轴以正确的顺序显示.我希望它被分成四个阶段,每个睡眠阶段,从最高清醒开始,在REM以下,在核心以下,在底部深度,图形高度的25%.然而,无论我try 什么,它都保持着秩序的核心,清醒,深沉,快速.我试过使用.chartYAxis,但它似乎没有任何作用.我可以在文档中看到如何针对数字或日期调整它,但对于我想要的,我非常困惑,特别是当我没有收到错误时,它只是无法默默地对它们进行排序.我想过以某种方式使用Integer来表示每种睡眠类型,0=唤醒,4=深度,并以某种方式将它们对应到字符串值,但我不确定如何实现这一点.谢谢你的帮助!
enum SleepType: String, Plottable, CaseIterable {
case Awake
case REM
case Core
case Deep
}
struct SingleSleep: Hashable, Identifiable {
let id = UUID()
let startDate: Date
let stopDate: Date
var sleepTime: TimeInterval = 0 //in minutes
var sleepType: SleepType
}
struct SleepExampleView: View {
var sleep = [
SingleSleep(startDate: Date(timeIntervalSinceReferenceDate: 729208384), stopDate: Date(timeIntervalSinceReferenceDate: 729209374), sleepTime: 16.5, sleepType: .Core),
SingleSleep(startDate: Date(timeIntervalSinceReferenceDate: 729209374), stopDate: Date(timeIntervalSinceReferenceDate: 729209404), sleepTime: 16.5, sleepType: .Awake),
SingleSleep(startDate: Date(timeIntervalSinceReferenceDate: 729209404), stopDate: Date(timeIntervalSinceReferenceDate: 729209794), sleepTime: 16.5, sleepType: .Core),
SingleSleep(startDate: Date(timeIntervalSinceReferenceDate: 729209794), stopDate: Date(timeIntervalSinceReferenceDate: 729211234), sleepTime: 16.5, sleepType: .Deep),
SingleSleep(startDate: Date(timeIntervalSinceReferenceDate: 729211234), stopDate: Date(timeIntervalSinceReferenceDate: 729211864), sleepTime: 16.5, sleepType: .REM),
]
var body: some View {
//chart
Chart {
ForEach(sleep, id: \.self) { sleep in
LineMark(
x: .value("Time", sleep.startDate),
y: .value("Type", sleep.sleepType.rawValue)
)
}
}
.chartYAxis {
AxisMarks(
values: [SleepType.Awake.rawValue, SleepType.REM.rawValue, SleepType.Core.rawValue, SleepType.Deep.rawValue]
)
}
.chartXAxis {
AxisMarks(values: .stride(by: .hour, count: 1)) { value in
AxisValueLabel(format: .dateTime.hour(), centered: true)
}
}
.frame(width: 300, height: 300)
.preferredColorScheme(.dark)
.background(.clear)
}
}