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等的代码,并提供一些简单的数据,这样我们就可以直接复制和粘贴你的代码来重现问题。