Swift 图表问题:多个线图的起始和结束y值连接

Swift 图表问题:多个线图的起始和结束y值连接

问题描述

我正在尝试使用Swift实现一个股票图表,其中包括两个图表:一个是股票价格,另一个是价格的预测/估计。我尝试使用以下代码使用两个LineMark的循环来实现。为了测试目的,我使用了相同的数据集,其中一个x值偏移了1个。但是,当我添加第二个LineMark循环时,出现了以下问题,起始和结束y值连接在一起。我该如何解决这个问题?

VStack {

            Chart {
                ForEach(self.entries, id: \.date) { entry in
                    LineMark(
                        x: .value("Date", entry.date),
                        y: .value("Price", entry.closePrice + 1)
                    ).foregroundStyle(.green)

                }
                ForEach(self.entries, id: \.date) { entry in
                    LineMark(
                        x: .value("Date", entry.date),
                        y: .value("Price", entry.closePrice)
                    )
                    .foregroundStyle(.blue)


                    let curGradient = LinearGradient(
                        gradient: Gradient (
                            colors: [
                                .green.opacity(0.5),
                                .green.opacity(0.2),
                                .green.opacity(0.05),
                            ]
                        ),
                        startPoint: .top,
                        endPoint: .bottom
                    )

                    AreaMark(
                        x: .value("Date", entry.date),
                        yStart: .value("Price", round(minY - ((maxY - minY) / 100) * 20)),
                        yEnd: .value("PriceEnd", entry.closePrice)
                    )

                    .interpolationMethod(.cardinal)
                    .foregroundStyle(curGradient)
                    .alignsMarkStylesWithPlotArea()

                }

            }
            .chartLegend(position: .top, alignment: .center)
            .chartYScale(domain: minY - ((maxY - minY) / 100) * 20...maxY + ((maxY - minY) / 100) * 20)
            .chartXAxis
            {
                AxisMarks(values: .stride(by: .day))
                { date in
                    AxisGridLine()
                    AxisValueLabel(format: .dateTime.weekday(.narrow), centered: true)
                }
            }.chartYAxis {
                AxisMarks(position: .leading)
            }

        }.frame(width: 347, height: 161.5)

解决方案

看起来你需要更好地区分在两个 ForEach 循环中指定的数据点。也许,Swift Charts目前认为它们是同一个系列。例如,你可以在调用 LineMark 时明确设置系列,使用 (x:y:series:) 初始化器,或者使用 .foregroundStyle(by:) 修饰符。请参阅 LineMark 文档中的“绘制多条线”部分以获取示例。

话虽如此,我看到你在调用 .foregroundStyle(:) 。在我的Swift Charts之旅中,我还没有尝试使用过这个,所以我不知道你的结果是不是预期的。如果你提供了一个可用的示例,我可以进行验证。将来,请在你的问题中提供一个最小但完全可用的示例。我会从你的代码中删除所有关于AreaMarks、Axes等的代码,并提供一些简单的数据,这样我们就可以直接复制和粘贴你的代码来重现问题。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程