MultipleBarChartViewController.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // MultipleBarChartViewController.swift
  3. // ChartsDemo-iOS
  4. //
  5. // Created by Jacob Christie on 2017-07-09.
  6. // Copyright © 2017 jc. All rights reserved.
  7. //
  8. #if canImport(UIKit)
  9. import UIKit
  10. #endif
  11. import Charts
  12. class MultipleBarChartViewController: DemoBaseViewController {
  13. @IBOutlet var chartView: BarChartView!
  14. @IBOutlet var sliderX: UISlider!
  15. @IBOutlet var sliderY: UISlider!
  16. @IBOutlet var sliderTextX: UITextField!
  17. @IBOutlet var sliderTextY: UITextField!
  18. override func viewDidLoad() {
  19. super.viewDidLoad()
  20. // Do any additional setup after loading the view.
  21. self.title = "Multiple Bar Chart"
  22. self.options = [.toggleValues,
  23. .toggleHighlight,
  24. .animateX,
  25. .animateY,
  26. .animateXY,
  27. .saveToGallery,
  28. .togglePinchZoom,
  29. .toggleAutoScaleMinMax,
  30. .toggleData,
  31. .toggleBarBorders]
  32. chartView.delegate = self
  33. chartView.chartDescription.enabled = false
  34. chartView.pinchZoomEnabled = false
  35. chartView.drawBarShadowEnabled = false
  36. let marker = BalloonMarker(color: UIColor(white: 180/255, alpha: 1), font: .systemFont(ofSize: 12), textColor: .white, insets: UIEdgeInsets(top: 8, left: 8, bottom: 20, right: 8))
  37. marker.chartView = chartView
  38. marker.minimumSize = CGSize(width: 80, height: 40)
  39. chartView.marker = marker
  40. let l = chartView.legend
  41. l.horizontalAlignment = .right
  42. l.verticalAlignment = .top
  43. l.orientation = .vertical
  44. l.drawInside = true
  45. l.font = .systemFont(ofSize: 8, weight: .light)
  46. l.yOffset = 10
  47. l.xOffset = 10
  48. l.yEntrySpace = 0
  49. // chartView.legend = l
  50. let xAxis = chartView.xAxis
  51. xAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
  52. xAxis.granularity = 1
  53. xAxis.centerAxisLabelsEnabled = true
  54. xAxis.valueFormatter = IntAxisValueFormatter()
  55. let leftAxisFormatter = NumberFormatter()
  56. leftAxisFormatter.maximumFractionDigits = 1
  57. let leftAxis = chartView.leftAxis
  58. leftAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
  59. leftAxis.valueFormatter = LargeValueFormatter()
  60. leftAxis.spaceTop = 0.35
  61. leftAxis.axisMinimum = 0
  62. chartView.rightAxis.enabled = false
  63. sliderX.value = 10
  64. sliderY.value = 100
  65. slidersValueChanged(nil)
  66. }
  67. override func updateChartData() {
  68. if self.shouldHideData {
  69. chartView.data = nil
  70. return
  71. }
  72. self.setDataCount(Int(sliderX.value), range: UInt32(sliderY.value))
  73. }
  74. func setDataCount(_ count: Int, range: UInt32) {
  75. let groupSpace = 0.08
  76. let barSpace = 0.03
  77. let barWidth = 0.2
  78. // (0.2 + 0.03) * 4 + 0.08 = 1.00 -> interval per "group"
  79. let randomMultiplier = range * 100000
  80. let groupCount = count + 1
  81. let startYear = 1980
  82. let endYear = startYear + groupCount
  83. let block: (Int) -> BarChartDataEntry = { (i) -> BarChartDataEntry in
  84. return BarChartDataEntry(x: Double(i), y: Double(arc4random_uniform(randomMultiplier)))
  85. }
  86. let yVals1 = (startYear ..< endYear).map(block)
  87. let yVals2 = (startYear ..< endYear).map(block)
  88. let yVals3 = (startYear ..< endYear).map(block)
  89. let yVals4 = (startYear ..< endYear).map(block)
  90. let set1 = BarChartDataSet(entries: yVals1, label: "Company A")
  91. set1.setColor(UIColor(red: 104/255, green: 241/255, blue: 175/255, alpha: 1))
  92. let set2 = BarChartDataSet(entries: yVals2, label: "Company B")
  93. set2.setColor(UIColor(red: 164/255, green: 228/255, blue: 251/255, alpha: 1))
  94. let set3 = BarChartDataSet(entries: yVals3, label: "Company C")
  95. set3.setColor(UIColor(red: 242/255, green: 247/255, blue: 158/255, alpha: 1))
  96. let set4 = BarChartDataSet(entries: yVals4, label: "Company D")
  97. set4.setColor(UIColor(red: 255/255, green: 102/255, blue: 0/255, alpha: 1))
  98. let data: BarChartData = [set1, set2, set3, set4]
  99. data.setValueFont(.systemFont(ofSize: 10, weight: .light))
  100. data.setValueFormatter(LargeValueFormatter())
  101. // specify the width each bar should have
  102. data.barWidth = barWidth
  103. // restrict the x-axis range
  104. chartView.xAxis.axisMinimum = Double(startYear)
  105. // groupWidthWithGroupSpace(...) is a helper that calculates the width each group needs based on the provided parameters
  106. chartView.xAxis.axisMaximum = Double(startYear) + data.groupWidth(groupSpace: groupSpace, barSpace: barSpace) * Double(groupCount)
  107. data.groupBars(fromX: Double(startYear), groupSpace: groupSpace, barSpace: barSpace)
  108. chartView.data = data
  109. }
  110. override func optionTapped(_ option: Option) {
  111. super.handleOption(option, forChartView: chartView)
  112. }
  113. // MARK: - Actions
  114. @IBAction func slidersValueChanged(_ sender: Any?) {
  115. let startYear = 1980
  116. let endYear = startYear + Int(sliderX.value)
  117. sliderTextX.text = "\(startYear)-\(endYear)"
  118. sliderTextY.text = "\(Int(sliderY.value))"
  119. self.updateChartData()
  120. }
  121. }