StackedBarChartViewController.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //
  2. // StackedBarChartViewController.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 StackedBarChartViewController: 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. lazy var formatter: NumberFormatter = {
  19. let formatter = NumberFormatter()
  20. formatter.maximumFractionDigits = 1
  21. formatter.negativeSuffix = " $"
  22. formatter.positiveSuffix = " $"
  23. return formatter
  24. }()
  25. override func viewDidLoad() {
  26. super.viewDidLoad()
  27. // Do any additional setup after loading the view.
  28. self.title = "Stacked Bar Chart"
  29. self.options = [.toggleValues,
  30. .toggleIcons,
  31. .toggleHighlight,
  32. .animateX,
  33. .animateY,
  34. .animateXY,
  35. .saveToGallery,
  36. .togglePinchZoom,
  37. .toggleAutoScaleMinMax,
  38. .toggleData,
  39. .toggleBarBorders]
  40. chartView.delegate = self
  41. chartView.chartDescription.enabled = false
  42. chartView.maxVisibleCount = 40
  43. chartView.drawBarShadowEnabled = false
  44. chartView.drawValueAboveBarEnabled = false
  45. chartView.highlightFullBarEnabled = false
  46. let leftAxis = chartView.leftAxis
  47. leftAxis.valueFormatter = DefaultAxisValueFormatter(formatter: formatter)
  48. leftAxis.axisMinimum = 0
  49. chartView.rightAxis.enabled = false
  50. let xAxis = chartView.xAxis
  51. xAxis.labelPosition = .top
  52. let l = chartView.legend
  53. l.horizontalAlignment = .right
  54. l.verticalAlignment = .bottom
  55. l.orientation = .horizontal
  56. l.drawInside = false
  57. l.form = .square
  58. l.formToTextSpace = 4
  59. l.xEntrySpace = 6
  60. // chartView.legend = l
  61. sliderX.value = 12
  62. sliderY.value = 100
  63. slidersValueChanged(nil)
  64. self.updateChartData()
  65. }
  66. override func updateChartData() {
  67. if self.shouldHideData {
  68. chartView.data = nil
  69. return
  70. }
  71. self.setChartData(count: Int(sliderX.value + 1), range: UInt32(sliderY.value))
  72. }
  73. func setChartData(count: Int, range: UInt32) {
  74. let yVals = (0..<count).map { (i) -> BarChartDataEntry in
  75. let mult = range + 1
  76. let val1 = Double(arc4random_uniform(mult) + mult / 3)
  77. let val2 = Double(arc4random_uniform(mult) + mult / 3)
  78. let val3 = Double(arc4random_uniform(mult) + mult / 3)
  79. return BarChartDataEntry(x: Double(i), yValues: [val1, val2, val3], icon: #imageLiteral(resourceName: "icon"))
  80. }
  81. let set = BarChartDataSet(entries: yVals, label: "Statistics Vienna 2014")
  82. set.drawIconsEnabled = false
  83. set.colors = [ChartColorTemplates.material()[0], ChartColorTemplates.material()[1], ChartColorTemplates.material()[2]]
  84. set.stackLabels = ["Births", "Divorces", "Marriages"]
  85. let data = BarChartData(dataSet: set)
  86. data.setValueFont(.systemFont(ofSize: 7, weight: .light))
  87. data.setValueFormatter(DefaultValueFormatter(formatter: formatter))
  88. data.setValueTextColor(.white)
  89. chartView.fitBars = true
  90. chartView.data = data
  91. }
  92. override func optionTapped(_ option: Option) {
  93. super.handleOption(option, forChartView: chartView)
  94. }
  95. @IBAction func slidersValueChanged(_ sender: Any?) {
  96. sliderTextX.text = "\(Int(sliderX.value))"
  97. sliderTextY.text = "\(Int(sliderY.value))"
  98. updateChartData()
  99. }
  100. }