【问题标题】:Swift Charts: .chartYScale only seems to work with increments of 100?Swift 图表:.chartYScale 似乎只适用于 100 的增量?
【发布时间】:2022-11-07 23:14:42
【问题描述】:

鉴于这是一个心率图表,我正在尝试使图表的 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()
    }
}

【问题讨论】:

  • 它取决于 ScaleType,请参阅该参数的文档,在您的情况下自动是 .linear。
  • @Asperi 谢谢我做了,但不确定什么 ScaleType 会给我我正在寻找的粒度?

标签: ios swift swiftui swiftcharts


【解决方案1】:

也许你只需要这个(Xcode 14b4 / 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

【讨论】:

  • 谢谢这个作品,但有点笨拙,我宁愿图书馆现在决定创建许多 Y 轴标签,但只给它一个最小值和最大值。实际上,我希望 Y 轴成为 data.min 和 data.max。
  • 这可行,但需要一种方法来计算步幅调用中的最大 Y 值(在本例中为 220)。我一直在试图找出一种计算价值的方法。我试图计算该值以插入跨步调用无济于事。我曾希望使用属性初始化程序,但出现“无法在属性初始化程序中使用实例成员 'yVal';属性初始化程序在 'self' 可用之前运行”错误。关于如何做到这一点的任何想法?谢谢
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多