GRIRiskGridView.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // LoopFollow
  2. // GRIRiskGridView.swift
  3. import Charts
  4. import SwiftUI
  5. struct GRIRiskGridView: UIViewRepresentable {
  6. let hypoComponent: Double
  7. let hyperComponent: Double
  8. let gri: Double
  9. func makeCoordinator() -> Coordinator {
  10. Coordinator()
  11. }
  12. func makeUIView(context _: Context) -> UIView {
  13. let containerView = NonInteractiveContainerView()
  14. containerView.backgroundColor = .systemBackground
  15. let chartView = ScatterChartView()
  16. chartView.backgroundColor = .systemBackground
  17. chartView.rightAxis.enabled = false
  18. chartView.leftAxis.enabled = true
  19. chartView.legend.enabled = false
  20. chartView.chartDescription.enabled = false
  21. chartView.leftAxis.axisMinimum = 0
  22. chartView.leftAxis.axisMaximum = 60
  23. chartView.leftAxis.forceLabelsEnabled = true
  24. chartView.leftAxis.labelPosition = .outsideChart
  25. chartView.rightAxis.enabled = false
  26. chartView.xAxis.labelPosition = .bottom
  27. chartView.xAxis.axisMinimum = 0
  28. chartView.xAxis.axisMaximum = 30
  29. chartView.isUserInteractionEnabled = false
  30. containerView.addSubview(chartView)
  31. chartView.translatesAutoresizingMaskIntoConstraints = false
  32. NSLayoutConstraint.activate([
  33. chartView.topAnchor.constraint(equalTo: containerView.topAnchor),
  34. chartView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
  35. chartView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
  36. chartView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
  37. ])
  38. return containerView
  39. }
  40. class Coordinator {}
  41. func updateUIView(_ containerView: UIView, context _: Context) {
  42. guard let chartView = containerView.subviews.first as? ScatterChartView else { return }
  43. chartView.data = nil
  44. var zoneAEntries: [ChartDataEntry] = []
  45. var zoneBEntries: [ChartDataEntry] = []
  46. var zoneCEntries: [ChartDataEntry] = []
  47. var zoneDEntries: [ChartDataEntry] = []
  48. var zoneEEntries: [ChartDataEntry] = []
  49. let step = 0.5
  50. for hypo in stride(from: 0.0, through: 30.0, by: step) {
  51. for hyper in stride(from: 0.0, through: 60.0, by: step) {
  52. let griValue = (3.0 * hypo) + (1.6 * hyper)
  53. guard griValue <= 100 else { continue }
  54. let entry = ChartDataEntry(x: hypo, y: hyper)
  55. if griValue <= 20 {
  56. zoneAEntries.append(entry)
  57. } else if griValue <= 40 {
  58. zoneBEntries.append(entry)
  59. } else if griValue <= 60 {
  60. zoneCEntries.append(entry)
  61. } else if griValue <= 80 {
  62. zoneDEntries.append(entry)
  63. } else {
  64. zoneEEntries.append(entry)
  65. }
  66. }
  67. }
  68. let zoneADataSet = ScatterChartDataSet(entries: zoneAEntries, label: "Zone A")
  69. zoneADataSet.setColor(NSUIColor.systemGreen.withAlphaComponent(0.3))
  70. zoneADataSet.scatterShapeSize = 4
  71. zoneADataSet.drawValuesEnabled = false
  72. let zoneBDataSet = ScatterChartDataSet(entries: zoneBEntries, label: "Zone B")
  73. zoneBDataSet.setColor(NSUIColor.systemYellow.withAlphaComponent(0.3))
  74. zoneBDataSet.scatterShapeSize = 4
  75. zoneBDataSet.drawValuesEnabled = false
  76. let zoneCDataSet = ScatterChartDataSet(entries: zoneCEntries, label: "Zone C")
  77. zoneCDataSet.setColor(NSUIColor.systemOrange.withAlphaComponent(0.3))
  78. zoneCDataSet.scatterShapeSize = 4
  79. zoneCDataSet.drawValuesEnabled = false
  80. let zoneDDataSet = ScatterChartDataSet(entries: zoneDEntries, label: "Zone D")
  81. zoneDDataSet.setColor(NSUIColor.systemRed.withAlphaComponent(0.3))
  82. zoneDDataSet.scatterShapeSize = 4
  83. zoneDDataSet.drawValuesEnabled = false
  84. let zoneEDataSet = ScatterChartDataSet(entries: zoneEEntries, label: "Zone E")
  85. zoneEDataSet.setColor(NSUIColor.systemRed.withAlphaComponent(0.5))
  86. zoneEDataSet.scatterShapeSize = 4
  87. zoneEDataSet.drawValuesEnabled = false
  88. let currentPoint = ChartDataEntry(x: hypoComponent, y: hyperComponent)
  89. let currentDataSet = ScatterChartDataSet(entries: [currentPoint], label: "Current GRI")
  90. currentDataSet.setColor(NSUIColor.label)
  91. currentDataSet.scatterShapeSize = 12
  92. currentDataSet.setScatterShape(.circle)
  93. currentDataSet.drawValuesEnabled = false
  94. let data = ScatterChartData()
  95. data.append(zoneADataSet)
  96. data.append(zoneBDataSet)
  97. data.append(zoneCDataSet)
  98. data.append(zoneDDataSet)
  99. data.append(zoneEDataSet)
  100. data.append(currentDataSet)
  101. chartView.data = data
  102. chartView.xAxis.valueFormatter = DefaultAxisValueFormatter { value, _ in
  103. String(format: "%.0f", value)
  104. }
  105. chartView.leftAxis.valueFormatter = DefaultAxisValueFormatter { value, _ in
  106. String(format: "%.0f", value)
  107. }
  108. chartView.xAxis.labelTextColor = .label
  109. chartView.leftAxis.labelTextColor = .label
  110. chartView.notifyDataSetChanged()
  111. }
  112. }