chartsでプロットを識別
import UIKit
import Charts
class ViewController: UIViewController , ChartViewDelegate{
@IBOutlet weak var lineChartView: LineChartView!
// モック用データ
let rawDataGraph: [Int] = [20,24,21,25,26,30,31,20]
override func viewDidLoad() {
super.viewDidLoad()
// Chart dataSet準備
let entries = rawDataGraph.enumerated().map { ChartDataEntry(x: Double($0.offset), y: Double($0.element)) }
let dataSet = LineChartDataSet(entries: entries)
// 線の太さ
dataSet.lineWidth = 5
// 各プロットのラベル表示
dataSet.drawValuesEnabled = true
// 各プロットの丸表示
dataSet.drawCirclesEnabled = true
// 各プロットの丸の大きさ
dataSet.circleRadius = 4
// 各プロットの丸の色
dataSet.circleColors = [UIColor.lightGray]
// 作成したデータセットをLineChartViewに追加
lineChartView.data = LineChartData(dataSet: dataSet)
// X軸のラベルの位置を下に設定
lineChartView.xAxis.labelPosition = .bottom
// X軸のラベルの色を設定
lineChartView.xAxis.labelTextColor = .systemGray
// X軸の線、グリッドを非表示にする
lineChartView.xAxis.drawGridLinesEnabled = false
lineChartView.xAxis.drawAxisLineEnabled = false
// 右側のY座標軸は非表示にする
lineChartView.rightAxis.enabled = false
// Y座標の値が0始まりになるように設定
lineChartView.leftAxis.axisMinimum = 0.0
lineChartView.leftAxis.axisMaximum = 40.0
lineChartView.leftAxis.drawZeroLineEnabled = true
lineChartView.leftAxis.zeroLineColor = .systemGray
// グラフに境界線(横)を追加
let limitLine = ChartLimitLine(limit: 00, label: "AAAAA")
limitLine.lineColor = .darkGray
limitLine.valueTextColor = .darkGray
lineChartView.leftAxis.addLimitLine(limitLine)
// グラフに境界線(縦)を追加
let limitLineX = ChartLimitLine(limit: 0, label: "BBBBB")
limitLineX.lineColor = .darkGray
limitLineX.valueTextColor = .darkGray
lineChartView.xAxis.addLimitLine(limitLineX)
// ラベルの数を設定
lineChartView.leftAxis.labelCount = 5
// ラベルの色を設定
lineChartView.leftAxis.labelTextColor = .systemGray
// グリッドの色を設定
lineChartView.leftAxis.gridColor = .systemGray
// 軸線は非表示にする
lineChartView.leftAxis.drawAxisLineEnabled = false
// 凡例を非表示
lineChartView.legend.enabled = false
// タップでプロットを選択できないようにする
lineChartView.highlightPerTapEnabled = true
// ピンチズームオフ
lineChartView.pinchZoomEnabled = true
// ダブルタップズームオフ
lineChartView.doubleTapToZoomEnabled = true
// アニメーションをつける
lineChartView.animate(xAxisDuration: 1.0, yAxisDuration: 1.3, easingOption: .easeInCubic)
lineChartView.delegate = self
}
func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
let xValue = entry.x
let yValue = entry.y
// 特定のX座標とY座標を使ってプロットを識別
if xValue == 2.0 {
print("特定のプロットがタップされました")
// ここで特定のプロットをタップしたときの処理を記述
}
}
}
Y軸時系列データ
import UIKit
import Charts
class ViewController: UIViewController {
@IBOutlet weak var lineChartView: LineChartView!
override func viewDidLoad() {
super.viewDidLoad()
// JSONデータの例: { "time": ["10:00", "11:00", "12:00"], "temperature": [25.5, 26.0, 27.3] }
let json = """
{
"time": ["10:00", "11:00", "12:00"],
"temperature": [25.5, 26.0, 27.3]
}
"""
// JSONデータをデコードして構造体にマッピング
struct ChartData: Decodable {
let time: [String]
let temperature: [Double]
}
do {
let jsonData = json.data(using: .utf8)!
let chartData = try JSONDecoder().decode(ChartData.self, from: jsonData)
var dataEntries: [ChartDataEntry] = []
for i in 0..<chartData.time.count {
// 時間データをFloatの時刻(時と分)に変換
let timeComponents = chartData.time[i].split(separator: ":")
let hour = Double(timeComponents[0]) ?? 0.0
let minute = Double(timeComponents[1]) ?? 0.0
let timeInFloat = hour + (minute / 60.0)
let dataEntry = ChartDataEntry(x: timeInFloat, y: chartData.temperature[i])
dataEntries.append(dataEntry)
}
let dataSet = LineChartDataSet(entries: dataEntries, label: "Temperature")
let data = LineChartData(dataSet: dataSet)
lineChartView.data = data
} catch {
print("Error decoding JSON: \(error)")
}
}
}
import UIKit
import Charts
class ViewController: UIViewController {
@IBOutlet weak var lineChartView: LineChartView!
override func viewDidLoad() {
super.viewDidLoad()
// JSONデータの例: { "time": ["10:00", "11:00", "12:00"], "temperature": [25.5, 26.0, 27.3] }
let json = """
{
"time": ["10:00", "11:00", "12:00"],
"temperature": [25.5, 26.0, 27.3]
}
"""
// JSONデータをデコードして構造体にマッピング
struct ChartData: Decodable {
let time: [String]
let temperature: [Double]
}
do {
// JSONデータをバイトデータに変換
let jsonData = json.data(using: .utf8)!
// JSONデータを構造体にデコード
let chartData = try JSONDecoder().decode(ChartData.self, from: jsonData)
// チャートに追加するデータエントリの配列
var dataEntries: [ChartDataEntry] = []
// ループでJSONデータを取得してデータエントリを作成
for i in 0..<chartData.time.count {
// 時間データをFloatの時刻(時と分)に変換
let timeComponents = chartData.time[i].split(separator: ":")
let hour = Double(timeComponents[0]) ?? 0.0
let minute = Double(timeComponents[1]) ?? 0.0
let timeInFloat = hour + (minute / 60.0)
// データエントリを作成して配列に追加
let dataEntry = ChartDataEntry(x: timeInFloat, y: chartData.temperature[i])
dataEntries.append(dataEntry)
}
// チャートのデータセットとラベルを作成
let dataSet = LineChartDataSet(entries: dataEntries, label: "Temperature")
let data = LineChartData(dataSet: dataSet)
// チャートにデータをセット
lineChartView.data = data
} catch {
print("Error decoding JSON: \(error)")
}
}
}
2つのデータ
class ViewController: UIViewController {
@IBOutlet weak var chartView1: LineChartView!
@IBOutlet weak var chartView2: LineChartView!
override func viewDidLoad() {
super.viewDidLoad()
// データの用意
let dataEntries1: [ChartDataEntry] = [
ChartDataEntry(x: 1.0, y: 10.0),
ChartDataEntry(x: 2.0, y: 20.0),
ChartDataEntry(x: 3.0, y: 15.0),
]
let dataEntries2: [ChartDataEntry] = [
ChartDataEntry(x: 1.0, y: 5.0),
ChartDataEntry(x: 2.0, y: 25.0),
ChartDataEntry(x: 3.0, y: 12.0),
]
// データセットの作成
let dataSet1 = LineChartDataSet(entries: dataEntries1, label: "Dataset 1")
let dataSet2 = LineChartDataSet(entries: dataEntries2, label: "Dataset 2")
// グラフにデータセットを設定
chartView1.data = LineChartData(dataSet: dataSet1)
chartView2.data = LineChartData(dataSet: dataSet2)
}
}
class ViewController: UIViewController {
@IBOutlet weak var chartView1: LineChartView!
@IBOutlet weak var chartView2: LineChartView!
override func viewDidLoad() {
super.viewDidLoad()
// データの用意
let dataEntries1: [ChartDataEntry] = [
ChartDataEntry(x: 1.0, y: 10.0),
ChartDataEntry(x: 2.0, y: 20.0),
ChartDataEntry(x: 3.0, y: 15.0),
]
let dataEntries2: [ChartDataEntry] = [
ChartDataEntry(x: 1.0, y: 5.0),
ChartDataEntry(x: 2.0, y: 25.0),
ChartDataEntry(x: 3.0, y: 12.0),
]
// データセットの作成
let dataSet1 = LineChartDataSet(entries: dataEntries1, label: "Dataset 1")
let dataSet2 = LineChartDataSet(entries: dataEntries2, label: "Dataset 2")
// グラフにデータセットを設定
chartView1.data = LineChartData(dataSet: dataSet1)
chartView2.data = LineChartData(dataSet: dataSet2)
}
}
@IBOutlet プロパティ:
chartView1 と chartView2 は、Storyboard上に配置された LineChartView と接続されたプロパティです。これにより、コード内でこれらのグラフビューを制御できます。
viewDidLoad メソッド:
画面が読み込まれる際に実行されるメソッドです。ここで、データの用意やグラフの設定を行います。
データの用意:
dataEntries1 と dataEntries2 には、各データポイントの x 座標と y 座標を指定しています。例えば、(x: 1.0, y: 10.0) は x 座標が 1.0 で y 座標が 10.0 というデータポイントを示しています。
データセットの作成:
LineChartDataSet は、データポイントの集まりであるデータセットを作成します。entries パラメータには、先ほど用意したデータポイントの配列を指定します。label パラメータは、グラフの凡例(ラベル)に表示されるテキストを指定します。
グラフにデータセットを設定:
LineChartData クラスにデータセットを渡して、グラフのデータを設定します。chartView1.data と chartView2.data にそれぞれのデータを設定しています。
これにより、2つの折れ線グラフが画面上に表示され、それぞれのグラフにデータが表示されるようになります。必要に応じて、色や線のスタイル、軸ラベルなどをカスタマイズすることもできます。