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!
This question is answered by an engineer from the Swift Charts team in the following forums post:
Handling of dates with no value when creating a date bar chart in Charts