iOS-Chartsの始め方

ios-chartsについて自分の覚え書き程度に書き留めておきます。
#iOS-Chartsの特徴
グラフ表示のライブラリ色々あるっぽいけど、簡単に色鮮やかなグラフを作れるのが特徴みたい。
元々はMPAndoroidChartってアンドロイドのライブラリをiOSで起動できるようにしたものらしい。

GitHub
https://github.com/danielgindi/Charts
導入とかどんなグラフが作れるとかわかるサイト
https://qiita.com/touyu/items/4fbd6d8187eb74752ba0
英語だけどiso-chartsのデモを載せてくれているところ
https://www.appcoda.com/ios-charts-api-tutorial/

#大体インストールまで
ここではiOS-Chartsを使えるようになるまでを書いておきます。なので飛ばしても大丈夫です。

##Xcodeのインストール
iOSのアプリ開発はXcodeが必要になるから、インストール。ここの話は他のサイト見た方が早いと思うから省略します。

一応、インストール方法が載っているリンクを貼っておきます。
https://i-app-tec.com/ios/xcode-install.html

##cocoapodsのインストール
iOS-Chartsはライブラリなので、ライブラリを導入する時にあったら便利なcocoapodsのインストールをしていきます。
Finderを開いて、アプリケーション、ユーティリティと開いて、ターミナルを開く。
開いたら、
`sudo gem install cocoapods`
と入力してenter。

インストールが終わったら、
`pod setup`
でenter。

これでcocoapodsのインストールが終了。
cocoapodsを使うのはXcodeでプロジェクトを作った時なのでまだ無し。

参考：
https://ameblo.jp/softwaredeveloper/entry-11837288875.html
cocoapodsのサイト
https://cocoapods.org/?q=charts

#グラフ作成

##プロジェクト作成
まずは、アプリ開発の土台になるプロジェクトの作成をしていきます。

