CombinedChartViewController.swift 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. //
  2. // CombinedChartViewController.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. #if canImport(UIKit)
  13. import UIKit
  14. #endif
  15. private let ITEM_COUNT = 12
  16. class CombinedChartViewController: DemoBaseViewController {
  17. @IBOutlet var chartView: CombinedChartView!
  18. let months = ["Jan", "Feb", "Mar",
  19. "Apr", "May", "Jun",
  20. "Jul", "Aug", "Sep",
  21. "Oct", "Nov", "Dec"]
  22. override func viewDidLoad() {
  23. super.viewDidLoad()
  24. // Do any additional setup after loading the view.
  25. self.title = "Combined Chart"
  26. self.options = [.toggleLineValues,
  27. .toggleBarValues,
  28. .saveToGallery,
  29. .toggleData,
  30. .toggleBarBorders,
  31. .removeDataSet]
  32. chartView.delegate = self
  33. chartView.chartDescription.enabled = false
  34. chartView.drawBarShadowEnabled = false
  35. chartView.highlightFullBarEnabled = false
  36. chartView.drawOrder = [DrawOrder.bar.rawValue,
  37. DrawOrder.bubble.rawValue,
  38. DrawOrder.candle.rawValue,
  39. DrawOrder.line.rawValue,
  40. DrawOrder.scatter.rawValue]
  41. let l = chartView.legend
  42. l.wordWrapEnabled = true
  43. l.horizontalAlignment = .center
  44. l.verticalAlignment = .bottom
  45. l.orientation = .horizontal
  46. l.drawInside = false
  47. // chartView.legend = l
  48. let rightAxis = chartView.rightAxis
  49. rightAxis.axisMinimum = 0
  50. let leftAxis = chartView.leftAxis
  51. leftAxis.axisMinimum = 0
  52. let xAxis = chartView.xAxis
  53. xAxis.labelPosition = .bothSided
  54. xAxis.axisMinimum = 0
  55. xAxis.granularity = 1
  56. xAxis.valueFormatter = self
  57. self.updateChartData()
  58. }
  59. override func updateChartData() {
  60. if self.shouldHideData {
  61. chartView.data = nil
  62. return
  63. }
  64. self.setChartData()
  65. }
  66. func setChartData() {
  67. let data = CombinedChartData()
  68. data.lineData = generateLineData()
  69. data.barData = generateBarData()
  70. data.bubbleData = generateBubbleData()
  71. data.scatterData = generateScatterData()
  72. data.candleData = generateCandleData()
  73. chartView.xAxis.axisMaximum = data.xMax + 0.25
  74. chartView.data = data
  75. }
  76. override func optionTapped(_ option: Option) {
  77. switch option {
  78. case .toggleLineValues:
  79. for set in chartView.data! {
  80. if let set = set as? LineChartDataSet {
  81. set.drawValuesEnabled = !set .drawValuesEnabled
  82. }
  83. }
  84. chartView.setNeedsDisplay()
  85. case .toggleBarValues:
  86. for set in chartView.data! {
  87. if let set = set as? BarChartDataSet {
  88. set.drawValuesEnabled = !set .drawValuesEnabled
  89. }
  90. }
  91. chartView.setNeedsDisplay()
  92. case .removeDataSet:
  93. let rnd = Int(arc4random_uniform(UInt32(chartView.data!.dataSetCount)))
  94. chartView.data?.removeDataSet(chartView.data![rnd])
  95. chartView.data?.notifyDataChanged()
  96. chartView.notifyDataSetChanged()
  97. default:
  98. super.handleOption(option, forChartView: chartView)
  99. }
  100. }
  101. func generateLineData() -> LineChartData {
  102. let entries = (0..<ITEM_COUNT).map { (i) -> ChartDataEntry in
  103. return ChartDataEntry(x: Double(i) + 0.5, y: Double(arc4random_uniform(15) + 5))
  104. }
  105. let set = LineChartDataSet(entries: entries, label: "Line DataSet")
  106. set.setColor(UIColor(red: 240/255, green: 238/255, blue: 70/255, alpha: 1))
  107. set.lineWidth = 2.5
  108. set.setCircleColor(UIColor(red: 240/255, green: 238/255, blue: 70/255, alpha: 1))
  109. set.circleRadius = 5
  110. set.circleHoleRadius = 2.5
  111. set.fillColor = UIColor(red: 240/255, green: 238/255, blue: 70/255, alpha: 1)
  112. set.mode = .cubicBezier
  113. set.drawValuesEnabled = true
  114. set.valueFont = .systemFont(ofSize: 10)
  115. set.valueTextColor = UIColor(red: 240/255, green: 238/255, blue: 70/255, alpha: 1)
  116. set.axisDependency = .left
  117. return LineChartData(dataSet: set)
  118. }
  119. func generateBarData() -> BarChartData {
  120. let entries1 = (0..<ITEM_COUNT).map { _ -> BarChartDataEntry in
  121. return BarChartDataEntry(x: 0, y: Double(arc4random_uniform(25) + 25))
  122. }
  123. let entries2 = (0..<ITEM_COUNT).map { _ -> BarChartDataEntry in
  124. return BarChartDataEntry(x: 0, yValues: [Double(arc4random_uniform(13) + 12), Double(arc4random_uniform(13) + 12)])
  125. }
  126. let set1 = BarChartDataSet(entries: entries1, label: "Bar 1")
  127. set1.setColor(UIColor(red: 60/255, green: 220/255, blue: 78/255, alpha: 1))
  128. set1.valueTextColor = UIColor(red: 60/255, green: 220/255, blue: 78/255, alpha: 1)
  129. set1.valueFont = .systemFont(ofSize: 10)
  130. set1.axisDependency = .left
  131. let set2 = BarChartDataSet(entries: entries2, label: "")
  132. set2.stackLabels = ["Stack 1", "Stack 2"]
  133. set2.colors = [UIColor(red: 61/255, green: 165/255, blue: 255/255, alpha: 1),
  134. UIColor(red: 23/255, green: 197/255, blue: 255/255, alpha: 1)
  135. ]
  136. set2.valueTextColor = UIColor(red: 61/255, green: 165/255, blue: 255/255, alpha: 1)
  137. set2.valueFont = .systemFont(ofSize: 10)
  138. set2.axisDependency = .left
  139. let groupSpace = 0.06
  140. let barSpace = 0.02 // x2 dataset
  141. let barWidth = 0.45 // x2 dataset
  142. // (0.45 + 0.02) * 2 + 0.06 = 1.00 -> interval per "group"
  143. let data: BarChartData = [set1, set2]
  144. data.barWidth = barWidth
  145. // make this BarData object grouped
  146. data.groupBars(fromX: 0, groupSpace: groupSpace, barSpace: barSpace)
  147. return data
  148. }
  149. func generateScatterData() -> ScatterChartData {
  150. let entries = stride(from: 0.0, to: Double(ITEM_COUNT), by: 0.5).map { (i) -> ChartDataEntry in
  151. return ChartDataEntry(x: i+0.25, y: Double(arc4random_uniform(10) + 55))
  152. }
  153. let set = ScatterChartDataSet(entries: entries, label: "Scatter DataSet")
  154. set.colors = ChartColorTemplates.material()
  155. set.scatterShapeSize = 4.5
  156. set.drawValuesEnabled = false
  157. set.valueFont = .systemFont(ofSize: 10)
  158. return ScatterChartData(dataSet: set)
  159. }
  160. func generateCandleData() -> CandleChartData {
  161. let entries = stride(from: 0, to: ITEM_COUNT, by: 2).map { (i) -> CandleChartDataEntry in
  162. return CandleChartDataEntry(x: Double(i+1), shadowH: 90, shadowL: 70, open: 85, close: 75)
  163. }
  164. let set = CandleChartDataSet(entries: entries, label: "Candle DataSet")
  165. set.setColor(UIColor(red: 80/255, green: 80/255, blue: 80/255, alpha: 1))
  166. set.decreasingColor = UIColor(red: 142/255, green: 150/255, blue: 175/255, alpha: 1)
  167. set.shadowColor = .darkGray
  168. set.valueFont = .systemFont(ofSize: 10)
  169. set.drawValuesEnabled = false
  170. return CandleChartData(dataSet: set)
  171. }
  172. func generateBubbleData() -> BubbleChartData {
  173. let entries = (0..<ITEM_COUNT).map { (i) -> BubbleChartDataEntry in
  174. return BubbleChartDataEntry(x: Double(i) + 0.5,
  175. y: Double(arc4random_uniform(10) + 105),
  176. size: CGFloat(arc4random_uniform(50) + 105))
  177. }
  178. let set = BubbleChartDataSet(entries: entries, label: "Bubble DataSet")
  179. set.setColors(ChartColorTemplates.vordiplom(), alpha: 1)
  180. set.valueTextColor = .white
  181. set.valueFont = .systemFont(ofSize: 10)
  182. set.drawValuesEnabled = true
  183. return BubbleChartData(dataSet: set)
  184. }
  185. }
  186. extension CombinedChartViewController: AxisValueFormatter {
  187. func stringForValue(_ value: Double, axis: AxisBase?) -> String {
  188. return months[Int(value) % months.count]
  189. }
  190. }