実現したいこと
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 = 0 8 var maxPage = 0 9 10 weak var axisFormatDelegate: AxisValueFormatter? 11 var dateInterval = 0 12 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 = self 21 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 - 1 28 29 if page == maxPage { 30 formerButton.isHidden = true 31 } 32 33 if page == 0{ 34 laterButton.isHidden = true 35 } 36 37 } 38 @IBAction func LaterButton(_ sender: Any) { 39 formerButton.isHidden = false 40 page -= 1 41 if page == 0{ 42 laterButton.isHidden = true 43 createChartView(page: page) 44 } else { 45 laterButton.isHidden = false 46 createChartView(page: page) 47 } 48 } 49 @IBAction func FormerButton(_ sender: Any) { 50 laterButton.isHidden = false 51 page += 1 52 if page == maxPage + 1 { 53 formerButton.isHidden = true 54 createChartView(page: page) 55 } else { 56 formerButton.isHidden = false 57 createChartView(page: page) 58 } 59 } 60 func createChartView(page: Int){ 61 //Y軸の最大値・最小値 62 lineChartView.leftAxis.axisMaximum = 100 63 lineChartView.leftAxis.axisMinimum = -50 64 //Xラベルと値がずれないように 65 lineChartView.xAxis.avoidFirstLastClippingEnabled = false 66 67 lineChartView.xAxis.labelCount = 7 68 //X軸ラベルを強制的に有効化 69 lineChartView.xAxis.forceLabelsEnabled = true 70 lineChartView.xAxis.granularityEnabled = true 71 lineChartView.xAxis.granularity = 1 72 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
拙い説明ですが、ご教授いただけますと大変ありがたいです。

回答1件
あなたの回答
tips
プレビュー