GRIRiskGridView.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. let xHypoValue = hypoComponent
  45. let yHyperValue = hyperComponent
  46. var zoneAEntries: [ChartDataEntry] = []
  47. var zoneBEntries: [ChartDataEntry] = []
  48. var zoneCEntries: [ChartDataEntry] = []
  49. var zoneDEntries: [ChartDataEntry] = []
  50. var zoneEEntries: [ChartDataEntry] = []
  51. let step = 0.5
  52. for hypo in stride(from: 0.0, through: 30.0, by: step) {
  53. for hyper in stride(from: 0.0, through: 60.0, by: step) {
  54. let griValue = (3.0 * hypo) + (1.6 * hyper)
  55. guard griValue <= 100 else { continue }
  56. let entry = ChartDataEntry(x: hypo, y: hyper)
  57. if griValue <= 20 {
  58. zoneAEntries.append(entry)
  59. } else if griValue <= 40 {
  60. zoneBEntries.append(entry)
  61. } else if griValue <= 60 {
  62. zoneCEntries.append(entry)
  63. } else if griValue <= 80 {
  64. zoneDEntries.append(entry)
  65. } else {
  66. zoneEEntries.append(entry)
  67. }
  68. }
  69. }
  70. let zoneADataSet = ScatterChartDataSet(entries: zoneAEntries, label: "Zone A")
  71. zoneADataSet.setColor(NSUIColor.systemGreen.withAlphaComponent(0.3))
  72. zoneADataSet.scatterShapeSize = 4
  73. zoneADataSet.drawValuesEnabled = false
  74. let zoneBDataSet = ScatterChartDataSet(entries: zoneBEntries, label: "Zone B")
  75. zoneBDataSet.setColor(NSUIColor.systemYellow.withAlphaComponent(0.3))
  76. zoneBDataSet.scatterShapeSize = 4
  77. zoneBDataSet.drawValuesEnabled = false
  78. let zoneCDataSet = ScatterChartDataSet(entries: zoneCEntries, label: "Zone C")
  79. zoneCDataSet.setColor(NSUIColor.systemOrange.withAlphaComponent(0.3))
  80. zoneCDataSet.scatterShapeSize = 4
  81. zoneCDataSet.drawValuesEnabled = false
  82. let zoneDDataSet = ScatterChartDataSet(entries: zoneDEntries, label: "Zone D")
  83. zoneDDataSet.setColor(NSUIColor.systemRed.withAlphaComponent(0.3))
  84. zoneDDataSet.scatterShapeSize = 4
  85. zoneDDataSet.drawValuesEnabled = false
  86. let zoneEDataSet = ScatterChartDataSet(entries: zoneEEntries, label: "Zone E")
  87. zoneEDataSet.setColor(NSUIColor.systemRed.withAlphaComponent(0.5))
  88. zoneEDataSet.scatterShapeSize = 4
  89. zoneEDataSet.drawValuesEnabled = false
  90. let currentPoint = ChartDataEntry(x: xHypoValue, y: yHyperValue)
  91. let currentDataSet = ScatterChartDataSet(entries: [currentPoint], label: "Current GRI")
  92. currentDataSet.setColor(NSUIColor.label)
  93. currentDataSet.scatterShapeSize = 12
  94. currentDataSet.setScatterShape(.circle)
  95. currentDataSet.drawValuesEnabled = false
  96. let data = ScatterChartData()
  97. data.append(zoneADataSet)
  98. data.append(zoneBDataSet)
  99. data.append(zoneCDataSet)
  100. data.append(zoneDDataSet)
  101. data.append(zoneEDataSet)
  102. data.append(currentDataSet)
  103. chartView.data = data
  104. chartView.xAxis.valueFormatter = DefaultAxisValueFormatter { value, _ in
  105. String(format: "%.0f", value)
  106. }
  107. chartView.leftAxis.valueFormatter = DefaultAxisValueFormatter { value, _ in
  108. String(format: "%.0f", value)
  109. }
  110. chartView.xAxis.labelTextColor = .label
  111. chartView.leftAxis.labelTextColor = .label
  112. chartView.notifyDataSetChanged()
  113. }
  114. }