(Swift) 學習使用 Charts 產生 直方圖、折線圖、圓餅圖

目的:學習使用 Charts 套件繪製精美的表格

環境:OSX 13.2 + Xcode 11.3 + Charts 4.1.0

Charts Github

Charts 可透過兩種方式進行安裝

SPM (Swift Package Manager)

點選 Package Dependencies,再點選下方的 +

將上方的 Charts 的 Github 連結輸入到右上方,並在紅色框位置輸入 4.1.0 (若沒出現紅色框,可以在貼上 github 連結處再次按下 Enter ),最後按下 Add Package,再勾選 Charts 後,按下 Add Package 即可安裝

CocoaPods 安裝教學

透過 CocoaPods 進行安裝 Charts

打開終端機,並進入到你專案的位置

cd yourprojectpath

使用以下指令初始化 CocoaPods,下載後專案內會出現一個新的檔案 Podfile

pod init 

打開 Podfile ,並在 #Pods for Chart 下方,輸入以下代碼

pod 'Charts', '4.1.0'

保存後,在終端機執行以下指令,執行後專案會出現 Chart.xcworkspace

pod install 

執行 Chart.xcworkspace

BarChartView

在 ViewController 中新增一個 View,並將 View 的 Class 設為 BarChartView,最後再拉 @IBOutlet weak var myView: BarChartView!

再來 import Charts

...
import Charts

class ViewController: UIViewController {

@IBOutlet weak var myView: BarChartView!
...

BarChartView 四個步驟

  1. 產生 BarChartDataEntry
  2. 產生 BarChartDataSet
  3. 產生 BarChartData
  4. 利用 ChartsView 顯示 BarChartData

產生 BarChartDateEntry 還有數據

新增 Array : monthArray, temperatureArray, dataEntries

並將每筆資料變成 BarChartDataEntry 放入 dataEntries 中

import UIKit
import Charts

class ViewController: UIViewController {

...
var monthArray = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
var temperatureArray:[Double] = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ,30, 31]
var dataEntries: [BarChartDataEntry] = []


override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(BarChartDataEntry(x: Double(i), y: temperatureArray[i]))
}

}

產生 BarChartDataSet

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(BarChartDataEntry(x: Double(i), y: temperatureArray[i]))
}

// 產生 BarChartDataSet
let DataSet = BarChartDataSet(entries: dataEntries, label: "temperature")

}

產生 BarChartData

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(BarChartDataEntry(x: Double(i), y: temperatureArray[i]))
}

// 產生 BarChartDateSet
let DataSet = BarChartDataSet(entries: dataEntries, label: "temperature")

// 產生 Data
let Data = BarChartData(dataSet: DataSet)
}

利用 ChartsView 顯示 BarChartData

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(BarChartDataEntry(x: Double(i), y: temperatureArray[i]))
}

// 產生 BarChartDateSet
let DataSet = BarChartDataSet(entries: dataEntries, label: "temperature")

// 產生 Data
let Data = BarChartData(dataSet: DataSet)

// 利用 ChartsView 顯示 BarChartData
myView.data = Data

}

完成以上步驟即可顯示基本的直方圖

不過這時會發現,我們的月份沒有顯示,所以必須新增以下程式碼,將x方向的格式修改成我們設定的字串

class ViewController: UIViewController {
....


override func viewDidLoad() {
super.viewDidLoad()

...

// 利用 ChartsView 顯示 BarChartData
myView.data = Data
// 將 x 方向的格式修改成我們設定的字串
myView.xAxis.valueFormatter = IndexAxisValueFormatter(values: monthArray)

LineChartView

在 ViewController 中新增一個 View,並將 View 的 Class 設為 LineChartView,最後再拉 @IBOutlet weak var myView: LineChartView!

LineChartView 四個步驟

  1. 產生 ChartDataEntry
  2. 產生 LineChartDataSet
  3. 產生 LineChartData
  4. 利用 ChartsView 顯示 LineChartData

產生 ChartDataEntry 還有數據

新增 Array : monthArray, temperatureArray, dataEntries

並將每筆資料變成 ChartDataEntry 放入 dataEntries 中

import UIKit
import Charts

class ViewController: UIViewController {

...
var monthArray = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
var temperatureArray:[Double] = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ,30, 31]
var dataEntries: [ChartDataEntry] = []


override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(ChartDataEntry(x: Double(i), y: temperatureArray[i]))
}

}

產生 LineChartDataSet

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(ChartDataEntry(x: Double(i), y: temperatureArray[i]))
}

