【Swift-Realm・Charts】グラフのX軸が1日ずつずれた日付になるようにしたい

実現したいこと

Chartsを利用して、Realmに保存されたデータを元にグラフを描画するアプリを作っています。
X軸には日付、Y軸には値を入れたいと考えています。(X軸の日付に対応する値がない場合もあります)
1週間ごとのデータをボタンで切り替えてみれるようにしています。

問題

今、Realmに複数データが保存されている場合のグラフは正しくX軸に日付が入っているのですが、
イメージ説明

このように1週間のデータが少ない場合はX軸の日付が正しく表示されません。
イメージ説明

ChartDataEntryでXの値に、データがある日の日付のみ入れていることが問題なのだと思うのですが、ChartDataEntryではX、Yそれぞれの値を個々に組み込むことができないため(Missing argument for parameter 'x' in callというようにエラーが出てしまいます)、どのようにすればX軸に1日ずつずらした正しい日付を表示できるのかわからず苦戦しています。

該当のソースコード

Swift

1class GraphViewController: UIViewController {2 3 let realm = try! Realm()4 var post: Post!5 var points = try! Realm().objects(Post.self).sorted(byKeyPath: "date", ascending: true)6 7 var page = 08 var maxPage = 09 10 weak var axisFormatDelegate: AxisValueFormatter?11 var dateInterval = 012 13 @IBOutlet weak var lineChartView: LineChartView!14 @IBOutlet weak var laterButton: UIButton!15 @IBOutlet weak var formerButton: UIButton!16 17 override func viewDidLoad() {18 super.viewDidLoad()19 20 axisFormatDelegate = self21 createChartView(page: 0)22 23 var firstPost = points.first?.date 24 var lastPost = points.last?.date 25 //経過日数26 dateInterval = Int(lastPost!.timeIntervalSince(firstPost!)) / (24 * 60 * 60)27 maxPage = dateInterval / 7 - 128 29 if page == maxPage {30 formerButton.isHidden = true31 }32 33 if page == 0{34 laterButton.isHidden = true35 }36 37 }38 @IBAction func LaterButton(_ sender: Any) {39 formerButton.isHidden = false40 page -= 141 if page == 0{42 laterButton.isHidden = true43 createChartView(page: page)44 } else {45 laterButton.isHidden = false46 createChartView(page: page)47 }48 }49 @IBAction func FormerButton(_ sender: Any) {50 laterButton.isHidden = false51 page += 152 if page == maxPage + 1 {53 formerButton.isHidden = true54 createChartView(page: page)55 } else {56 formerButton.isHidden = false57 createChartView(page: page)58 }59 }60 func createChartView(page: Int){61 //Y軸の最大値・最小値62 lineChartView.leftAxis.axisMaximum = 10063 lineChartView.leftAxis.axisMinimum = -5064 //Xラベルと値がずれないように65 lineChartView.xAxis.avoidFirstLastClippingEnabled = false66 67 lineChartView.xAxis.labelCount = 768 //X軸ラベルを強制的に有効化69 lineChartView.xAxis.forceLabelsEnabled = true70 lineChartView.xAxis.granularityEnabled = true71 lineChartView.xAxis.granularity = 172 73 //データセット74 var lineDateEntry = [ChartDataEntry]()75 //realmからとってきた全データ76 let yAxis = getPercentFromDatabase(page: page)77 var yAxisArray = [Double]()78 var xAxisDateArray = [Date]()79 for i in 0..<yAxis.count {80 yAxisArray.append(Double(yAxis[i].percent)!)81 let xAxisDate: TimeInterval = yAxis[i].date.timeIntervalSince1970 82 let dataEntry = ChartDataEntry(x: Double(xAxisDate), y: Double(yAxis[i].percent)!)83 lineDateEntry.append(dataEntry)84 }85 let chartDataSet = LineChartDataSet(lineDateEntry)86 let chartData = LineChartData(dataSet: chartDataSet)87 lineChartView.data = chartData 88 let xAxis = lineChartView.xAxis 89 xAxis.valueFormatter = axisFormatDelegate 90 }91 92 func getPercentFromDatabase(page: Int) -> Results<Post>{93 do {94 let realm = try Realm()95 //1番最近のもの96 var lastDay = realm.objects(Post.self).last?.date 97 //1週間の中で1番古い98 var sixDaysAgo = Calendar.current.date(byAdding: .day, value: -6 + -7 * page, to: lastDay!)99 //1週間の中で1番最近100 var latestDay = Calendar.current.date(byAdding: .day, value: -7 * page, to: lastDay!)101 var predicate = NSPredicate(format: "date >= %@ && date <= %@", sixDaysAgo! as CVarArg, latestDay! as CVarArg)102 return realm.objects(Post.self).filter(predicate)103 } catch let error as NSError {104 fatalError(error.localizedDescription)105 }106 }107 108}109 110//X軸の値を管理111extension GraphViewController: AxisValueFormatter {112 113 func stringForValue(_ value: Double, axis: AxisBase?) -> String {114 let dateFormatter = DateFormatter()115 dateFormatter.dateFormat = "MM/dd"116 return dateFormatter.string(from: Date(timeIntervalSince1970: value))117 }118}

試したこと

こちらを参考にして、AxisValueFormatterを管理しているExtensionの中で日付を定義しようとしたのですが、

Swift

1let realm = try Realm()

と記述すると

Call can throw, but errors cannot be thrown out of a property initializer

とエラーが出てしまい上手く使いこなせませんでした。
https://stackoverflow.com/questions/51333345/ios-charts-library-x-axis-labels-without-backing-data-not-showing

拙い説明ですが、ご教授いただけますと大変ありがたいです。

コメントを投稿

0 コメント