SwiftUI中实现正负值BarMark图表,以零为Y轴中心
解决SwiftUI中BarMark以零为Y轴中心的正负值图表问题
默认BarMark会以Y轴最小值为基线绘制,导致正负值无法以0为中心区分。通过以下修改实现目标效果:
关键修改点
- 用
yStart和yEnd定义柱子的起止点,固定基线为0 - 配置Y轴范围,确保0处于中心位置且覆盖所有正负极值
修改后的完整代码
Chart { ForEach(0..<stack.count, id: \.self) { index in if let xValue = stack[index].x, let yValue = stack[index].yValues?[0].value, let hexaString = stack[index].yValues?[0].color { BarMark( x: .value("x", "\(xValue)"), yStart: .value("base", 0), // 柱子基线固定为0 yEnd: .value("y", yValue) // 柱子顶端/底端对应目标值 ) .foregroundStyle(Color(hex: hexaString)) } } } .chartYScale(domain: { // 自动计算对称的Y轴范围,保证0在中心 let allValues = stack.compactMap { $0.yValues?[0].value } guard let minVal = allValues.min(), let maxVal = allValues.max() else { return -1...1 } let absMax = max(abs(minVal), abs(maxVal)) return -absMax...absMax }()) .chartYAxis { AxisMarks(position: .leading) // 保留Y轴刻度显示 }
说明
yStart设为0后,正值柱子向上延伸,负值柱子向下延伸,自然形成以0为中心的效果chartYScale的定义域计算会自动适配数据中的正负极值,并且让正负范围对称,避免Y轴偏移- 保留了你原有的颜色和X轴数据绑定逻辑
内容的提问来源于stack exchange,提问作者Inder_iOS
相关产品推荐
相关产品推荐