// 產生 LineChartDataSet
let DataSet = LineChartDataSet(entries: dataEntries, label: "temperature")

}

產生 LineChartData

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(ChartDataEntry(x: Double(i), y: temperatureArray[i]))
}

// 產生 LineChartDataSet
let DataSet = LineChartDataSet(entries: dataEntries, label: "temperature")

// 產生 Data
let Data = LineChartData(dataSet: DataSet)
}

利用 ChartsView 顯示 LineChartData

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(ChartDataEntry(x: Double(i), y: temperatureArray[i]))
}

// 產生 LineChartDataSet
let DataSet = LineChartDataSet(entries: dataEntries, label: "temperature")

// 產生 Data
let Data = LineChartData(dataSet: DataSet)

// 利用 ChartsView 顯示 BarChartData
myView.data = Data

// 將 x 方向的格式修改成我們設定的字串
myView.xAxis.valueFormatter = IndexAxisValueFormatter(values: monthArray)

}

PieChartView

在 ViewController 中新增一個 View,並將 View 的 Class 設為 PieChartView,最後再拉 @IBOutlet weak var myView: PieChartView!

PieChartView 四個步驟

  1. 產生 PieChartDataEntry
  2. 產生 PieChartDataSet
  3. 產生 PieChartData
  4. 利用 ChartsView 顯示 PieChartData

產生 PieChartDataEntry

新增 Array : monthArray, temperatureArray, dataEntries

並將每筆資料變成 PieChartDataEntry 放入 dataEntries 中

在 PieChartView 會使用以下的 PieChartDataEntry(value: Double, label: String?) 來產生 Enrty

  • value : 存放 temperatureArray 的數值
  • label : x 座標字串的資料
import UIKit
import Charts

class ViewController: UIViewController {

...
var monthArray = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
var temperatureArray:[Double] = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ,30, 31]
var dataEntries: [BarChartDataEntry] = []


override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(PieChartDataEntry(value: temperatureArray[i], label: monthArray[i])) }

}

產生 PieChartDataSet

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(PieChartDataEntry(value: temperatureArray[i], label: monthArray[i]))

}
// 產生 PieChartDataSet
let DataSet = PieChartDataSet(entries: dataEntries, label: "")

// 改變 chart 顏色
DataSet.colors = ChartColorTemplates.colorful()
}

產生 PieChartData

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(PieChartDataEntry(value: temperatureArray[i], label: monthArray[i]))

}
// 產生 PieChartDataSet
let DataSet = PieChartDataSet(entries: dataEntries, label: "")

// 改變 chart 顏色
DataSet.colors = ChartColorTemplates.colorful()

// 產生 Data
let Data = PieChartData(dataSet: DataSet)
}

利用 ChartsView 顯示 PieChartData

class ViewController: UIViewController {

...

override func viewDidLoad() {
super.viewDidLoad()

for i in 0..<monthArray.count {
dataEntries.append(PieChartDataEntry(value: temperatureArray[i], label: monthArray[i]))

}
// 產生 PieChartDataSet
let DataSet = PieChartDataSet(entries: dataEntries, label: "")

// 改變 chart 顏色
DataSet.colors = ChartColorTemplates.liberty()

// 產生 Data
let Data = PieChartData(dataSet: DataSet)

// 利用 ChartsView 顯示 BarChartData
myView.data = Data

}

更好的寫法


import UIKit
import Charts

class ThirdViewController: UIViewController {

@IBOutlet weak var myView: PieChartView!

var monthArray = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
var temperatureArray:[Double] = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ,30, 31]


override func viewDidLoad() {
super.viewDidLoad()

setChart(dataPoints: monthArray, values: temperatureArray)

}

func setChart(dataPoints: [String], values: [Double]) {
// 產生 PieChartDataEntry
var dataEntries: [PieChartDataEntry] = []

// 產生 PieChartDataEntry 每筆資料
for i in 0..<dataPoints.count {
dataEntries.append(PieChartDataEntry(value: values[i], label: dataPoints[i]))
}

// 產生 PieChartDataSet
let piechartdataset = PieChartDataSet(entries: dataEntries)

// 改變 chart 顏色
piechartdataset.colors = ChartColorTemplates.liberty()

// 產生 Data
let piechartdata = PieChartData(dataSet: piechartdataset)

// 利用 ChartsView 顯示 BarChartData
myView.data = piechartdata
}

以上就是簡易透過 Charts 套件產生 直方圖、折線圖、圓餅圖 的流程

GitHub

Charts 折線圖進階操作

Charts 直方圖進階操作

Charts 圓餅圖進階操作

--

--