From 364873ce26015b876194b8b15cc509100d81401d Mon Sep 17 00:00:00 2001 From: Shayokh144 Date: Mon, 19 Aug 2024 23:33:35 +0700 Subject: [PATCH] Remove unused code, update line chart --- .../Extension/DateFormatter+Extension.swift | 7 ++ .../Graph/LineChart/LineChartScreen.swift | 82 ++++--------------- .../Graph/LineChart/LineChartViewModel.swift | 23 ++++++ 3 files changed, 47 insertions(+), 65 deletions(-) diff --git a/visualization/app/VisualReport/VisualReport/Extension/DateFormatter+Extension.swift b/visualization/app/VisualReport/VisualReport/Extension/DateFormatter+Extension.swift index 879beea9..10be5fc9 100644 --- a/visualization/app/VisualReport/VisualReport/Extension/DateFormatter+Extension.swift +++ b/visualization/app/VisualReport/VisualReport/Extension/DateFormatter+Extension.swift @@ -29,4 +29,11 @@ extension DateFormatter { dateFormatter.dateFormat = "yyyy-MM" return dateFormatter }() + + public static let monthYearShort: DateFormatter = { + let dateFormatter = DateFormatter() + dateFormatter.calendar = Calendar(identifier: .gregorian) + dateFormatter.dateFormat = "yy-MM" + return dateFormatter + }() } diff --git a/visualization/app/VisualReport/VisualReport/Graph/LineChart/LineChartScreen.swift b/visualization/app/VisualReport/VisualReport/Graph/LineChart/LineChartScreen.swift index 3449f3e4..b532f98f 100644 --- a/visualization/app/VisualReport/VisualReport/Graph/LineChart/LineChartScreen.swift +++ b/visualization/app/VisualReport/VisualReport/Graph/LineChart/LineChartScreen.swift @@ -9,7 +9,6 @@ import Charts import SwiftUI struct LineChartScreen: View { - @StateObject private var viewModel: LineChartViewModel @ViewBuilder private var chartView: some View { @@ -23,6 +22,8 @@ struct LineChartScreen: View { .foregroundStyle(by: .value("Chart type", dataSeries.type)) ForEach($dataSeries.ruleMarkDataList) { $data in RuleMark(y: .value(data.yName, data.yValue)) + .foregroundStyle(Color.orange) + .lineStyle(StrokeStyle(lineWidth: 1)) .annotation(position: .bottom, alignment: .bottomLeading) { Text("\(data.ruleMarkName): \(data.yValue.fractionTwoDigitString)") @@ -30,10 +31,24 @@ struct LineChartScreen: View { } } } + .chartYAxis{ + AxisMarks(position: .leading, values: viewModel.chartYAxisValues) + } + .chartXAxis{ + AxisMarks(position: .bottom, values: viewModel.chartXAxisValues) { value in + AxisGridLine() + AxisTick() + AxisValueLabel() { + if let date = value.as(Date.self) { + Text(DateFormatter.monthYearShort.string(from: date)) + } + } + } + } .chartXScale( domain: firstDate...lastDate ) - .aspectRatio(1, contentMode: .fit) + .frame(maxWidth: .infinity, maxHeight: .infinity) } } @@ -75,66 +90,3 @@ struct LineChartScreen: View { _viewModel = StateObject(wrappedValue: viewModel) } } - -//struct LineChartScreen: View { -// -// var newData = [PetDataModel]() -// -// var data: [PetDataSeries] { -// [PetDataSeries(type: "ABC", petData: newData)] -// } -// -// let firstDate: Date -// let lastDate: Date -// var body: some View { -// Chart(data, id: \.type) { dataSeries in -// ForEach(dataSeries.petData) { data in -// LineMark(x: .value("Year", data.year, unit: .day), -// y: .value("Population", data.population)) -// } -// .foregroundStyle(by: .value("Pet type", dataSeries.type)) -// .symbol(by: .value("Pet type", dataSeries.type)) -// RuleMark(y: .value("Average 1", 1.5)) -// .annotation(position: .bottom, -// alignment: .bottomLeading) { -// Text("average 1.5") -// .foregroundColor(.orange) -// } -// RuleMark(y: .value("Average 2", 2.5)) -// .annotation(position: .bottom, -// alignment: .bottomLeading) { -// Text("average 2.5") -// .foregroundColor(.orange) -// } -// } -// .chartXScale(domain: firstDate...lastDate) -// .aspectRatio(1, contentMode: .fit) -// .padding() -// } -// -// init() { -// for i in 0 ..< 10 { -// let date = Calendar.current.date(byAdding: .day, value: i, to: .now) ?? .now -// let rep = Double.random(in: 10...100) -// newData.append( -// .init(year: date, population: rep) -// ) -// } -// firstDate = newData[0].year -// lastDate = newData[9].year -// } -//} -// -//struct PetDataSeries: Identifiable { -// let type: String -// let petData: [PetDataModel] -// var id: String { type } -//} -// -// -//struct PetDataModel: Identifiable { -// -// let id = UUID() -// let year: Date -// let population: Double -//} diff --git a/visualization/app/VisualReport/VisualReport/Graph/LineChart/LineChartViewModel.swift b/visualization/app/VisualReport/VisualReport/Graph/LineChart/LineChartViewModel.swift index ad90ae2c..6f611e93 100644 --- a/visualization/app/VisualReport/VisualReport/Graph/LineChart/LineChartViewModel.swift +++ b/visualization/app/VisualReport/VisualReport/Graph/LineChart/LineChartViewModel.swift @@ -12,6 +12,8 @@ final class LineChartViewModel: ObservableObject { @Published var uiModels: [LineChartDataSeries] @Published var uiFirstDate: Date? @Published var uiLastDate: Date? + @Published var chartYAxisValues: [Int] = [] + @Published var chartXAxisValues: [Date] = [] let viewModelData: LineChartViewModelData init(lineChartViewModelData: LineChartViewModelData) { @@ -40,6 +42,27 @@ final class LineChartViewModel: ObservableObject { ruleMarkDataList: ruleMarks ) uiModels = [uiModel] + + // Chart Data + let maxValue = Int(viewModelData.lineChartDataList.map { $0.yValue }.max() ?? 0.0) + 20 + var minValue = Int(viewModelData.lineChartDataList.map { $0.yValue }.min() ?? 0.0) - 20 + if minValue < 0 { + minValue = 0 + } + chartYAxisValues = stride(from: minValue, to: maxValue, by: 20).map { $0 } + + chartXAxisValues.removeAll() + var currentDate = firstDate + let calendar = Calendar.current + let dayInterval = Int(viewModelData.lineChartDataList.count / 10) + while currentDate <= lastDate { + chartXAxisValues.append(currentDate) + if let nextDate = calendar.date(byAdding: .day, value: dayInterval, to: currentDate) { + currentDate = nextDate + } else { + break + } + } } private func getRuleMarkList(