インストールしたXcodeを開く。
create a new Xcode projectをクリックして、新しいプロジェクトを作成する。
![スクリーンショット 2018-01-17 17.38.51.png](https://qiita-image-store.s3.amazonaws.com/0/231811/bd001858-d6c0-6d6b-6bdb-c8a3c4ae5817.png)


そんなに考えずにSingle View Appを選ぶ。
色々あるらしいから後でちゃんと調べた方がいいよ！
![スクリーンショット 2018-01-17 17.41.02.png](https://qiita-image-store.s3.amazonaws.com/0/231811/4428b49d-f1dc-e176-056c-8389514a4b66.png)

Project Nameやらなんやら書いて、保存する場所を決めて、保存。
**もし、配信やらなんやらするんだったらここはちゃんと調べとかないとやばいから気をつけてね！**
![スクリーンショット 2018-01-17 17.43.42.png](https://qiita-image-store.s3.amazonaws.com/0/231811/9d5126cd-7eb1-a93e-c2fb-803b7665ba61.png)


今回はProjectNameはsampleでやります。

##iOS-Chartsライブラリの導入

ライブラリの導入はプロジェクトを開いていると出来ない時があるみたいなので、一応Xcodeを閉じておく。

ターミナルを起動して、プロジェクトを保存した場所まで移動する。（大体cdでフォルダ移動、lsでフォルダの中身を見る。詳しいことは調べた方が早い。）

〜なんちゃら〜.xcodeprojがあるところ移動できたら
`pod init`
でenter

そしたら新しく、Podfileってファイルが作られてる。
![スクリーンショット 2018-01-19 17.58.22.png](https://qiita-image-store.s3.amazonaws.com/0/231811/fd7f8b1a-0672-4cc0-b246-467064da5d9e.png)


Finderから辿って開いてみると、こんなメモ帳みたいなのが出てくる。
![スクリーンショット 2018-01-19 17.58.59.png](https://qiita-image-store.s3.amazonaws.com/0/231811/f8acc064-8a52-f7fd-366c-d135c93f0d5a.png)


見つけたら、cocoapodsでインストールしたいライブラリを調べて、出てきたページ
https://cocoapods.org/?q=charts
の中にある、Installation Guideっていうのをクリックしたらこんなの出てくる。
![スクリーンショット 2018-01-17 18.09.29.png](https://qiita-image-store.s3.amazonaws.com/0/231811/563eec42-4955-6a9f-e8e1-c4242a7d1f74.png)
この説明に従って、targetとendの間に
`pod 'Charts', '~> 3.0'`
入れる！

![スクリーンショット 2018-01-19 18.00.01.png](https://qiita-image-store.s3.amazonaws.com/0/231811/5b6e0966-2a67-cafe-aab7-5c8e04b15070.png)

そのまま保存して閉じる。

ターミナルでプロジェクトのpodfileがあるところで、
`pod install`
と入力してenter
緑の文字とか出てきて、終わった感じがあったら、lsコマンドで.xcworkspaceのファイルがあったら成功！
ライブラリ導入おしまい！
グラフが書けるよ！

##インポート設定まで
Finderでpod installで作った.xcworkspaceを開いて、
![スクリーンショット 2018-01-19 18.04.40.png](https://qiita-image-store.s3.amazonaws.com/0/231811/e082c250-b38e-f3e5-3710-c6dae4c1c1f1.png)

左側にあるプロジェクト名の青いファイルやらを開いてこんな感じにする。
![スクリーンショット 2018-01-19 18.05.09.png](https://qiita-image-store.s3.amazonaws.com/0/231811/bce16742-8e6f-db9a-e74b-a75f84067edc.png)



青いファイルすら出てこなかったら、右上のここで左のファイル選択の画面を出せる。（ここの説明は省く。）
![スクリーンショット 2018-01-17 18.39.50.png](https://qiita-image-store.s3.amazonaws.com/0/231811/3eb005a1-0c60-6e99-6e23-8eee3bb0914c.png)

とりあえずビルドして失敗したら、ターミナルに戻ってpod installしたところで、
`pod update`
入力でenterしたら、ビルドでできるようになってるかも。

ビルド成功したら、左にある、ViewController.swiftをクリックして、

`import charts`
を
`import UIKit`
の下に入れる。

これでインポートが終了。

##プログラム
ここから本題みたいなものですね。
棒グラフとか、線グラフ、バブルチャートがいっぺんに使えるよーって言ってるのでコンビネーションチャートっていうのを作っていきます。

まず１本の線グラフを作る。

```swift:ViewController.swift
import UIKit
import Charts

class ViewController: UIViewController {

    var chart: CombinedChartView!
    var lineDataSet: LineChartDataSet!
    var bubbleDataSet: BubbleChartDataSet!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //combinedDataを結合グラフに設定する
        let combinedData = CombinedChartData()
        
        //結合グラフに線グラフのデータ読み出し
        combinedData.lineData = generateLineData()
        
        //グラフのサイズ設定、座標設定
        chart = CombinedChartView(frame: CGRect(x: 0, y: 20, width: self.view.frame.width , height: self.view.frame.height - 20))
        
        //chartのデータにcombinedDataを挿入する
        chart.data = combinedData
        
        //chartを出力
        self.view.addSubview(chart)
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func generateLineData() -> LineChartData
    {
        
        //リストを作り、グラフのデータを追加する方法（GitHubにあったCombinedChartViewとかMPAndroidChartのwikiを参考にしている
        //データを入れていく、多重配列ではないため別々にデータは追加していく
        let values: [Double] = [0, 254, 321, 512, 214, 444, 967, 101, 765, 228,
                                726, 253, 20, 123, 512, 448, 557, 223, 465, 291,
                                979, 134, 864, 481, 405, 711, 1106, 411, 455, 761]
        let date : [Double] = [1,2,3,4,5,6,7,8,9,10,
                               11,12,13,14,15,16,17,18,19,20,
                               21,22,23,24,25,26,27,28,29,30]
        
        //DataSetを行うために必要なEntryの変数を作る　データによって入れるデータが違うため複数のentriesが必要になる？
        var entries: [ChartDataEntry] = Array()
        for (i, value) in values.enumerated(){
            entries.append(ChartDataEntry(x: date[i], y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil)))
        }
        
        //データを送るためのDataSet変数をリストで作る
        var linedata:  [LineChartDataSet] = Array()
        
        //リストにデータを入れるためにデータを成形している
        //データの数値と名前を決める
        lineDataSet = LineChartDataSet(values: entries, label: "Line chart unit test data")
        lineDataSet.drawIconsEnabled = false
        //グラフの線の色とマルの色を変えている
        lineDataSet.colors = [NSUIColor.red]
        lineDataSet.circleColors = [NSUIColor.red]
        //上で作ったデータをリストにappendで入れる
        linedata.append(lineDataSet)
        
        //データを返す。
        return LineChartData(dataSets: linedata)
    }

}
```

これでこんなグラフが作れるよ
![スクリーンショット 2018-01-20 16.02.10.png](https://qiita-image-store.s3.amazonaws.com/0/231811/16790c35-c32f-53e0-dc59-f54659c49721.png)

次は２本で作る。多重配列にデータを入れる方法とリストにデータを入れてやる方法があると思うけど本質は同じだし、リストに入れて２本分ループさせる方法を紹介します。

```swift:ViewController.swift
import UIKit
import Charts
 
class ViewController: UIViewController {
 
    var chart: CombinedChartView!
    var lineDataSet: LineChartDataSet!
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        //combinedDataを結合グラフに設定する
        let combinedData = CombinedChartData()
 
        //結合グラフに線グラフのデータ読み出し
        combinedData.lineData = generateLineData()
        
        //グラフのサイズ設定、座標設定
        chart = CombinedChartView(frame: CGRect(x: 0, y: 20, width: self.view.frame.width , height:         self.view.frame.height - 20))
 
        //chartのデータにcombinedDataを挿入する
        chart.data = combinedData
 
        //chartを出力
        self.view.addSubview(chart)
 
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
 
 
    func generateLineData() -> LineChartData
    {
 
        //リストを作り、グラフのデータを追加する方法（GitHubにあったCombinedChartViewとかMPAndroidChartのwikiを参考にしている
        let values: [Double] = [0, 254, 321, 512, 214, 444, 967, 101, 765, 228,
                                726, 253, 20, 123, 512, 448, 557, 223, 465, 291,
                                979, 134, 864, 481, 405, 711, 1106, 411, 455, 761]
        let values2: [Double] = [201,220,203,420,520,620,720,820,920,200,
                                201,220,203,420,520,657,757,857,579,570,
                                571,572,573,574,575,576,577,578,579,571]
        let date : [Double] = [1,2,3,4,5,6,7,8,9,10,
                               11,12,13,14,15,16,17,18,19,20,
                               21,22,23,24,25,26,27,28,29,30]
        let date2 : [Double] = [1,5,3,7,9,14,16,17,18,20,
                                21,24,25,26,27,28,29,30,32,36,
                                40,41,42,43,44,45,46,47,48,49]
    
    
        //DataSetを行うために必要なEntryの変数を作る　データによって入れるデータが違うため複数のentriesが必要になる？
        //多分、データ毎にappendまでをしていくことによってentriesを少なくすることはできると思う
        var entries: [ChartDataEntry] = Array()
        for (i, value) in values.enumerated(){
            entries.append(ChartDataEntry(x: date[i], y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil)))
        }
        var entries2: [ChartDataEntry] = Array()
        for (i, value) in values2.enumerated(){
            entries2.append(ChartDataEntry(x: date2[i], y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil)))
        }
        
        //データを送るためのDataSet変数をリストで作る
        var linedata:  [LineChartDataSet] = Array()
        
        //リストにデータを入れるためにデータを成形している
        //データの数値と名前を決める
        lineDataSet = LineChartDataSet(values: entries, label: "Line chart unit test data")
        lineDataSet.drawIconsEnabled = false
        //グラフの線の色とマルの色を変えている
        lineDataSet.colors = [NSUIColor.red]
        lineDataSet.circleColors = [NSUIColor.red]
        //上で作ったデータをリストにappendで入れる
        linedata.append(lineDataSet)
        
        //上に同じ
        lineDataSet = LineChartDataSet(values: entries2, label: "test data2")
        lineDataSet.drawIconsEnabled = false
        lineDataSet.colors = [NSUIColor.blue]
        lineDataSet.circleColors = [NSUIColor.blue]
        linedata.append(lineDataSet)
        
        
        //データを返す。今回のデータは複数なのでdataSetsになる
        return LineChartData(dataSets: linedata)
     }
    
}
```

これでこんなのができるよ
![スクリーンショット 2018-01-20 16.15.38.png](https://qiita-image-store.s3.amazonaws.com/0/231811/7e12194b-740c-4f3c-220e-fc7e618b9cd8.png)

最後にバブルチャートを追加していくよ

```swift:ViewController.swift
import UIKit
import Charts
 
class ViewController: UIViewController {
 
    var chart: CombinedChartView!
    var lineDataSet: LineChartDataSet!
    var bubbleDataSet: BubbleChartDataSet!
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        //combinedDataを結合グラフに設定する
        let combinedData = CombinedChartData()
 
        //結合グラフに線グラフのデータ読み出し
        combinedData.lineData = generateLineData()
 
        //結合グラフにバブルグラフのデータを読み出し
        combinedData.bubbleData = generateBubbleData()
        
        //グラフのサイズ設定、座標設定
        chart = CombinedChartView(frame: CGRect(x: 0, y: 20, width: self.view.frame.width , height:         self.view.frame.height - 20))
 
        //chartのデータにcombinedDataを挿入する
        chart.data = combinedData
 
        //chartを出力
        self.view.addSubview(chart)
 
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
 
 
    func generateLineData() -> LineChartData
    {
 
        //リストを作り、グラフのデータを追加する方法（GitHubにあったCombinedChartViewとかMPAndroidChartのwikiを参考にしている
        let values: [Double] = [0, 254, 321, 512, 214, 444, 967, 101, 765, 228,
                                726, 253, 20, 123, 512, 448, 557, 223, 465, 291,
                                979, 134, 864, 481, 405, 711, 1106, 411, 455, 761]
        let values2: [Double] = [201,220,203,420,520,620,720,820,920,200,
                                201,220,203,420,520,657,757,857,579,570,
                                571,572,573,574,575,576,577,578,579,571]
        let date : [Double] = [1,2,3,4,5,6,7,8,9,10,
                               11,12,13,14,15,16,17,18,19,20,
                               21,22,23,24,25,26,27,28,29,30]
        let date2 : [Double] = [1,5,3,7,9,14,16,17,18,20,
                                21,24,25,26,27,28,29,30,32,36,
                                40,41,42,43,44,45,46,47,48,49]
    
    
        //DataSetを行うために必要なEntryの変数を作る　データによって入れるデータが違うため複数のentriesが必要になる？
        //多分、データ毎にappendまでをしていくことによってentriesを少なくすることはできると思う
        var entries: [ChartDataEntry] = Array()
        for (i, value) in values.enumerated(){
            entries.append(ChartDataEntry(x: date[i], y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil)))
        }
        var entries2: [ChartDataEntry] = Array()
        for (i, value) in values2.enumerated(){
            entries2.append(ChartDataEntry(x: date2[i], y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil)))
        }
        
        //データを送るためのDataSet変数をリストで作る
        var linedata:  [LineChartDataSet] = Array()
        
        //リストにデータを入れるためにデータを成形している
        //データの数値と名前を決める
        lineDataSet = LineChartDataSet(values: entries, label: "Line chart unit test data")
        lineDataSet.drawIconsEnabled = false
        //グラフの線の色とマルの色を変えている
        lineDataSet.colors = [NSUIColor.red]
        lineDataSet.circleColors = [NSUIColor.red]
        //上で作ったデータをリストにappendで入れる
        linedata.append(lineDataSet)
        
        //上に同じ
        lineDataSet = LineChartDataSet(values: entries2, label: "test data2")
        lineDataSet.drawIconsEnabled = false
        lineDataSet.colors = [NSUIColor.blue]
        lineDataSet.circleColors = [NSUIColor.blue]
        linedata.append(lineDataSet)
        
        
        //データを返す。今回のデータは複数なのでdataSetsになる
        return LineChartData(dataSets: linedata)
     }
    
    //バブルチャートの描画
    func generateBubbleData() -> BubbleChartData
    {
        //データ設定
        let values: [Double] = [0, 24, 221, 52, 21, 44, 97, 11, 76, 28,
                                76, 53, 20, 13, 51, 482, 57, 22, 65, 21,
                                79, 324, 86, 48, 25, 11, 16, 41, 55, 71]
        let values1: [Double] = [221,225,263,720,120,520,120,220,420,100,
                                 101,250,223,820,420,857,257,257,879,270,
                                 275,552,273,374,275,376,477,878,279,1]
        
        //線グラフと同じ構成をしているため同じ様な文
        //線グラフではしていないリストの初期化をすることでentriesの数を減らした
        var entries: [ChartDataEntry] = Array()
        var setData: [BubbleChartDataSet] = Array()
        
        //valuesの中身がなくなるまで回り続ける( enumerated() )
        for (i, value) in values.enumerated()
        {
            //BubblwChartDataEntryの中身は、(x,y,size)の三つを設定する必要がある
            entries.append(BubbleChartDataEntry(x: Double(i), y: value, size: CGFloat(values1[i]) ))
            
        }
        
        //データの中身とラベルの設定
        bubbleDataSet = BubbleChartDataSet(values: entries, label: "bubble")
        //色の設定
        bubbleDataSet.colors = [NSUIColor.yellow]
        //上で作ったデータを
        setData.append(bubbleDataSet)
        
        //リストを一度初期化するともう一度使える
        entries.removeAll()
        
        //上に同じ、データは適当に変える
        for (i, value) in values1.enumerated()
        {
            entries.append(BubbleChartDataEntry(x: Double(i), y: value, size: CGFloat(values[i]) ))
            
        }
        bubbleDataSet = BubbleChartDataSet(values: entries, label: "bubble2")
        bubbleDataSet.colors = [NSUIColor.green]
        setData.append(bubbleDataSet)
        
        //一つだけのデータを表示させたいならこっちでもいい（複数のデータ表示ができない）
        //return BubbleChartData(dataSet: bubbleDataSet)
        
        //複数のデータを表示させるためにdataSetsにしている
        return BubbleChartData(dataSets: setData)
        
    }
    
}
```

そしてこんな感じ
![スクリーンショット 2018-01-20 16.26.01.png](https://qiita-image-store.s3.amazonaws.com/0/231811/5697a842-0550-297f-fcfc-66e5e890a886.png)

以上！
正直バブルチャートと線グラフなんて用途が限られてると思うけど、だからこそ説明がないと思って紹介していきました。

#最後に
gitHubでios-chartsのdemoがあるのでそっちの起動の方法を紹介して終わりますね
chartsのdemoが入っているとこの右側にdownloadとか書いてるところクリックして、ダウンロードする。
https://github.com/danielgindi/Charts
![スクリーンショット 2018-01-20 16.32.15.png](https://qiita-image-store.s3.amazonaws.com/0/231811/ff11cc26-b4c3-5ccc-b05c-622499af7ff2.png)

ChartsDemo開く、ChartsDemo.xcodeprojを開く(なんか言われるけどopenで)
![スクリーンショット 2018-01-20 16.36.55.png](https://qiita-image-store.s3.amazonaws.com/0/231811/460e5ca7-a276-6c99-1005-d5e1a96f74e8.png)

開いたらこんな感じだと思う
![スクリーンショット 2018-01-20 16.38.59.png](https://qiita-image-store.s3.amazonaws.com/0/231811/4ace9542-b50c-f28f-b4d1-448f6edcc6ac.png)
ChartsDemo見たい時は工具箱みたいなところをクリックして、ChartsDemoにして実行(これしないとビルド成功って出るだけでなにも出てこない)
![スクリーンショット 2018-01-20 16.39.19.png](https://qiita-image-store.s3.amazonaws.com/0/231811/5283963c-87ef-2d84-56bf-d1d647828ba7.png)
実行できた！
![スクリーンショット 2018-01-20 16.43.26.png](https://qiita-image-store.s3.amazonaws.com/0/231811/2719bf17-bdc4-4e27-de48-89e33c85d963.png)

もし良さそうなグラフとかあったら、プログラムあるはずだから見たら作りたいグラフへの近道かも