You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:21:05