ios 快速图表:.chartYScale似乎仅适用于增量为100?

k5hmc34c  于 2022-12-05  发布在  iOS
关注(0)|答案(3)|浏览(122)

鉴于这是一个心率图表,我试图使图表的Y最大刻度为210(bpm),例如.chartYScale(domain: 0 ... 210),但它似乎只有在我传入200或300时才能正确缩放,任何介于两者之间的内容都不起作用。这是有意的还是一个错误?

import SwiftUI
import Charts
import HealthKit

struct TestYAxisRangeChart: View {
    
    let heartRateData = [80.0, 90.0, 120.0, 150.0, 160.0, 140.0, 125.0, 110.0, 88.0]
    
    var body: some View {
        Chart {
            ForEach(heartRateData, id: \.self) { sample in
                LineMark(
                    x: .value("", heartRateData.firstIndex(of: sample)!),
                    y: .value("HR", sample))
                .foregroundStyle(Color.red)
                
            }

        }
        .chartYAxis{
            AxisMarks(position: .leading)
        }
        .frame(height: 300)
        .padding(.horizontal)
        .chartYScale(domain: 0 ... 210)
    }
    
}

struct TestYAxisRangeChart_Previews: PreviewProvider {
    static var previews: some View {
        TestYAxisRangeChart()
    }
}
ar5n3qh5

ar5n3qh51#

也许你只需要这个(Xcode 14 b4/ iOS 16):

let yValues = stride(from: 0, to: 220, by: 10).map { $0 } // << here !!

var body: some View {
    Chart {
        ForEach(heartRateData, id: \.self) { sample in
            LineMark(
                x: .value("", heartRateData.firstIndex(of: sample)!),
                y: .value("HR", sample))
            .foregroundStyle(Color.red)
            
        }

    }
    .chartYAxis{
        AxisMarks(position: .leading, values: yValues)  // << here !!
    }

Test module on GitHub

az31mfrm

az31mfrm2#

使用范围而不是域,plotDimension将自动使用数据范围,IIRC:

.chartYScale(range: .plotDimension(padding: 20))
ltskdhd1

ltskdhd13#

如果您只想使比例不以0开始,则可以向chartYScale传递不包括0的自动属性域(例如.chartYScale(domain: .automatic(includesZero: false))),但根据您的数据和计算的y跨距,0可能仍然可见。要在不设置显式域或值的情况下包括210,您可以始终在210处绘制一个不可见的点标记。但这会导致一个四舍五入的最大y轴值(例如250-300取决于你的数据)。2使最大值正好为210的唯一方法是通过其他人建议的值或域来完全控制轴。

相关问题