GlucoseStackedAreaChart.swift 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import Charts
  2. import SwiftUI
  3. struct GlucoseStackedAreaChart: View {
  4. let glucose: [GlucoseStored]
  5. let highLimit: Decimal
  6. let lowLimit: Decimal
  7. let isToday: Bool
  8. let units: GlucoseUnits
  9. let glucoseRangeStats: [GlucoseRangeStats]
  10. var body: some View {
  11. VStack(alignment: .leading, spacing: 8) {
  12. Chart(glucoseRangeStats) { range in
  13. ForEach(range.values, id: \.hour) { value in
  14. AreaMark(
  15. x: .value("Hour", Calendar.current.dateForChartHour(value.hour)),
  16. y: .value("Count", value.count),
  17. stacking: .normalized
  18. )
  19. .foregroundStyle(by: .value("Range", range.name))
  20. }
  21. }
  22. .chartForegroundStyleScale([
  23. "<54": .purple.opacity(0.7),
  24. "54-70": .red.opacity(0.7),
  25. "70-140": .green,
  26. "140-180": .green.opacity(0.7),
  27. "180-200": .yellow.opacity(0.7),
  28. "200-220": .orange.opacity(0.7),
  29. ">220": .orange.opacity(0.8)
  30. ])
  31. .chartYAxis {
  32. AxisMarks(position: .leading)
  33. }
  34. .chartYAxisLabel(alignment: .leading) {
  35. Text("Percentage")
  36. .foregroundStyle(.primary)
  37. .font(.caption)
  38. .padding(.vertical, 3)
  39. }
  40. .chartXAxis {
  41. AxisMarks(values: .stride(by: .hour, count: 3)) { _ in
  42. AxisValueLabel(format: .dateTime.hour(.defaultDigits(amPM: .narrow)), anchor: .top)
  43. AxisGridLine()
  44. }
  45. }
  46. .frame(height: 200)
  47. }
  48. }
  49. }