LineChart2ViewController.swift 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. //
  2. // LineChart2ViewController.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 DGCharts
  12. class LineChart2ViewController: DemoBaseViewController {
  13. @IBOutlet var chartView: LineChartView!
  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 = "Line Chart 2"
  22. self.options = [.toggleValues,
  23. .toggleFilled,
  24. .toggleCircles,
  25. .toggleCubic,
  26. .toggleHorizontalCubic,
  27. .toggleStepped,
  28. .toggleHighlight,
  29. .animateX,
  30. .animateY,
  31. .animateXY,
  32. .saveToGallery,
  33. .togglePinchZoom,
  34. .toggleAutoScaleMinMax,
  35. .toggleData]
  36. chartView.delegate = self
  37. chartView.chartDescription.enabled = false
  38. chartView.dragEnabled = true
  39. chartView.setScaleEnabled(true)
  40. chartView.pinchZoomEnabled = true
  41. let l = chartView.legend
  42. l.form = .line
  43. l.font = UIFont(name: "HelveticaNeue-Light", size: 11)!
  44. l.textColor = .white
  45. l.horizontalAlignment = .left
  46. l.verticalAlignment = .bottom
  47. l.orientation = .horizontal
  48. l.drawInside = false
  49. let xAxis = chartView.xAxis
  50. xAxis.labelFont = .systemFont(ofSize: 11)
  51. xAxis.labelTextColor = .white
  52. xAxis.drawAxisLineEnabled = false
  53. let leftAxis = chartView.leftAxis
  54. leftAxis.labelTextColor = UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1)
  55. leftAxis.axisMaximum = 200
  56. leftAxis.axisMinimum = 0
  57. leftAxis.drawGridLinesEnabled = true
  58. leftAxis.granularityEnabled = true
  59. let rightAxis = chartView.rightAxis
  60. rightAxis.labelTextColor = .red
  61. rightAxis.axisMaximum = 900
  62. rightAxis.axisMinimum = -200
  63. rightAxis.granularityEnabled = false
  64. sliderX.value = 20
  65. sliderY.value = 30
  66. slidersValueChanged(nil)
  67. chartView.animate(xAxisDuration: 2.5)
  68. }
  69. override func updateChartData() {
  70. if self.shouldHideData {
  71. chartView.data = nil
  72. return
  73. }
  74. self.setDataCount(Int(sliderX.value + 1), range: UInt32(sliderY.value))
  75. }
  76. func setDataCount(_ count: Int, range: UInt32) {
  77. let yVals1 = (0..<count).map { (i) -> ChartDataEntry in
  78. let mult = range / 2
  79. let val = Double(arc4random_uniform(mult) + 50)
  80. return ChartDataEntry(x: Double(i), y: val)
  81. }
  82. let yVals2 = (0..<count).map { (i) -> ChartDataEntry in
  83. let val = Double(arc4random_uniform(range) + 450)
  84. return ChartDataEntry(x: Double(i), y: val)
  85. }
  86. let yVals3 = (0..<count).map { (i) -> ChartDataEntry in
  87. let val = Double(arc4random_uniform(range) + 500)
  88. return ChartDataEntry(x: Double(i), y: val)
  89. }
  90. let set1 = LineChartDataSet(entries: yVals1, label: "DataSet 1")
  91. set1.axisDependency = .left
  92. set1.setColor(UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1))
  93. set1.setCircleColor(.white)
  94. set1.lineWidth = 2
  95. set1.circleRadius = 3
  96. set1.fillAlpha = 65/255
  97. set1.fillColor = UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1)
  98. set1.highlightColor = UIColor(red: 244/255, green: 117/255, blue: 117/255, alpha: 1)
  99. set1.drawCircleHoleEnabled = false
  100. let set2 = LineChartDataSet(entries: yVals2, label: "DataSet 2")
  101. set2.axisDependency = .right
  102. set2.setColor(.red)
  103. set2.setCircleColor(.white)
  104. set2.lineWidth = 2
  105. set2.circleRadius = 3
  106. set2.fillAlpha = 65/255
  107. set2.fillColor = .red
  108. set2.highlightColor = UIColor(red: 244/255, green: 117/255, blue: 117/255, alpha: 1)
  109. set2.drawCircleHoleEnabled = false
  110. let set3 = LineChartDataSet(entries: yVals3, label: "DataSet 3")
  111. set3.axisDependency = .right
  112. set3.setColor(.yellow)
  113. set3.setCircleColor(.white)
  114. set3.lineWidth = 2
  115. set3.circleRadius = 3
  116. set3.fillAlpha = 65/255
  117. set3.fillColor = UIColor.yellow.withAlphaComponent(200/255)
  118. set3.highlightColor = UIColor(red: 244/255, green: 117/255, blue: 117/255, alpha: 1)
  119. set3.drawCircleHoleEnabled = false
  120. let data: LineChartData = [set1, set2, set3]
  121. data.setValueTextColor(.white)
  122. data.setValueFont(.systemFont(ofSize: 9))
  123. chartView.data = data
  124. }
  125. override func optionTapped(_ option: Option) {
  126. guard let data = chartView.data else { return }
  127. switch option {
  128. case .toggleFilled:
  129. for case let set as LineChartDataSet in data {
  130. set.drawFilledEnabled = !set.drawFilledEnabled
  131. }
  132. chartView.setNeedsDisplay()
  133. case .toggleCircles:
  134. for case let set as LineChartDataSet in data {
  135. set.drawCirclesEnabled = !set.drawCirclesEnabled
  136. }
  137. chartView.setNeedsDisplay()
  138. case .toggleCubic:
  139. for case let set as LineChartDataSet in data {
  140. set.mode = (set.mode == .cubicBezier) ? .linear : .cubicBezier
  141. }
  142. chartView.setNeedsDisplay()
  143. case .toggleStepped:
  144. for case let set as LineChartDataSet in data {
  145. set.mode = (set.mode == .stepped) ? .linear : .stepped
  146. }
  147. chartView.setNeedsDisplay()
  148. case .toggleHorizontalCubic:
  149. for case let set as LineChartDataSet in data {
  150. set.mode = (set.mode == .cubicBezier) ? .horizontalBezier : .cubicBezier
  151. }
  152. chartView.setNeedsDisplay()
  153. default:
  154. super.handleOption(option, forChartView: chartView)
  155. }
  156. }
  157. @IBAction func slidersValueChanged(_ sender: Any?) {
  158. sliderTextX.text = "\(Int(sliderX.value))"
  159. sliderTextY.text = "\(Int(sliderY.value))"
  160. self.updateChartData()
  161. }
  162. //}
  163. // TODO: Declarations in extensions cannot override yet.
  164. //extension LineChart2ViewController {
  165. override func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
  166. super.chartValueSelected(chartView, entry: entry, highlight: highlight)
  167. self.chartView.centerViewToAnimated(xValue: entry.x, yValue: entry.y,
  168. axis: self.chartView.data![highlight.dataSetIndex].axisDependency,
  169. duration: 1)
  170. //[_chartView moveViewToAnimatedWithXValue:entry.x yValue:entry.y axis:[_chartView.data getDataSetByIndex:dataSetIndex].axisDependency duration:1.0];
  171. //[_chartView zoomAndCenterViewAnimatedWithScaleX:1.8 scaleY:1.8 xValue:entry.x yValue:entry.y axis:[_chartView.data getDataSetByIndex:dataSetIndex].axisDependency duration:1.0];
  172. }
  173. }