LoginSignup
53
39

More than 3 years have passed since last update.

【Swift】Chartsでオシャレなグラフを描画してみる( 棒グラフ編 )

Last updated at Posted at 2020-01-16

はじめに

Chartsというライブラリはご存知でしょうか?
とても有名なライブラリで、iOSでグラフを描画しようと思ったことがある人なら聞いたことや使ったことがあると思います。

Chartsはグラフ自体を非常に細かくカスタマイズすることができる素晴らしいライブラリです✨
今回は忘備録も兼ねてChartsを使って今時でオシャレな棒グラフを作ってみたいと思います。

オシャレな棒グラフって?

普段実装ばかりでデザインのことには疎いので、
まずは今時でオシャレな棒グラフのデザインをDribbbleBehanceで調査してみました。
その結果以下のような棒グラフが流行っているような感じがしました。
Figmaでパパッと作ったので数値などは適当です。

Y軸の値表示なし Y軸の値表示あり
Bar chart ( disable grid ).png Bar chart ( enable grid ).png

ポイントをまとめるとこんな感じになりました。

  1. X軸の縦線は表示しない
  2. バーの右上と左上は角丸
  3. グラフの平均を表す線があって、点線で表示
  4. Y軸の値を他のラベルなどに表示する場合はグラフに表示しない

4は以下のようなUIの場合、グラフにはY軸の値を表示しない代わりに、グラフをタップするとグラフの上に表示されているラベルにY軸の値が表示されるようなイメージです。

スクリーンショット 2020-01-14 15.29.01.png

早速作っていきたいところですが、一点問題があります。

棒グラフの角丸はサポートされていない

現在、Chartsでは棒グラフの角丸はサポートされていません。
PRは存在しますが、色々問題があってマージされていない状態です。

さすがにフォークして直すのは時間がかかりそうだったので、角丸は省略したものを作成します。
個人的には角丸がなくても結構それっぽくなるので、これはこれでありだと思っています。

実際に作ってみる

それでは実際に作っていきます。

Chartsのインストール

ChartsはCocoaPodsとCarthageに対応しています。
自分はCarthageでインストールしました。詳しくは公式のCarthage Installを参考にしてください。

BarChartViewを追加する

Chartsのグラフを描画するChartViewInterface Builderに対応しているのでStoryboardから追加することができます。

今回は棒グラフを描画したいので一枚UIViewを用意して、Custom ClassBarChartViewModuleChartsを設定します。

スクリーンショット 2020-01-15 16.12.09.png

あとはいつも通りViewControllerにOutlet接続すればコードでいじれるようになります。

import UIKit
import Charts

class ViewController: UIViewController {

    @IBOutlet weak var barChartView: BarChartView!

    // ...
}

グラフに表示するデータについて

Chartsでは表示するデータをChartDataに変換する必要があります。
変換したChartDataChartViewのもつdataプロパティにセットすることでデータが描画されます。
以下では適当なIntの配列をBarChartDataに変換してグラフに表示しています。

let rawData: [Int] = [20, 50, 70, 30, 60, 90, 40]
let entries = rawData.enumerated().map { BarChartDataEntry(x: Double($0.offset), y: Double($0.element)) }
let dataSet = BarChartDataSet(entries: entries)
let data = BarChartData(dataSet: dataSet)
barChartView.data = data

デフォルトの状態でこれを表示するとこんな感じになります。

デフォルト
スクリーンショット 2020-01-15 16.26.26.png

X座標軸の設定

X座標軸関連の設定はxAxisプロパティに対して設定します。
デフォルトの状態では余分な線などが表示されていたりするので、X軸のラベルの位置、軸の線の表示、グリッドの非表示を行っています。

// X軸のラベルの位置を下に設定
barChartView.xAxis.labelPosition = .bottom
// X軸のラベルの色を設定
barChartView.xAxis.labelTextColor = .systemGray
// X軸の線、グリッドを非表示にする
barChartView.xAxis.drawGridLinesEnabled = false
barChartView.xAxis.drawAxisLineEnabled = false

右側のY座標軸の設定

Y座標軸は左右それぞれ設定することができます。
右側のY座標軸関連の設定はrightAxisプロパティに設定します。
今回は右側のY座標軸は表示しないので無効にします。

// 右側のY座標軸は非表示にする
barChartView.rightAxis.enabled = false

左側のY座標軸の設定

左側のY座標軸関連の設定はleftAxisプロパティに設定します。
ここはY軸の値を表示するかしないかで変わってきますが、とりあえずY軸の値を表示したパターンを作成します。

デフォルトではY座標の最小値がグラフに表示しているデータによって決定されてしまうので、axisMinimumに0を設定して0始まりになるように設定したり、ラベルの色や数、グリッドや軸線の表示に関する設定をしています。

// Y座標の値が0始まりになるように設定
barChartView.leftAxis.axisMinimum = 0.0
barChartView.leftAxis.drawZeroLineEnabled = true
barChartView.leftAxis.zeroLineColor = .systemGray
// ラベルの数を設定
barChartView.leftAxis.labelCount = 5
// ラベルの色を設定
barChartView.leftAxis.labelTextColor = .systemGray
// グリッドの色を設定
barChartView.leftAxis.gridColor = .systemGray
// 軸線は非表示にする
barChartView.leftAxis.drawAxisLineEnabled = false

凡例の設定

デフォルトではグラフの凡例が表示されているので非表示にします。

barChartView.legend.enabled = false

平均の線の設定

平均の線はLimitLineを使って表示します。
以下では線の色と点線の設定を行っています。lineDashLengthsは複数の値を入れることで不規則な形の点線を作ることも可能です。

let avg = rawData.reduce(0) { return $0 + $1 } / rawData.count
let limitLine = ChartLimitLine(limit: Double(avg))
limitLine.lineColor = .systemOrange
limitLine.lineDashLengths = [4]
barChartView.leftAxis.addLimitLine(limitLine)

LimitLineleftAxisもしくはrightAxisに対して追加するので、追加する対象のenablefalseになっていると表示されないので注意してください。

ここまでで以下のような見た目になりました。だいぶそれっぽくなったと思います。

デフォルト 設定後
スクリーンショット 2020-01-15 16.26.26.png スクリーンショット 2020-01-16 10.04.58.png

棒グラフの色と値の表示の設定

最後に棒グラフの色とグラフの上に値が表示しないように設定します。
これらの設定はChartDataSetに対して設定します。

let dataSet = BarChartDataSet(entries: entries)
dataSet.drawValuesEnabled = false
dataSet.colors = [.systemBlue]

以上で完成です。
最終的にこんな感じになりました。

デフォルト 完成形
スクリーンショット 2020-01-15 16.26.26.png スクリーンショット 2020-01-16 10.26.29.png

さいごに

Chartsで今時でオシャレな棒グラフを作ってみましたがいかがだったでしょうか?
他にもグラフをアニメーションさせたり、ハイライトした時にマーカーを表示できたり、X軸のラベルの表示をカスタマイズできるなど、まだまだカスタマイズできるので気になった方はぜひ試してみてください。公式のサンプルで一通り使い方はマスターできると思います。

また、今回作ったグラフはサンプルとしてQiitaChartsSampleにあげてあるので、よければ参考にしてください。

分かりにくい部分や間違いがあれば指摘していただけると嬉しいです🙇‍♂️
最後まで読んでいただきありがとうございました。

53
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
39