123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- //
- // MultipleBarChartViewController.swift
- // ChartsDemo-iOS
- //
- // Created by Jacob Christie on 2017-07-09.
- // Copyright © 2017 jc. All rights reserved.
- //
- #if canImport(UIKit)
- import UIKit
- #endif
- import Charts
- class MultipleBarChartViewController: DemoBaseViewController {
- @IBOutlet var chartView: BarChartView!
- @IBOutlet var sliderX: UISlider!
- @IBOutlet var sliderY: UISlider!
- @IBOutlet var sliderTextX: UITextField!
- @IBOutlet var sliderTextY: UITextField!
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- // Do any additional setup after loading the view.
- self.title = "Multiple Bar Chart"
-
- self.options = [.toggleValues,
- .toggleHighlight,
- .animateX,
- .animateY,
- .animateXY,
- .saveToGallery,
- .togglePinchZoom,
- .toggleAutoScaleMinMax,
- .toggleData,
- .toggleBarBorders]
-
- chartView.delegate = self
-
- chartView.chartDescription?.enabled = false
-
- chartView.pinchZoomEnabled = false
- chartView.drawBarShadowEnabled = false
-
- 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))
- marker.chartView = chartView
- marker.minimumSize = CGSize(width: 80, height: 40)
- chartView.marker = marker
-
- let l = chartView.legend
- l.horizontalAlignment = .right
- l.verticalAlignment = .top
- l.orientation = .vertical
- l.drawInside = true
- l.font = .systemFont(ofSize: 8, weight: .light)
- l.yOffset = 10
- l.xOffset = 10
- l.yEntrySpace = 0
- // chartView.legend = l
- let xAxis = chartView.xAxis
- xAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
- xAxis.granularity = 1
- xAxis.centerAxisLabelsEnabled = true
- xAxis.valueFormatter = IntAxisValueFormatter()
-
- let leftAxisFormatter = NumberFormatter()
- leftAxisFormatter.maximumFractionDigits = 1
-
- let leftAxis = chartView.leftAxis
- leftAxis.labelFont = .systemFont(ofSize: 10, weight: .light)
- leftAxis.valueFormatter = LargeValueFormatter()
- leftAxis.spaceTop = 0.35
- leftAxis.axisMinimum = 0
-
- chartView.rightAxis.enabled = false
-
- sliderX.value = 10
- sliderY.value = 100
- slidersValueChanged(nil)
- }
-
- override func updateChartData() {
- if self.shouldHideData {
- chartView.data = nil
- return
- }
-
- self.setDataCount(Int(sliderX.value), range: UInt32(sliderY.value))
- }
-
- func setDataCount(_ count: Int, range: UInt32) {
- let groupSpace = 0.08
- let barSpace = 0.03
- let barWidth = 0.2
- // (0.2 + 0.03) * 4 + 0.08 = 1.00 -> interval per "group"
- let randomMultiplier = range * 100000
- let groupCount = count + 1
- let startYear = 1980
- let endYear = startYear + groupCount
-
- let block: (Int) -> BarChartDataEntry = { (i) -> BarChartDataEntry in
- return BarChartDataEntry(x: Double(i), y: Double(arc4random_uniform(randomMultiplier)))
- }
- let yVals1 = (startYear ..< endYear).map(block)
- let yVals2 = (startYear ..< endYear).map(block)
- let yVals3 = (startYear ..< endYear).map(block)
- let yVals4 = (startYear ..< endYear).map(block)
-
- let set1 = BarChartDataSet(entries: yVals1, label: "Company A")
- set1.setColor(UIColor(red: 104/255, green: 241/255, blue: 175/255, alpha: 1))
-
- let set2 = BarChartDataSet(entries: yVals2, label: "Company B")
- set2.setColor(UIColor(red: 164/255, green: 228/255, blue: 251/255, alpha: 1))
-
- let set3 = BarChartDataSet(entries: yVals3, label: "Company C")
- set3.setColor(UIColor(red: 242/255, green: 247/255, blue: 158/255, alpha: 1))
-
- let set4 = BarChartDataSet(entries: yVals4, label: "Company D")
- set4.setColor(UIColor(red: 255/255, green: 102/255, blue: 0/255, alpha: 1))
-
- let data = BarChartData(dataSets: [set1, set2, set3, set4])
- data.setValueFont(.systemFont(ofSize: 10, weight: .light))
- data.setValueFormatter(LargeValueFormatter())
-
- // specify the width each bar should have
- data.barWidth = barWidth
- // restrict the x-axis range
- chartView.xAxis.axisMinimum = Double(startYear)
-
- // groupWidthWithGroupSpace(...) is a helper that calculates the width each group needs based on the provided parameters
- chartView.xAxis.axisMaximum = Double(startYear) + data.groupWidth(groupSpace: groupSpace, barSpace: barSpace) * Double(groupCount)
-
- data.groupBars(fromX: Double(startYear), groupSpace: groupSpace, barSpace: barSpace)
- chartView.data = data
- }
-
- override func optionTapped(_ option: Option) {
- super.handleOption(option, forChartView: chartView)
- }
-
- // MARK: - Actions
- @IBAction func slidersValueChanged(_ sender: Any?) {
- let startYear = 1980
- let endYear = startYear + Int(sliderX.value)
- sliderTextX.text = "\(startYear)-\(endYear)"
- sliderTextY.text = "\(Int(sliderY.value))"
-
- self.updateChartData()
- }
- }
|