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

Swift Bar Mark图表自定义轴范围时视图溢出问题求助

问题原因

使用chartYScale(domain:)自定义Y轴范围后,BarMark默认会从0值开始绘制条形,而非你设置的Y轴最小值(比如示例里的minWeight -5)。当0不在自定义的Y轴范围内时,条形的起始端会超出图表视图的可视区域,造成溢出的视觉效果。

解决方案

放弃直接使用y:参数,改用yStart:和yEnd:明确指定条形的起始与结束值,将起始值设为自定义Y轴的最小值,结束值设为体重测量值。

步骤1:优化范围计算函数(可选)

把原来返回数组的WeightRange()改成返回ClosedRange<Double>,使用起来更直观:

func weightRange() -> ClosedRange<Double> {
    guard !weights.isEmpty else { return 0...100 }
    let maxWeight = weights.map(\.measurement).max()!
    let minWeight = weights.map(\.measurement).min()!
    return (minWeight - 5)...(maxWeight + 5)
}

步骤2:修改BarMark的参数

调整Chart中的BarMark,用yStart和yEnd替代y:

struct Main: View {
    // 提前计算Y轴范围,避免重复计算
    let yRange = weightRange()
    
    var body: some View {
        Chart(weights) { weight in
            BarMark(
                x: .value("Date", weight.date, unit: .day),
                yStart: .value("Y轴最小值", yRange.lowerBound),
                yEnd: .value("体重", weight.measurement)
            )
        }
        .chartYScale(domain: yRange)
        .chartXScale(domain: [Date().addingTimeInterval(-3600*25*7*4), Date()])
        .padding(.horizontal, 40)
        .padding(.top, 10)
        .padding(.bottom, 20)
        .frame(height: 200)
    }
}
原理说明

yStart和yEnd明确定义了条形的上下边界,让BarMark从你自定义的Y轴最小值开始绘制,到数据值结束,这样条形就会完全落在图表的可视范围内,不会再出现溢出问题。

内容的提问来源于stack exchange,提问作者Andrew97p

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:44:53