代码之家  ›  专栏  ›  技术社区  ›  user20325868

我正在尝试理解swiftUI图表API,特别是覆盖图表并修改图表的某些方面

  •  0
  • user20325868  · 技术社区  · 6 月前

    我刚开始在swiftui中使用Charts,我很挣扎。我想用折线图覆盖下图中的条形图。但我唯一能弄清楚的方法是嵌入ZStack,但如屏幕截图所示,两个图表(目前传递的数据相同)不对齐。我想展示一条覆盖条形图的平均线,但我就是想不出来。我对图表不太了解,我也是API的新手。我还想在酒吧或酒吧上方或其他地方显示实际金额。尚不确定在swiftui中是否可以实现这些功能。如果没有别的,你能给我指一些关于图表的好文件或其他信息吗?谢谢

    enter image description here

    这是我的代码的简化

            ZStack {
            Chart {
                ForEach(payments, id: \.date) { payment in
    
                    BarMark(
                        x: .value("Date", payment.date),
                        y: .value("Amount", payment.amount)
                    )
                }
            }
    
            Chart {
    
                ForEach(payments, id: \.date) { payment in
                    LineMark(
                        x: .value("Date", payment.date),
                        y: .value("Amount", payment.amount)
                    )
                }
            }
        }
    
    1 回复  |  直到 6 月前
        1
  •  1
  •   workingdog support Ukraine    6 月前

    在以下情况下尝试这种方法 你用一个 Chart 有两个 ForEach 例如:

     Chart {
         ForEach(payments, id: \.date) { payment in
             BarMark(
                 x: .value("Date", payment.date, unit: .day), // <-- adjust as required
                 y: .value("Amount", payment.amount)
             )
         }
    
         ForEach(payments, id: \.0) { payment in
             LineMark(
                 x: .value("Date", payment.date, unit: .day), // <-- adjust as required
                 y: .value("Amount", payment.amount)
             )
         }
     }
    

    这是我的完整测试代码,显示了如何 BarMark 在一起 与 LineMark 在顶部。

    struct ChartData: Identifiable {
        let id = UUID()
        let value: Double
        let date: Date
    }
    
    struct ContentView: View {
        
        let chartData: [ChartData] = (0..<10).map { index in
            ChartData(value: Double.random(in: 1...10) ,
                      date: Date().addingTimeInterval(Double(index) * 60 * 60 * 24) )
        }
    
        var body: some View {
            Chart {
                ForEach(chartData) { data in
                    BarMark(
                        x: .value("Date", data.date, unit: .day),
                        y: .value("Value", data.value)
                    )
                    .foregroundStyle(Color.blue)
                }
                ForEach(chartData) { data in
                    LineMark(
                        x: .value("Date", data.date, unit: .day),
                        y: .value("Value", data.value)
                    )
                    .foregroundStyle(Color.red)
                }
            }
            .chartLegend(.hidden)
            .chartXAxis(.hidden)
            .chartYAxis(.hidden)
        }
    }