123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- //
- // CombinedChartViewController.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
- #if canImport(UIKit)
- import UIKit
- #endif
- private let ITEM_COUNT = 12
- class CombinedChartViewController: DemoBaseViewController {
- @IBOutlet var chartView: CombinedChartView!
-
- let months = ["Jan", "Feb", "Mar",
- "Apr", "May", "Jun",
- "Jul", "Aug", "Sep",
- "Oct", "Nov", "Dec"]
-
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- // Do any additional setup after loading the view.
- self.title = "Combined Chart"
- self.options = [.toggleLineValues,
- .toggleBarValues,
- .saveToGallery,
- .toggleData,
- .toggleBarBorders,
- .removeDataSet]
-
- chartView.delegate = self
-
- chartView.chartDescription.enabled = false
-
- chartView.drawBarShadowEnabled = false
- chartView.highlightFullBarEnabled = false
-
-
- chartView.drawOrder = [DrawOrder.bar.rawValue,
- DrawOrder.bubble.rawValue,
- DrawOrder.candle.rawValue,
- DrawOrder.line.rawValue,
- DrawOrder.scatter.rawValue]
-
- let l = chartView.legend
- l.wordWrapEnabled = true
- l.horizontalAlignment = .center
- l.verticalAlignment = .bottom
- l.orientation = .horizontal
- l.drawInside = false
- // chartView.legend = l
- let rightAxis = chartView.rightAxis
- rightAxis.axisMinimum = 0
-
- let leftAxis = chartView.leftAxis
- leftAxis.axisMinimum = 0
-
- let xAxis = chartView.xAxis
- xAxis.labelPosition = .bothSided
- xAxis.axisMinimum = 0
- xAxis.granularity = 1
- xAxis.valueFormatter = self
-
- self.updateChartData()
- }
-
- override func updateChartData() {
- if self.shouldHideData {
- chartView.data = nil
- return
- }
-
- self.setChartData()
- }
-
- func setChartData() {
- let data = CombinedChartData()
- data.lineData = generateLineData()
- data.barData = generateBarData()
- data.bubbleData = generateBubbleData()
- data.scatterData = generateScatterData()
- data.candleData = generateCandleData()
-
- chartView.xAxis.axisMaximum = data.xMax + 0.25
-
- chartView.data = data
- }
-
- override func optionTapped(_ option: Option) {
- switch option {
- case .toggleLineValues:
- for set in chartView.data! {
- if let set = set as? LineChartDataSet {
- set.drawValuesEnabled = !set .drawValuesEnabled
-
- }
- }
- chartView.setNeedsDisplay()
-
- case .toggleBarValues:
- for set in chartView.data! {
- if let set = set as? BarChartDataSet {
- set.drawValuesEnabled = !set .drawValuesEnabled
- }
- }
- chartView.setNeedsDisplay()
-
- case .removeDataSet:
- let rnd = Int(arc4random_uniform(UInt32(chartView.data!.dataSetCount)))
- chartView.data?.removeDataSet(chartView.data![rnd])
- chartView.data?.notifyDataChanged()
- chartView.notifyDataSetChanged()
-
- default:
- super.handleOption(option, forChartView: chartView)
- }
- }
-
- func generateLineData() -> LineChartData {
- let entries = (0..<ITEM_COUNT).map { (i) -> ChartDataEntry in
- return ChartDataEntry(x: Double(i) + 0.5, y: Double(arc4random_uniform(15) + 5))
- }
-
- let set = LineChartDataSet(entries: entries, label: "Line DataSet")
- set.setColor(UIColor(red: 240/255, green: 238/255, blue: 70/255, alpha: 1))
- set.lineWidth = 2.5
- set.setCircleColor(UIColor(red: 240/255, green: 238/255, blue: 70/255, alpha: 1))
- set.circleRadius = 5
- set.circleHoleRadius = 2.5
- set.fillColor = UIColor(red: 240/255, green: 238/255, blue: 70/255, alpha: 1)
- set.mode = .cubicBezier
- set.drawValuesEnabled = true
- set.valueFont = .systemFont(ofSize: 10)
- set.valueTextColor = UIColor(red: 240/255, green: 238/255, blue: 70/255, alpha: 1)
-
- set.axisDependency = .left
-
- return LineChartData(dataSet: set)
- }
-
- func generateBarData() -> BarChartData {
- let entries1 = (0..<ITEM_COUNT).map { _ -> BarChartDataEntry in
- return BarChartDataEntry(x: 0, y: Double(arc4random_uniform(25) + 25))
- }
- let entries2 = (0..<ITEM_COUNT).map { _ -> BarChartDataEntry in
- return BarChartDataEntry(x: 0, yValues: [Double(arc4random_uniform(13) + 12), Double(arc4random_uniform(13) + 12)])
- }
-
- let set1 = BarChartDataSet(entries: entries1, label: "Bar 1")
- set1.setColor(UIColor(red: 60/255, green: 220/255, blue: 78/255, alpha: 1))
- set1.valueTextColor = UIColor(red: 60/255, green: 220/255, blue: 78/255, alpha: 1)
- set1.valueFont = .systemFont(ofSize: 10)
- set1.axisDependency = .left
-
- let set2 = BarChartDataSet(entries: entries2, label: "")
- set2.stackLabels = ["Stack 1", "Stack 2"]
- set2.colors = [UIColor(red: 61/255, green: 165/255, blue: 255/255, alpha: 1),
- UIColor(red: 23/255, green: 197/255, blue: 255/255, alpha: 1)
- ]
- set2.valueTextColor = UIColor(red: 61/255, green: 165/255, blue: 255/255, alpha: 1)
- set2.valueFont = .systemFont(ofSize: 10)
- set2.axisDependency = .left
-
- let groupSpace = 0.06
- let barSpace = 0.02 // x2 dataset
- let barWidth = 0.45 // x2 dataset
- // (0.45 + 0.02) * 2 + 0.06 = 1.00 -> interval per "group"
-
- let data: BarChartData = [set1, set2]
- data.barWidth = barWidth
-
- // make this BarData object grouped
- data.groupBars(fromX: 0, groupSpace: groupSpace, barSpace: barSpace)
-
- return data
- }
-
- func generateScatterData() -> ScatterChartData {
- let entries = stride(from: 0.0, to: Double(ITEM_COUNT), by: 0.5).map { (i) -> ChartDataEntry in
- return ChartDataEntry(x: i+0.25, y: Double(arc4random_uniform(10) + 55))
- }
-
- let set = ScatterChartDataSet(entries: entries, label: "Scatter DataSet")
- set.colors = ChartColorTemplates.material()
- set.scatterShapeSize = 4.5
- set.drawValuesEnabled = false
- set.valueFont = .systemFont(ofSize: 10)
-
- return ScatterChartData(dataSet: set)
- }
-
- func generateCandleData() -> CandleChartData {
- let entries = stride(from: 0, to: ITEM_COUNT, by: 2).map { (i) -> CandleChartDataEntry in
- return CandleChartDataEntry(x: Double(i+1), shadowH: 90, shadowL: 70, open: 85, close: 75)
- }
-
- let set = CandleChartDataSet(entries: entries, label: "Candle DataSet")
- set.setColor(UIColor(red: 80/255, green: 80/255, blue: 80/255, alpha: 1))
- set.decreasingColor = UIColor(red: 142/255, green: 150/255, blue: 175/255, alpha: 1)
- set.shadowColor = .darkGray
- set.valueFont = .systemFont(ofSize: 10)
- set.drawValuesEnabled = false
-
- return CandleChartData(dataSet: set)
- }
-
- func generateBubbleData() -> BubbleChartData {
- let entries = (0..<ITEM_COUNT).map { (i) -> BubbleChartDataEntry in
- return BubbleChartDataEntry(x: Double(i) + 0.5,
- y: Double(arc4random_uniform(10) + 105),
- size: CGFloat(arc4random_uniform(50) + 105))
- }
-
- let set = BubbleChartDataSet(entries: entries, label: "Bubble DataSet")
- set.setColors(ChartColorTemplates.vordiplom(), alpha: 1)
- set.valueTextColor = .white
- set.valueFont = .systemFont(ofSize: 10)
- set.drawValuesEnabled = true
-
- return BubbleChartData(dataSet: set)
- }
- }
- extension CombinedChartViewController: AxisValueFormatter {
- func stringForValue(_ value: Double, axis: AxisBase?) -> String {
- return months[Int(value) % months.count]
- }
- }
|