Post

Replies

Boosts

Views

Created

Charts - Exclude dates on x-axis
Hi! I'm building an app that uses Swift Charts to visualize stock market data, and I'm encountering a couple of issues. The stock API I’m using provides data only for the trading days when the market is open. The problem is that I need to skip over the missing dates (non-trading days) in the chart, but still keep the x-axis formatted correctly (e.g., group ticks by month). If I convert the dates to String to handle missing data, I lose the correct x-axis formatting, and the date labels become inaccurate among with its data. Here’s som of the code I’m using for parsing the dates and structuring the data: struct StockDataPoint: Identifiable, Decodable { var id: String { datetime } let datetime: String let close: String var date: Date { datetime.toDate() ?? Date() } var closePrice: Double { Double(close) ?? 0.0 } } extension String { func toDate() -> Date? { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(abbreviation: "UTC") formatter.dateFormat = self.count == 10 ? "yyyy-MM-dd" : "yyyy-MM-dd HH:mm:ss" return formatter.date(from: self) } } And: LineMark( x: .value("Datum", point.date), y: .value("Pris", point.closePrice) ) .interpolationMethod(.cardinal) .lineStyle(StrokeStyle(lineWidth: 0.7)) .foregroundStyle(.linearGradient(colors: [.blue, .yellow, .orange], startPoint: .bottomTrailing, endPoint: .topLeading)) .frame(height: 300) .background(Color.black.opacity(0.6)) .chartYScale( domain: ( (stockAPI.stockData.map { $0.closePrice }.min() ?? 0) * 0.98 ... (stockAPI.stockData.map { $0.closePrice }.max() ?? 100) * 1.02 ) ) .chartXAxis { AxisMarks(values: .automatic(desiredCount: 5)) { value in AxisGridLine().foregroundStyle(Color.gray.opacity(0.5)) AxisTick().foregroundStyle(Color.gray) AxisValueLabel().foregroundStyle(Color.gray) } } .chartYAxis { AxisMarks(values: .automatic(desiredCount: 5)) { value in AxisGridLine().foregroundStyle(Color.gray.opacity(0.5)) AxisTick().foregroundStyle(Color.gray) AxisValueLabel().foregroundStyle(Color.gray) } } What I need help with: Skipping missing dates on the x-axis and show correct data for corresponding days. Keeping the x-axis well formatted (grouped by month, accurate labels). Thanks in advance for any suggestions!
2
0
174
Apr ’25
Charts - Exclude dates on x-axis
Hi! I'm building an app that uses Swift Charts to visualize stock market data, and I'm encountering a couple of issues. The stock API I’m using provides data only for the trading days when the market is open. The problem is that I need to skip over the missing dates (non-trading days) in the chart, but still keep the x-axis formatted correctly (e.g., group ticks by month). If I convert the dates to String to handle missing data, I lose the correct x-axis formatting, and the date labels become inaccurate among with its data. Here’s som of the code I’m using for parsing the dates and structuring the data: struct StockDataPoint: Identifiable, Decodable { var id: String { datetime } let datetime: String let close: String var date: Date { datetime.toDate() ?? Date() } var closePrice: Double { Double(close) ?? 0.0 } } extension String { func toDate() -> Date? { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(abbreviation: "UTC") formatter.dateFormat = self.count == 10 ? "yyyy-MM-dd" : "yyyy-MM-dd HH:mm:ss" return formatter.date(from: self) } } And: LineMark( x: .value("Datum", point.date), y: .value("Pris", point.closePrice) ) .interpolationMethod(.cardinal) .lineStyle(StrokeStyle(lineWidth: 0.7)) .foregroundStyle(.linearGradient(colors: [.blue, .yellow, .orange], startPoint: .bottomTrailing, endPoint: .topLeading)) .frame(height: 300) .background(Color.black.opacity(0.6)) .chartYScale( domain: ( (stockAPI.stockData.map { $0.closePrice }.min() ?? 0) * 0.98 ... (stockAPI.stockData.map { $0.closePrice }.max() ?? 100) * 1.02 ) ) .chartXAxis { AxisMarks(values: .automatic(desiredCount: 5)) { value in AxisGridLine().foregroundStyle(Color.gray.opacity(0.5)) AxisTick().foregroundStyle(Color.gray) AxisValueLabel().foregroundStyle(Color.gray) } } .chartYAxis { AxisMarks(values: .automatic(desiredCount: 5)) { value in AxisGridLine().foregroundStyle(Color.gray.opacity(0.5)) AxisTick().foregroundStyle(Color.gray) AxisValueLabel().foregroundStyle(Color.gray) } } What I need help with: Skipping missing dates on the x-axis and show correct data for corresponding days. Keeping the x-axis well formatted (grouped by month, accurate labels). Thanks in advance for any suggestions!
Replies
2
Boosts
0
Views
174
Activity
Apr ’25