SwiftUI Charts中如何隐藏指定LineMark且不偏移图表?
在SwiftUI Charts中忽略指定值的点并保持图表布局
要实现忽略值为-1的点、同时不偏移图表Y轴的需求,核心思路是预处理数据,排除无效值,让SwiftUI Charts只处理有效数据点,具体有两种实现方式:
方式一:将无效值转为nil(保留原始X轴索引)
这种方式会保留原始数据的索引位置(X轴依然显示0-5),但值为-1的位置不会绘制任何标记,折线在有效点之间正常显示,中间无效点的位置留空。
import SwiftUI import Charts struct ChartView: View { let originalData = [0.5, 0.2, -1, -1, 0.9, 0.7] // 将-1转换为nil,后续只处理非nil值 private let chartData: [Double?] = originalData.map { $0 == -1 ? nil : $0 } var body: some View { Chart(Array(chartData.enumerated()), id: \.offset) { index, value in // 仅绘制非nil的数据点 if let value = value { LineMark( x: .value("索引", index), y: .value("数值", value) ) // 可选:添加点标记 PointMark( x: .value("索引", index), y: .value("数值", value) ) } } // 固定Y轴范围为0-1,避免图表自动偏移 .chartYScale(domain: 0...1) .padding() } }
方式二:过滤无效数据(折线跨无效点连接)
如果你希望折线直接跳过无效点,从最后一个有效点连接到下一个有效点(比如从索引1的0.2直接连到索引4的0.9),可以直接过滤掉值为-1的条目:
import SwiftUI import Charts struct ChartView: View { let originalData = [0.5, 0.2, -1, -1, 0.9, 0.7] // 过滤掉值为-1的条目,保留原始索引 private let validData = originalData.enumerated().filter { $0.element != -1 } var body: some View { Chart(validData, id: \.offset) { entry in LineMark( x: .value("索引", entry.offset), y: .value("数值", entry.element) ) PointMark( x: .value("索引", entry.offset), y: .value("数值", entry.element) ) } .chartYScale(domain: 0...1) .padding() } }
关键说明
- 两种方式都能避免-1值影响Y轴范围,因为无效数据不会参与图表的范围计算
- 手动设置
chartYScale(domain: 0...1)可以强制固定Y轴区间,确保图表布局符合预期 - SwiftUI Charts会自动忽略nil值或被过滤掉的条目,不会在对应位置绘制标记
内容的提问来源于stack exchange,提问作者Oscar Berggren
相关产品推荐
相关产品推荐

