Swift Chart多折线图首尾Y值异常连接问题求助
解决Swift Charts中双线条首尾莫名连接的问题
问题根源在于你循环生成单个LineMark的写法:为每个数据点单独创建LineMark时,Chart会把这些零散的Mark判定为同一组数据,错误地将首尾点强制连接。正确的做法是给每条线(或填充区域)仅创建一个Mark,通过data参数传入完整数据集,再统一映射x/y值。
修复后的代码示例
VStack { Chart { // 绿色预测线(X值按需偏移1天) LineMark( x: .value("Date", entries.map { $0.date.addingTimeInterval(86400) }), y: .value("Price", entries.map { $0.closePrice + 1 }) ) .foregroundStyle(.green) .interpolationMethod(.cardinal) // 蓝色价格线 LineMark( x: .value("Date", entries.map { $0.date }), y: .value("Price", entries.map { $0.closePrice }) ) .foregroundStyle(.blue) .interpolationMethod(.cardinal) // 价格线下方的渐变填充区域 let curGradient = LinearGradient( gradient: Gradient( colors: [ .green.opacity(0.5), .green.opacity(0.2), .green.opacity(0.05), ] ), startPoint: .top, endPoint: .bottom ) AreaMark( x: .value("Date", entries.map { $0.date }), yStart: .value("Price", round(minY - ((maxY - minY) / 100) * 20)), yEnd: .value("PriceEnd", entries.map { $0.closePrice }) ) .interpolationMethod(.cardinal) .foregroundStyle(curGradient) .alignsMarkStylesWithPlotArea() } .chartLegend(position: .top, alignment: .center) .chartYScale(domain: minY - ((maxY - minY) / 100) * 20...maxY + ((maxY - minY) / 100) * 20) .chartXAxis { AxisMarks(values: .stride(by: .day)) { date in AxisGridLine() AxisValueLabel(format: .dateTime.weekday(.narrow), centered: true) } } .chartYAxis { AxisMarks(position: .leading) } }.frame(width: 347, height: 161.5)
核心修改说明
- 移除两个
ForEach循环:每个线条/填充区域对应一个Mark,直接传入完整数据集的映射值(通过entries.map处理x/y) - 统一
interpolationMethod:确保所有线条的平滑逻辑一致,避免显示异常 - 预测线X偏移逻辑:在
map中直接处理日期偏移(示例用addingTimeInterval(86400)实现1天偏移)
调整后Chart会正确识别每个Mark对应独立的完整序列,不会出现首尾点错误连接的问题。
内容的提问来源于stack exchange,提问作者bloomsdayforever
相关产品推荐
相关产品推荐

